Una visualizzazione è una parte del workbench che può esplorare una gerarchia di informazioni o visualizzare le proprietà di un oggetto. Le visualizzazioni spesso vengono fornite a supporto di un editor corrispondente. Ad esempio, in una visualizzazione della struttura vengono mostrate in forma strutturata le informazioni presenti in un editor. In una visualizzazione delle proprietà vengono mostrate le proprietà dell'oggetto in fase di modifica.
Nel momento in cui un utente seleziona o apporta modifiche in una visualizzazione, queste vengono riprodotte immediatamente in altre parti correlate dell'interfaccia utente. Nella pagina del workbench viene aperta solo un'istanza di tutte le visualizzazioni.
I plug-in possono aggiungere visualizzazioni al workbench mediante il punto di estensione org.eclipse.ui.views. I plug-in che contribuiscono a una visualizzazione devono registrarla nel corrispondente file plugin.xml, insieme alle informazioni di configurazione relative, ad esempio, alla classe di implementazione, alla categoria (o gruppo) di visualizzazioni di appartenenza, al nome e all'icona da utilizzare per descrivere la visualizzazione in menu ed etichette.
Sebbene l'interfaccia per le visualizzazioni risulti definita in IViewPart, i plug-in possono scegliere di estendere la classe ViewPart piuttosto che implementare una classe IViewPart da zero.
Nell'esempio Hello World è stata implementata un'estensione di visualizzazione minima. La seguente estensione, invece, è correlata ad altre visualizzazioni del workbench e risponde all'esplorazione e alle selezioni effettuate dall'utente. Innanzitutto, è necessario analizzare la dichiarazione dell'estensione nel file plugin.xml.
<extension
point="org.eclipse.ui.views">
<category
id="org.eclipse.ui.examples.readmetool"
name="&Readme">
</category>
<view
id="org.eclipse.ui.examples.readmetool.views.SectionsView"
name="Readme Sections"
icon="icons/basic/view16/sections.gif"
category="org.eclipse.ui.examples.readmetool"
class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView">
</view>
</extension>
Questa dichiarazione dovrebbe risultare abbastanza nota. Una nuova visualizzazione, ReadmeSectionsView, viene fornita al workbench. L'ID della visualizzazione, il nome e la categoria sono specificati nel modo illustrato precedentemente. Per la visualizzazione viene fornita anche un'icona, utilizzando un percorso relativo alla directory di installazione del plug-in.
Dall'analisi di ReadmeSectionsView, si evince che è possibile mostrare qualsiasi visualizzazione nel workbench scegliendo Prospettiva->Mostra visualizzazione->Altro... e selezionando la visualizzazione dall'elenco Mostra visualizzazione.
Quando l'utente sceglie ReadmeSectionsView, viene visualizzato un elenco vuoto; a meno che non si selezioni un file con estensione .readme, nel qual caso l'elenco viene compilato con sezioni del file readme.
In che modo il plug-in viene informato delle modifiche alla selezione e riconosce il file readme? Riuscire a scovare le relative informazioni nel codice, è indice di buona conoscenza delle modalità mediante cui creare plug-in di workbench integrati.
Si può partire dal noto metodo createPartControl. Come è stato osservato nell'esempio Hello World, con questo metodo vengono creati i widget rappresentativi di una visualizzazione. Inizialmente, sarà ignorato parte del codice.
public void createPartControl(Composite parent) {
viewer = new ListViewer(parent);
...
// da aggiungere come listener di selezione globale
getSite().getPage().addSelectionListener(this);
// preparare la selezione
selectionChanged(null, getSite().getPage().getSelection());
}
La visualizzazione crea e memorizza un ListViewer e si registra come un listener di selezione sulla relativa pagina. La pagina viene ottenuta da un IViewSite, nel quale sono contenute le informazioni relative al contesto della visualizzazione, come la finestra di workbench che contiene la pagina e il plug-in. Alla notifica di una modifica della selezione, viene eseguito il seguente codice:
public void selectionChanged(IWorkbenchPart part, ISelection sel) {
//se la selezione è un file readme, acquisirne le sezioni.
AdaptableList input =
ReadmeModelFactory.getInstance().getSections(sel);
viewer.setInput(input);
}
È come se la classe ReadmeModelFactory intervenisse per trasformare la selezione in sezioni readme, che vengono considerate input dal visualizzatore creato nel metodo createPartControl.
La visualizzazione ha registrato il suo interesse per le modifiche di selezione. La selezione, però, è stata convertita in un input adeguato per il visualizzatore, che ha compilato un widget di elenco.
Per acquisire immediatamente informazioni su questo visualizzatore, consultare la sezione Visualizzatori. Una volta fornito l'elemento di input, il visualizzatore può compilare con l'informazione ricevuta un widget di elenco, trattandosi, dopo tutto, di un ListViewer. Per conoscere quando è disponibile un file readme e da quale origine provengono le informazioni delle sezioni fornite al visualizzatore, è sufficiente analizzare rapidamente ReadmeModelFactory.
public AdaptableList getSections(ISelection sel) {
// Se sel non è una selezione strutturata è sufficiente completare l'operazione.
if (!(sel instanceof IStructuredSelection))
return null;
IStructuredSelection structured = (IStructuredSelection)sel;
//se la selezione è un file readme, acquisirne le sezioni.
Object object = structured.getFirstElement();
if (object instanceof IFile) {
IFile file = (IFile) object;
String extension =
file.getFileExtension();
if (extension != null && extension.equals(IReadmeConstants.EXTENSION)) {
return
getSections(file);
}
}
//l'oggetto selezionato non è un file readme
return null;
}
È stato effettuato un controllo sulla selezione per verificare se fosse strutturata (selezione multipla). Il concetto di selezione strutturata deriva dai visualizzatori di JFace. È necessario controllare il primo oggetto della selezione per vedere se corrisponde a una risorsa IFile. In caso affermativo, è necessario controllarne l'estensione per vedere se corrisponde all'estensione ".readme". Una volta accertata la presenza del file readme, è possibile analizzare le sezioni mediante altri metodi. Per dettagli in merito all'analisi del file, esaminare ReadmeModelFactory, MarkElement e DefaultSectionsParser.
Per analizzare questa estensione sono stati utilizzati molti concetti di base del workbench. Nella prossima sezione, saranno analizzate altre estensioni nonché le modalità con cui il plug-in può contribuire ulteriormente all'interfaccia utente del workbench.