Ordeal’s Movie Manager RCP(Part2)

Vediamo come affrontare il problema delle “Viste”.
Secondo l’articolo di Eclipse Corner
In the Eclipse Platform a view is typically used to navigate a hierarchy of information, open an editor, or display properties for the active editor”.
Nel nostro caso ci serve per implementare una struttura a tab, un tab folder, che ci offrirà un tab per la ricerca dei titoli, un altro tab per il loro inserimento e cancellazione.
Per creare la vista dobbiamo usare il file plugin.xml, andare su extensions ed aggiungere un’estensione all’RCP, ovvero un set di plug-ins che estendono la funzionalità dell’applicativo, nel nostro caso org.eclipse.ui.views.
Aggiungete una vista, datele un nome, un id,nel caso mio myMovieManager.view1, e opzionalmente un’icona, cosa importante, ricordatevi di associargli la classe da generare attraverso il form *class, che conterrà tutte le componenti grafiche in essa contenute.
Una volta fatto ciò dovete mettere mano alla classe Perspective.

	layout.setEditorAreaVisible(false);
		layout.addStandaloneView(FilmListView.ID,false, IPageLayout.TOP, 0.90f, layout.getEditorArea());
		layout.addShowViewShortcut(FilmListView.ID);
		IViewLayout filmlist_layout = layout.getViewLayout(FilmListView.ID);
		filmlist_layout.setCloseable(false);
		filmlist_layout.setMoveable(false);

il metodo per aggiungere la vista è addStandaloneView, gli altri servono solo per sistemare il layout e le proprietà della vista.
La nostra vista servirà per contenere un oggetto di tipo Tab folder.

	@Override
	public void createPartControl(Composite parentWindow) {

		tabFolder = new TabFolder(parentWindow, SWT.BORDER);
		TabItem sbttabItem = new TabItem(tabFolder, SWT.NONE);
	      sbttabItem.setText("Search By Title ");
	      sbttabItem.setImage(new Image(parentWindow.getDisplay(), this.getClass().getResourceAsStream("/icons/search_16x16.png")));
	    sbttabItem.setControl(searchByTitleContent(tabFolder));

			      TabItem inmtabItem = new TabItem(tabFolder, SWT.NULL);
			      inmtabItem.setText("Insert/Delete Movie ");
			      inmtabItem.setControl(insertDeleteMovie(tabFolder));
			      inmtabItem.setImage(new Image(parentWindow.getDisplay(), this.getClass().getResourceAsStream("/icons/insert_16x16.gif")));

	}

Il codice in questione è appartenente al metodo createPartControl della vista contenuta nel sorgente FilmListView.java, appartenente al package dell’RCP.
Potete usare tale metodo in ogni vista per “piazzare” i widgets SWT che intendete disporre nella vista.
Nel nostro caso un TabFolder, e due TabItem comprensivi di immagine in esso contenuti.
Il mio consiglio è quello di usare questo sito assiduamente come un vero e proprio catalogo delle componenti grafiche SWT, da poter piazzare come e dove vi pare.
le due chiamate

sbttabItem.setControl(searchByTitleContent(tabFolder));

e

inmtabItem.setControl(insertDeleteMovie(tabFolder));

permettono di creare con le funzioni searchByTitleContent(tabFolder) e insertDeleteMovie(tabFolder) , tutto il contenuto di un TabItem, in modo custom.

All’interno di tali funzioni il procedimento è questo:

public Control searchByTitleContent(TabFolder tabFolder)
	{
	    Composite composite = new Composite(tabFolder, SWT.NONE);
	    composite.setLayout(new GridLayout(6,true));
	    // Create the TableTree and set some attributes on the underlying table
	    table = new Table(composite, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL );
                 ...
                 return composite;

In pratica instanziamo un oggetto Composite,lo aggreghiamo con componenti grafiche di ciascun tipo (nell’esempio table), e alla fine lo ritorniamo alla funzione chiamante.

Oltre all’ogetto table, con tutte le colonne che nel package allegato potete vedere come sono implementate, il tabItem contenuto nella nostra vista, contiene anche un semplice InputDialog

// Create a label to display what the user typed in
			    final Label label = new Label(composite, SWT.NONE);
			    label.setLayoutData(data=new GridData(GridData.FILL_HORIZONTAL));
			    data.horizontalSpan=6;
			    Button show = new Button(composite, SWT.PUSH);
			    final Label dialog_content=new Label(composite,SWT.NONE);
			    dialog_content.setVisible(false);

			    label.setText("Nessun titolo ancora cercato");
			    dialog_content.setText("Inserisci il titolo da cercare");

			    show.setText("Enter Title");
			    show.addSelectionListener(new SelectionAdapter() {
			      public void widgetSelected(SelectionEvent event) {
			        InputDialog dlg = new InputDialog(Display.getCurrent().getActiveShell(),
			            "", "Inserire il titolo o una parola in esso contenuta", dialog_content.getText(), new LengthValidator());
			        if (dlg.open() == Window.OK) {
			          // User clicked OK; update the label with the input
			          label.setText("Risultati per : " + dlg.getValue());
			          label.pack();
			          dialog_content.setText(dlg.getValue());

			        try {
						result=Connector.giveResponse(fix(dlg.getValue()));
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
			          if(result!= null)
			          {
			        	FilmListView.printResult(result, Display.getCurrent());
			          }

			        }
			      }
			    });

Il dialog è dlg, avviato quando viene premuto il pulsante show, attraverso il metodo addSelectionListener.
Quando tale dialog raccoglie il testo, tale testo viene passato al metodo statico

result=Connector.giveResponse(fix(dlg.getValue()));

che esamineremo prossimamente, il metodo fix invece, sostituisce l’apice ‘ con ` (apice inverso), per evitare di passare una variabile dati con un apice ad una query sql,sappiamo che l’apice infatti chiude la query.

Prossimamente vedremo il metodo
FilmListView.printResult(result, Display.getCurrent()); utilizzato da un thread secondario per la stampa asincrona dei risultati sulla tabella.

—-
Link ai binari/sorgenti
Win32 e per GNU/Linux@x86.

Vi ricordo che i sorgenti si trovano sotto la directory plugins,all’interno del MyMovieManager_1.0.0.jar, dentro la directory src.

Lascia un commento