org.eclipse.ui.views

Una vista è una parte del workbench che consente di esplorare una gerarchia di informazioni o visualizzare le proprietà di un oggetto.  In una pagina di workbench viene aperta una sola istanza di una determinata vista.  Nel momento in cui l'utente seleziona o apporta altre modifiche in una vista, queste vengono riprodotte immediatamente nel workbench. Le viste spesso vengono fornite a supporto di un editor corrispondente.  Ad esempio, nella vista Struttura vengono mostrate in forma strutturata le informazioni presenti in un editor.  Nella vista Proprietà vengono mostrate le proprietà dell'oggetto in fase di modifica.

I plugin possono aggiungere viste al workbench mediante il punto di estensione org.eclipse.ui.views. I plugin che contribuiscono a una vista devono registrarla nel corrispondente file plugin.xml e fornire  le informazioni di configurazione relative, ad esempio, alla classe di implementazione, alla categoria (o gruppo) di viste di appartenenza, al nome e all'icona da utilizzare per descrivere la vista in menu ed etichette.

Sebbene l'interfaccia per le viste risulti definita in IViewPart, i plugin possono scegliere di estendere la classe ViewPart piuttosto che implementare una classe IViewPart da zero.

Nell'esempio Hello World è stata implementata un'estensione di vista minima. La seguente estensione, invece, è correlata ad altre viste del workbench e risponde all'esplorazione e alle modifiche di selezione 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="%Views.category">
	</category>
	<view
 	   id="org.eclipse.ui.examples.readmetool.views.SectionsView"
	   name="%Views.ReadmeSections"
	   icon="icons/view16/sections.png"
	   category="org.eclipse.ui.examples.readmetool"
	   class="org.eclipse.ui.examples.readmetool.ReadmeSectionsView">
	</view>
</extension>

Questa dichiarazione dovrebbe risultare abbastanza nota. Una nuova vista, ReadmeSectionsView, viene fornita al workbench. view id, name e category sono specificati nel modo illustrato precedentemente. Per la vista viene fornita anche icon, utilizzando un percorso relativo alla directory di installazione del plugin.

Dall'analisi di ReadmeSectionsView, si evince che è possibile mostrare qualsiasi vista nel workbench scegliendo Finestra->Mostra vista->Altro... e selezionando la vista dall'elenco Mostra vista.

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 plugin riconosce il file readme e viene informato delle modifiche alla selezione? Riuscire a trovare le risposte a queste domande è indice di buona conoscenza delle modalità mediante cui creare plugin di workbench integrati.

Si può partire dal metodo createPartControl. Come è stato osservato nell'esempio Hello World, con questo metodo vengono creati i widget rappresentativi di una vista.  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 vista 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 vista, come la finestra di workbench, la pagina che lo contiene e il plugin. 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 fosse responsabile della trasformazione della selezione in sezioni di readme e tali sezioni venissero considerate input dal visualizzatore creato nel metodo createPartControl.

Ma in che modo il visualizzatore compila il widget di elenco?  Per il momento, bisogna presupporre che, una volta fornito l'elemento di input, il visualizzatore può compilare un widget di elenco con l'informazione ricevuta, trattandosi, dopo tutto, di un ListViewer.  Per acquisire immediatamente informazioni su questo visualizzatore, consultare la sezione Visualizzatori

Per conoscere il modo in cui i file readme vengono rilevati e da quale origine provengono le informazioni relative alle sezioni di file,  è 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 ReadmeModelFactoryMarkElement 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 plugin può contribuire ulteriormente all'interfaccia utente del workbench.