WindowBuilder: databinding avanzato con CDO

Vedremo ora come, partendo dal precedente tutorial, sia possibile aggiungere la gestione della modifica dei dati visualizzati nella tabella.

Torniamo al tab Design e impostiamo un Layout di tipo GridLayout, selezionandolo sulla palette e attribuendolo al composite principale

selezioniamo ora un Composite e posizioniamolo sulla View

facciamo in modo che entrambi i composite occupino lo spazio disponibile, applicando ad entrambi i seguenti attributi di layout

 

attribuiamo un GridLayout al composite

poi posizioniamo una Label col testo “Name

ed una immediatamente sotto col testo “Surname

ora facciamo lo stesso con due campi di testo

e aggiungiamo un bottone Save

l’intenzione è quella di effettuare un binding di tali campi con i corrispondenti attributi dell’elemento selezionato sulla tabella posta sopra. Per fare ciò abbiamo bisogno di definire una variabile di tipo WritableValue

con cui fare appunto il binding (che andrà eseguito su entrambi i campi)


Ora occorre gestire l’azione da eseguire sulla selezione di un elemento sul viewer

e nel sorgente inseriamo il codice seguente

...
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.emf.cdo.util.CommitException;

...
protected CDOTransaction transaction;
...

        	public void selectionChanged(SelectionChangedEvent event) {
        		if (transaction!=null) {
					transaction.rollback();
				}
				transaction = cdoSession.openTransaction();
				Author authorSelected = (Author) ((StructuredSelection) event.getSelection()).getFirstElement();
				Author authorTransactionalObject = (Author) transaction.getObject(authorSelected);
				author.setValue( authorTransactionalObject );
        	}

In pratica stiamo dicendo che ad ogni selezione apriremo una nuova transazione CDO ed effettueremo il binding con l’elemento transazionale selezionato.

Per quanto riguarda il salvataggio effettuiamo le operazioni seguenti. Selezioniamo il button Save e aggiungiamo ad esso un evento

e nel sorgente inseriamo il codice seguente

 

...
import org.eclipse.emf.cdo.util.CommitException;		
...
		public void widgetSelected(SelectionEvent e) {
        		try {
				transaction.commit();
			} catch (CommitException e1) {
				e1.printStackTrace();
			}
		}

 

 

Se ora lanciamo l’applicazione possiamo verificare che:

  • i campi Name e Surname vengono automaticamente valorizzati in base all’elemento selezionato sul viewer
  • premendo il bottone Save i dati verranno memorizzati, sincronizzando anche il viewer automaticamente

 

Inoltre, una delle cose che possiamo ottenere grazie CDO è la seguente.
Con questa semplice riga di codice

possiamo ottenere che i vari client verranno notificati delle modifiche effettuate da uno di essi; provate infatti a lanciare più istanze della stessa applicazione …

 

Torna all’indice