Britney Spears

25 Ottobre 2008

Non so chi ha realizzato questa cosa, ma lo ringrazio di vero cuore.


Ordeal’s Movie Manager RCP(Part2)

9 Ottobre 2008

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.


Ordeal’s Movie Manager RCP(Part1)

7 Ottobre 2008

Per farmi perdonare la lunga assenza da questo blog, ho deciso di implementare e commentare qui un esempio di RCP, ovvero  una Rich Client Platform, un tipo di applicativo sviluppato in Java che fa uso di un set minimale di plug-ins Eclipse.

Innanzitutto dovete avere installato l’IDE Eclipse, che trovate qui.
Una volta installato l’IDE, procedete alla creazione del progetto da File->New->Project->Plug-in Project, cliccando su “Yes” alla domanda “Would you like to create a rich client application ?”.
A questo punto dovete selezionare un template, possibilmente minimale, da cui partire, come Hello RCP.
Quello che a questo punto vi si presenta tra i sorgenti è:

  • La classe Activator, che controlla il ciclo di vita del plug-in (in particolare date un’occhiata ai metodi start() e stop()
  • La classe Application, che sostanzialmente ha due metodi start() e stop(), che riguardano l’istanziazione dell’oggetto Display (un’interfaccia al dispositivo vero e proprio) , e del Workbench, ovvero di quel set di plug-ins che l’applicazione si “porta dietro”, che sono in buona parte un sottoinsieme dei plug-ins che troviamo anche nell’IDE Eclipse.
  • Le classi ApplicationActionBarAdvisor, ApplicationWorkbenchAdvisor, ApplicationWorkbenchWindowAdvisor, necessarie alla creazione della finestra principale, della Prospettiva su cui le nostre Viste andranno situate, delle barre, e all’esecuzione precedente alla creazione della finestra di metodi che devono essere eseguiti allo start-up dell’applicazione.
  • La classe Perspective, in cui viene deciso il layout delle cosidette “Viste” che stiamo per creare.

Adesso parliamo del target dell’applicazione.
L’idea nasce dalla necessità di creare un’interfaccia semplice e custom ad una relazione di un Database, utilizzata per catalogare dei titoli di films.
I campi di questa tabella sono:


create table omm_movies (
  Titolo character(100) not null default 'Titolo',
  Anno numeric(4) not null default '2007',
  NumDVD numeric(4) ,
  DivX boolean,
  GiaVisto boolean,
  Regista char(150) default null,
  MOVIE_ID numeric ,
  primary key(MOVIE_ID)
);

In particolare il campo NumDVD specifica in quale DVD del vostro scaffale/cassetto è collocato il film, il campo MOVIE_ID invece è un ID incrementale associato ad una sequenza che vedremo creata nel codice stesso.
Le funzionalità da implementare sono: ricerca per titolo, inserimento del titolo e cancellazione.
Vedremo nella prossima puntata come implementare la pagina relativa alla ricerca per titolo.

Intanto vi linko da subito eseguibili e sorgenti per Win32 e per GNU/Linux@x86.