WindowBuilder: installazione ed EMF databinding

Nel tutorial Eclipse EMF: un CRUD immediato per database abbiamo visto come, partendo da un modello EMF, sia possibile generare automaticamente un’applicazione in grado di gestire il modello su database.
Il vantaggio di un tale approccio è notevole: non richiede scrittura di codice, a meno di una manciata di righe di codice di inizializzazione. Lo svantaggio è determinato dal fatto che l’applicazione ottenuta ha un aspetto che potrebbe risultare troppo “generico” per un prodotto software. E’ quindi adatto per testare la validità del modello o per un prototipo iniziale, oppure per una manutenzione semplice dei dati del modello, ma poco si presta per lo sviluppo di applicazioni da distribuire.

Se invece decidiamo di scrivere codice per creare la nostra applicazione, allora EMF e WindowBuilder possono essere dalla nostra parte consentendoci di essere particolarmente produttivi.
Per l’installazione di WindowBuilder trovate qui le istruzioni dettagliate.

L’obiettivo che ci poniamo è quello di realizzare un’Applicazione che mostri una finestra (View) con una tabella contenente una lista di elementi del nostro modello applicativo.

L’applicazione da cui partiremo è quella ottenuta nel precedente tutorial: CDO – Connected Data Objects.

Ora il nostro scopo è quello di avere una voce di menu che ci permetta di aprire una View con l’elenco degli Author.

Per fare questo dobbiamo innanzitutto creare una View destinata a questo scopo.
Apriamo quindi il tab Extensions del file plugin.xml.

e aggiungiamo l’Extension necessaria a gestire le View premendo il bottone Add…

e inserendo il testo “view” per filtrare i contenuti disponibili

Selezioniamo l’elemento org.eclipse.ui.views e premiamo Finish

Ora selezioniamo l’extension appena aggiunta ed eseguiamo tasto destro New -> view

diamo un id alla View, un name, un nome alla classe e selezioniamo l’hyperlink class

e alla popup New Java Class confermiamo con Finish.
Otterremo una classe per la View priva di elementi grafici

Passiamo ora a creare la voce di menu. Aggiungiamo quindi l’extension (col tasto Add…) org.eclipse.ui.menus

e all’interno di essa aggiungiamo un menuContribution

nel campo locationURI mettiamo menu:org.eclipse.ui.main.menu

all’interno di menuContribution creiamo un command

premiamo il tasto Browse… accanto al campo commandId e inseriamo *showView per filtrare fra tutti i command disponibili

e selezioniamo il command org.eclipse.ui.views.showView; poi diamo un valore alla Label di tale command, che comparirà nel menu

a questo punto dobbiamo aggiungere un parametro al command

il parametro richiesto è l’id della View che il command selezionato aprirà; quindi dovremo impostare l’id (possiamo farci aiutare dal tasto Browse…) org.eclipse.ui.views.showView.viewId nel campo name e l’id della View nel campo value

A questo punto siamo quasi pronti per lanciare l’applicazione, ma facciamo prima una piccola modifica nella classe Perspective, aggiungendo la seguente linea di codice

questo perchè non stiamo usando degli Editor, ma solamente delle View

Lanciando l’applicazione dovremmo vedere la voce di menu Open View Authors che, una volta selezionata, fa apparire la View Authors, ovviamente vuota

Finalmente possiamo iniziare a lavorare con WindowBuilder; selezioniamo infatti la classe ListAuthorViewPart ed eseguiamo tasto destro, Open with -> WindowBuilder Editor

selezioniamo il tab Design

ed ecco apparire l’editor visuale

 

Il nostro scopo è ora quello di mettere su questa View una tabella, anzi un TableViewer per l’esattezza, che troviamo sulla Palette nella sezione JFace. Facciamo un click su di esso

e poi un click sulla View

avremo così il seguente risultato

posizioniamo poi due colonne nella tablella, facendo click sull’oggetto TableViewerColumn della Palette e posizionandolo sulla TableViewer; notate che al momento del drop ci verrà chiesto un nome per la colonna: inseriamo Name. Inseriamo anche una seconda colonna col nome Surname.

Prima di procedere con il Databinding dobbiamo caricare i dati, memorizzati attraverso il test JUnit che abbiamo lanciato al tutorial precedente (CDO – Connected Data Objects). Per fare questo dobbiamo andare nel codice della View (tab Source)

e aggiungere le linee di codice di seguito demarcate

 

package it.rcpvision.rcptutorial.application;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.swt.widgets.Table;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.jface.viewers.TableViewerColumn;

//*******************************************************
import library.Library;
import org.eclipse.emf.cdo.net4j.CDOSession;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.cdo.eresource.CDOResource;
import java.io.IOException;
//*******************************************************

public class ListAuthorViewPart extends ViewPart {
	private Table table;

	//*******************************************************
	private Library library; //The library instance
	private CDOSession cdoSession; //The CDO session
	//*******************************************************

	public ListAuthorViewPart() {
	}

	@Override
	public void createPartControl(Composite parent) {

		//*******************************************************
		//Open CDO session and view
		cdoSession = TestCdoClient.openSession("demo");
		CDOView view = cdoSession.openView();
		CDOResource resource = view.getResource("/myResource");
		try {
			//Load resource library
			resource.load(null);
			library = (Library) resource.getContents().get(0);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//*******************************************************

		TableViewer tableViewer = new TableViewer(parent, SWT.BORDER
				| SWT.FULL_SELECTION);
		table = tableViewer.getTable();

		TableViewerColumn tableViewerColumn = new TableViewerColumn(
				tableViewer, SWT.NONE);
		TableColumn tblclmnName = tableViewerColumn.getColumn();
		tblclmnName.setWidth(100);
		tblclmnName.setText("Name");

		TableViewerColumn tableViewerColumn_1 = new TableViewerColumn(
				tableViewer, SWT.NONE);
		TableColumn tblclmnSurname = tableViewerColumn_1.getColumn();
		tblclmnSurname.setWidth(100);
		tblclmnSurname.setText("Surname");
		// TODO Auto-generated method stub

	}

	@Override
	public void setFocus() {
		// TODO Auto-generated method stub

	}

}

Siamo finalmente pronti per effettuare il Databinding. Torniamo al tab Design, selezioniamo l’oggetto tableViewer, tasto destro -> Bindings -> input

minime