org.eclipse.ui.views

Eine Sicht stellt eine Workbench-Komponente dar, die zum Navigieren in einer Datenhierarchie oder zur Anzeige von Eigenschaften für ein bestimmtes Objekt benutzt werden kann. Nur ein Exemplar einer bestimmten Sicht ist in einer Workbench-Seite jeweils geöffnet.  Wenn der Benutzer eine Auswahl oder andere Änderungen in der Sicht vornimmt, werden diese Änderungen unmittelbar in der Workbench nachvollzogen. Sichten werden häufig bereitgestellt, um einen entsprechenden Editor zu unterstützen. Eine Sicht Gliederung zeigt beispielsweise die strukturierte Sicht der Informationen in einem Editor an.  Eine Sicht Eigenschaften enthält die Eigenschaften des Objekts, das gerade bearbeitet wird.

Am Erweiterungspunkt org.eclipse.ui.views können Plug-ins Sichten zur Workbench hinzufügen. Plug-ins, die die Workbench durch eine Sicht ergänzen, müssen die Sicht in der zugehörigen Datei plugin.xml registrieren und außerdem Konfigurationsdaten (z. B. die Implementierungsklasse, die Kategorie (oder Gruppe) der zugehörigen Sichten sowie den Namen und das Symbol zur Beschreibung der Sicht in Menüs und Bezeichnungen) angeben.

Die Schnittstelle für Sichten ist in IViewPart definiert. Plug-ins können jedoch auch die Klasse ViewPart erweitern, statt ein Objekt IViewPart ganz neu zu erstellen.

Im Beispiel des Plug-ins "Hello World" wurde eine minimale Sichterweiterung implementiert. An dieser Stelle soll eine Erweiterung erläutert werden, die andere Workbench-Sichten feststellen und auf Navigationsoperationen und Auswahländerungen des Benutzers in der Workbench reagieren kann. In diesem Zusammenhang wird zunächst die Deklaration der Erweiterung in der Datei plugin.xml vorgestellt:

<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>

Diese Datei kommt Ihnen wahrscheinlich bekannt vor. Sie können feststellen, dass die Workbench durch eine neue Sicht namens ReadmeSectionsView ergänzt wird. Die Parameter view id, name und category wurden wie in den vorherigen Beispielen definiert. Außerdem wird über den Parameter icon ein Symbol für die Sicht bereitgestellt, wobei ein relativer Pfad für das Installationsverzeichnis des Plug-ins verwendet wird.

Sehen Sie sich jetzt die Sicht ReadmeSectionsView genauer an. Sie können jede beliebige Sicht in der Workbench aufrufen, indem Sie die Menüoptionen Fenster->Sicht anzeigen->Andere... und anschließend die Sicht in der Liste Sicht anzeigen auswählen.

Wenn Sie die Sicht ReadmeSectionsView aufrufen, wird eine Sicht mit einer Liste ausgegeben. Diese Liste ist so lange leer, bis Sie auf eine Datei mit der Erweiterung .readme klicken. Dann wird die Liste mit den Abschnitten der Readme-Datei gefüllt.

Wie erkennt nun das Plug-in die Readme-Datei und wie kann es Auswahländerungen erkennen? Durch die Beantwortung dieser Fragen wird besser verständlich, wie integrierte Workbench-Plug-ins erstellt werden können.

Am Beginn steht die schon bekannte Methode createPartControl.  Wie im Beispiel von "Hello World" bereits dargestellt, werden in dieser Methode die Fensterobjekte erstellt, die eine Sicht darstellen.  In der folgenden Beschreibung werden nur die relevanten Teile des Codes behandelt.

   public void createPartControl(Composite parent) {
      viewer = new ListViewer(parent);
      ...
      // add myself as a global selection listener
      getSite().getPage().addSelectionListener(this);

      // prime the selection
      selectionChanged(null, getSite().getPage().getSelection());
   }

Die Sicht erstellt und speichert eine Listener-Funktion für die Sicht (ListViewer) und registriert sich auf ihrer Seite selbst als Listener-Funktion für die Auswahl. Der Abruf der Seite erfolgt über das Objekt IViewSite, das Informationen zum Kontext der Sicht (Workbench-Fenster, aufnehmende Seite und Plug-in) enthält. Wenn nun eine Benachrichtigung über eine Auswahländerung gesendet wird, wird der folgende Code ausgeführt:

   public void selectionChanged(IWorkbenchPart part, ISelection sel) {
      //if the selection is a readme file, get its sections.
      AdaptableList input = ReadmeModelFactory.getInstance().getSections(sel);
      viewer.setInput(input);
   }

Im vorliegenden Beispiel ist die Klasse ReadmeModelFactory für die Umwandlung der Auswahl in Abschnitte der Readme-Datei verantwortlich (diese Abschnitte werden als Eingabe für die Anzeigefunktion verwendet, die in der Methode createPartControl erstellt wurde).

Wie füllt die Anzeigefunktion ihre Listen-Fensterobjekte? Im vorliegenden Fall wird davon ausgegangen, dass die Anzeigefunktion, nachdem Sie die erforderlichen Informationen zum zugehörigen Eingabeelement empfangen hat, feststellen kann, wie die Listen-Fensterobjekte mit Daten gefüllt werden können. Immerhin handelt es sich hierbei um ein ListViewer-Element..  Wenn Sie die vollständigen Informationen zur Anzeigefunktion sofort benötigen, finden Sie Weiteres unter Anzeigefunktionen

Noch wurde nicht erläutert, wie Readme-Dateien festgestellt werden können oder wo die Abschnittsinformationen der Datei abgerufen werden.  Zum besseren Verständnis dieser Zusammenhänge wird im Folgenden ReadmeModelFactory erläutert.

   public AdaptableList getSections(ISelection sel) {
      // If sel is not a structured selection just return.
      if (!(sel instanceof IStructuredSelection))
         return null;
      IStructuredSelection structured = (IStructuredSelection)sel;

      //if the selection is a readme file, get its sections.
      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);
         }
      }

      //the selected object is not a readme file
      return null;
   }

Die Auswahl wird überprüft, um festzustellen, ob es sich um eine strukturierte Auswahl, also eine Mehrfachauswahl handelt.  (Das Konzept der strukturierten Auswahl stammt aus den Anzeigefunktionen von JFace.)  Für das erste Objekt der Auswahl wird überprüft, ob es sich um eine Dateiressource (IFile) handelt.  Wenn dies der Fall ist, wir die Erweiterung überprüft, um festzustellen, ob sie mit der Erweiterung".readme" übereinstimmt.  Sobald sichergestellt ist, dass es sich um eine Readme-Datei handelt, können andere Methoden verwendet werden, um die Abschnitte syntaktisch zu analysieren.  Details über Syntaxanalyse einer Datei finden Sie unter ReadmeModelFactoryMarkElement und DefaultSectionsParser.

Im Zuge der Erläuterung dieser Erweiterung wurden eine Vielzahl allgemeiner Workbench-Konzepte behandelt. Als Nächstes werden einige andere Workbench-Erweiterungen vorgestellt, und es wird beschrieben, wie die Benutzerschnittstelle der Workbench durch Ihr Plug-in weiter ergänzt werden kann.