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

Share
This entry was tagged , , , , , . Bookmark the permalink.

One Response to WindowBuilder: databinding avanzato con CDO

  1. Mark Rowe says:

    Vincenzo, thank you for a really excellent tutorial that is complete and simple enough for a beginner like myself to follow.

    I would like to ask if it is possible to extend this tutorial by including a “Country” EObject. Each author would have exactly one country object associated with them and this would be shown in the third column in the table. In the detail section the country should be shown in a combobox. I have tried to extend the tutorial in this way myself but I am not able to bind the “Name” attribute of the Country EObject to a tableviewer column (the closest I got was binding the object itself).

    Another really useful further tutorial would be similar, but when an author is selected a list of books written by them is shown in the detail area.

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *