org.eclipse.ui.views

Widok to część środowiska roboczego, w której można poruszać się po hierarchii informacji lub wyświetlać właściwości obiektu.  Tylko jedna instancja dowolnego widoku może być otwarta na stronie środowiska roboczego.  Gdy użytkownik dokona wyborów lub wprowadzi inne zmiany w widoku, zmiany te zostaną natychmiast uwzględnione w środowisku roboczym. Widoki są często udostępniane do obsługi odpowiadającego im edytora.  Na przykład w widoku schematu wyświetlana jest struktura informacji z edytora.  W widoku właściwości wyświetlane są właściwości edytowanego obiektu.

Punkt rozszerzenia org.eclipse.ui.views umożliwia modułom dodatkowym dodawanie widoków do środowiska roboczego. Moduły dodatkowe, które wnoszą widok, muszą go zarejestrować w swoim pliku plugin.xml oraz udostępnić informacje konfiguracyjne dotyczące widoku, na przykład jego klasę implementacji, kategorię (grupę) widoków, do której ten widok należy, a także nazwę i ikonę, które powinny być używane dla tego widoku w menu i etykietach.

Interfejs widoków jest definiowany w interfejsie IViewPart, ale moduły dodatkowe mogą rozszerzać klasę ViewPart zamiast implementować interfejs IViewPart od podstaw.

W przykładzie hello world zaimplementowano minimalne rozszerzenie widoku. Poniżej przedstawiono przykład, który uwzględnia inne widoki środowiska roboczego oraz reaguje na nawigację użytkownika w środowisku roboczym i dokonywane przez niego zmiany wyborów. Na początek warto przyjrzeć się deklaracji rozszerzenia w pliku 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>

Ten kod powinien już wyglądać znajomo. Wnosi on do środowiska roboczego nowy widok ReadmeSectionsView. Atrybuty view id, name i category są określane tak samo jak poprzednio. Udostępniana jest także ikona (icon) dla widoku przy użyciu ścieżki określonej względem katalogu instalacyjnego modułu dodatkowego.

Teraz kolej na analizę klasy ReadmeSectionsView. Dowolny widok w środowisku roboczym można wyświetlić, wybierając opcje Okna->Pokaż widok->Inne, a następnie wybierając widok z listy Pokaż widok.

Wybranie pozycji ReadmeSectionsView spowoduje wyświetlenie widoku zawierającego listę. Lista ta będzie pusta, dopóki nie zostanie kliknięty plik z rozszerzeniem .readme. Wówczas lista zostanie zapełniona sekcjami z pliku readme.

W jaki sposób moduł dodatkowy rozpoznaje plik readme i skąd ma informacje o zmianach wyboru? Znalezienie odpowiedzi na te pytania pozwoli uzyskać wiedzę na temat budowania zintegrowanych modułów środowiska roboczego.

Na początek omówiona zostanie znajoma metoda createPartControl.  Jak wiadomo z przykładu Hello World, w tym miejscu tworzone są widgety reprezentujące widok.  Część kodu zostanie pominięta, aby przejść od razu do rzeczy.

public void createPartControl(Composite parent) {
      viewer = new ListViewer(parent);
      ...
      // dodaj mnie jako globalny program nasłuchujący zaznaczenia
      getSite().getPage().addSelectionListener(this);

      // przygotuj zaznaczenie
      selectionChanged(null, getSite().getPage().getSelection());
   }

Ten widok tworzy i zachowuje obiekt ListViewer oraz rejestruje się jako funkcja nasłuchiwania zaznaczenia na własnej stronie. Uzyskuje on z interfejsu IViewSite stronę, która zawiera informacje o kontekście widoku, na przykład o jego oknie środowiska roboczego, o zawierającej go stronie oraz o jego module dodatkowym. Co się stanie po powiadomieniu o zmianie zaznaczenia?  Zostanie wykonany następujący kod:

   public void selectionChanged(IWorkbenchPart part, ISelection sel) {
      //gdy wybrany plik to plik readme, pobierz jego sekcje.
      AdaptableList input = ReadmeModelFactory.getInstance().getSections(sel);
      viewer.setInput(input);
   }

Widać, że klasa ReadmeModelFactory jest odpowiedzialna za przekształcenie wyboru w sekcje pliku, które staną się danymi wejściowymi przeglądarki utworzonej przez metodę createPartControl.

Ale w jaki sposób widok zapełnia swoje widgety list?  Na razie można przyjąć, że kiedy element wejściowy zostanie przekazany do przeglądarki, będzie ona wiedzieć, jak zapełnić swoje widgety list informacjami - w końcu jest to obiekt ListViewer.  Aby od razu dowiedzieć się więcej o przeglądarkach, można przejść do sekcji Przeglądarki

Wciąż jednak nie wiadomo, w jaki sposób pliki readme są wykrywane ani skąd pochodzi informacja o sekcjach tego pliku.  Trochę światła na to zagadnienie powinna rzucić szybka analiza klasy ReadmeModelFactory.

   public AdaptableList getSections(ISelection sel) {
      // gdy sel nie jest wyborem strukturalnym, po prostu powróć.
      if (!(sel instanceof IStructuredSelection))
      return null;
      IStructuredSelection structured = (IStructuredSelection)sel;

      //gdy wybrany plik to plik readme, pobierz jego sekcje.
      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);
         }
      }

      //wybrany obiekt nie jest plikiem readme
      return null;
   }

Sprawdzono wybór, aby przekonać się, czy jest to wybór strukturalny (wielokrotny).  Pojęcie wyboru strukturalnego pochodzi od przeglądarek JFace.  Dla pierwszego obiektu w wyborze sprawdza się, czy jest to zasób plikowy (IFile).   Jeśli tak, sprawdza się, czy jego rozszerzenie jest zgodne z rozszerzeniem ".readme".  Po przekonaniu się, że dany plik to plik readme, można użyć innych metod do analizy jego sekcji.   Szczegółowe informacje na temat analizowania plików można znaleźć, przeglądając do końca kod klas ReadmeModelFactoryMarkElement i DefaultSectionsParser.

Badając to rozszerzenie, omówiono wiele powszechnych pojęć dotyczących środowiska roboczego. Teraz można przejść do innych rozszerzeń środowiska roboczego i sprawdzić, w jaki sposób moduł dodatkowy może wnosić kolejne elementy do interfejsu użytkownika środowiska roboczego.