Przeglądarki

Po co używać przeglądarek skoro elementy dodawane interfejsu użytkownika środowiska roboczego, takie jak widoki, edytory, kreatorzy i okna dialogowe można zaimplementować bezpośrednio przy użyciu widgetów SWT?  

Przeglądarki umożliwiają tworzenie widgetów w trakcie korzystania z własnego modelu obiektów. W przypadku bezpośredniego używania widgetów SWT należy przekształcić własne obiekty w łańcuchy i obrazy oczekiwane przez pakiet SWT. Przeglądarki zachowują się jak adaptery widgetów SWT, obsługując wspólny kod do obsługi zdarzeń widgetów, który w przeciwnym wypadku należałoby zaimplementować we własnym zakresie. 

Pierwszym przykładem przeglądarki był widok dodawany przez narzędzie pliku readme wewnątrz elementu ReadmeSectionsView.

public void createPartControl(Composite parent) {
      viewer = new ListViewer(parent);
      ...
   }
Uwaga:  Przeglądarki mogą być używane do udostępniania implementacji zarówno widoków, jak i edytorów środowiska roboczego. Nazwa "przeglądarka" nie musi oznaczać, że służą one tylko do implementowania widoków. Na przykład przeglądarka TextViewer jest używana w implementacji wielu edytorów środowiska roboczego oraz modułów dodatkowych.

Przeglądarki standardowe

Pakiet JFace udostępnia przeglądarki dla większości skomplikowanych widgetów SWT. Przeglądarki są powszechnie używane w przypadku list, drzew, tabel i widgetów tekstowych. 

Każda przeglądarka ma przypisany widget SWT. Ten widget można utworzyć niejawnie, dostarczając nadrzędną klasę Composite w konstruktorze przeglądarki, lub jawnie, tworząc go, a następnie dostarczając go do przeglądarki w konstruktorze.

Przeglądarki list

Z punktu widzenia użytkownika listy, drzewa i tabele oferują wiele wspólnych możliwości, takich jak zapełnianie obiektami, zaznaczanie, sortowanie oraz filtrowanie. 

Te przeglądarki przechowują listę obiektów domeny (nazywanych elementami) i wyświetlają je w odpowiednich widgetach SWT. Przeglądarka list potrafi uzyskać etykietę tekstową z każdego elementu na liście. Etykieta jest pobierana z obiektu ILabelProvider, który może zostać ustawiony dla przeglądarki. Przeglądarki list potrafią odwzorować odpowiedzi zwrotne widgetów z powrotem na elementy znane klientowi przeglądarki.

Klienci używający prostych widgetów SWT muszą pracować na poziomie pakietu SWT, gdzie elementy są łańcuchami, a zdarzenia często odnoszą się do indeksu listy łańcuchów. Przeglądarki udostępniają semantykę wysokiego poziomu. Klienci są informowani o zaznaczeniach i zmianach na liście przy użyciu elementów dostarczonych przez nich do przeglądarki. Przeglądarka obsługuje całą pracę związaną z odwzorowywaniem indeksów z powrotem na elementy, dostosowując się do widoków obiektów z zastosowanymi filtrami oraz sortując obiekty ponownie w razie potrzeby.

Funkcje filtrowania i sortowania są obsługiwane przez określony obiekt sortujący (ViewerSorter) i/lub obiekt filtrujący (ViewerFilter) danej przeglądarki. Te klasy mogą zostać określone dodatkowo dla przeglądarek drzew i tabel. Klient musi jedynie udostępnić klasę porównującą lub filtrującą obiekty na liście. Przeglądarka obsługuje szczegóły dotyczące zapełniania listy według określonego porządku i filtru oraz zachowuje porządek i reguły filtrowania w trakcie dodawania lub usuwania elementów.

Klienci nie mogą rozszerzać przeglądarek. Aby dostosować przeglądarkę, należy ją skonfigurować z własnymi dostawcami treści i etykiet.

Klasa ListViewer odwzorowuje elementy listy na element sterujący SWT List.

Klasa TreeViewer wyświetla hierarchiczne obiekty w widgecie SWT Tree. Obsługuje ona szczegóły dotyczące rozwijania i zwijania elementów. Dla różnych drzewiastych elementów sterujących SWT (zwykłe drzewo, drzewo tabel, drzewo pól wyboru) istnieje kilka różnych rodzajów przeglądarek drzew.

Klasa TableViewer jest bardzo podobna do przeglądarki list, ale ma dodatkową możliwość wyświetlania w wielu kolumnach informacji o każdym elemencie tabeli. Przeglądarki tabel znacząco rozszerzają funkcjonalność widgetu tabeli SWT, wprowadzając pojęcie edycji komórki. Aby umożliwić użytkownikowi edytowanie komórek tabeli przy użyciu okna złożonego, okna dialogowego czy widgetu tekstowego, mogą zostać użyte specjalne edytory komórek. Przeglądarka tabel kontroluje tworzenie tych widgetów oraz ich położenie w trakcie edytowania przez użytkownika. W tym celu używane są klasy CellEditor - TextCellEditor i CheckboxCellEditor. Tabela wirtualna, zapełniana jedynie podczas wyświetlania; przeglądarka tabel uruchamia jedynie określoną liczbę wyników niezależnie od tworzonych obiektów. Baza danych "z opóźnieniem" żąda trybu JIT i utworzy jednoczesne zapytania jedynie dla określonej liczby.

Przeglądarka tekstu

Widgety tekstowe obsługują wiele powszechnie stosowanych zachowań, takich jak dwukrotne kliknięcie przycisku myszy, cofnięcie ostatniej czynności, kolorowanie oraz nawigowanie według indeksu lub numeru wiersza. Klasa TextViewer jest adapterem widgetu SWT StyledText. Przeglądarki tekstu udostępniają klientowi model dokumentu i zarządzają procesem przekształcania dokumentu w informację tekstową o określonym stylu udostępnianą przez widget tekstowy.

Przeglądarki tekstu zostały szerzej omówione w sekcji Edytory środowiska roboczego.

Architektura przeglądarki

Aby zrozumieć zasady działania przeglądarki, należy lepiej poznać związki między elementem wejściowym przeglądarki, jej treścią, jej zaznaczeniem oraz informacją wyświetlaną w zmienianym widgecie.

Elementy wejściowe

Element wejściowy to główny obiekt, który jest wyświetlany (lub edytowany) przez przeglądarkę. Z punktu widzenia przeglądarki elementem wejściowym może być dowolny obiekt. Przeglądarka nie oczekuje, że element wejściowy zaimplementuje jakiś konkretny interfejs. (Przyczyna takiego podejścia zostanie wyjaśniona w sekcji dotyczącej dostawców treści).

Przeglądarka musi potrafić obsłużyć zmianę elementu wejściowego. Jeśli do przeglądarki zostanie wstawiony nowy element wejściowy, przeglądarka musi ponownie zapełnić widget zgodnie z nowym elementem i anulować powiązanie z poprzednim elementem wejściowym. Semantyka rejestrowania obiektu nasłuchiwania nowego elementu i zapełniania na jego podstawie widgetu jest inna dla każdego rodzaju przeglądarki.

Przeglądarki treści

Przeglądarka treści jest przeglądarką z dobrze zdefiniowanym protokołem służącym do uzyskiwania informacji z elementu wejściowego. Do zapełniania widgetu i wyświetlania informacji o elemencie wejściowym przeglądarki treści używają dwóch specjalnych klas pomocniczych: IContentProvider i ILabelProvider.

Interfejs IContentProvider udostępnia podstawowy protokół cyklu życia do przypisywania dostawcy treści do elementu wejściowego oraz do obsługi zmiany elementu wejściowego. Dla różnych rodzajów przeglądarek implementowani są specjalni dostawcy treści. Najpowszechniejszym dostawcą treści jest interfejs IStructuredContentProvider, który potrafi udostępnić listę obiektów danego elementu wejściowego. Jest używany w przeglądarkach podobnych do list, takich jak listy, tabele czy drzewa. Generalnie dostawca treści potrafi odwzorować element wejściowy na oczekiwaną treść przeglądarki.

Interfejs ILabelProvider robi krok dalej. Mając daną treść przeglądarki (pochodzącą z elementu wejściowego i dostawcy treści), potrafi wygenerować konkretne elementy interfejsu użytkownika, takie jak nazwy i ikony, które są potrzebne do wyświetlenia treści w przeglądarce. Dostawcy etykiet mogą pomóc w zapisywaniu zasobów ikon, ponieważ potrafią zapewnić tą samą instancję ikony dla wszystkich elementów podobnego typu w przeglądarce.

Uwaga:  Instancje konkretnych dostawców treści i etykiet nie są przeznaczone do współużytkowania przez wiele przeglądarek. Nawet jeśli wszystkie przeglądarki używają dostawcy treści lub etykiet tego samego typu, każda z nich powinna zostać uruchomiona z własną instancją klasy dostawcy. Protokół cyklu życia dostawcy został zaprojektowany w relacji 1-1 między dostawcą a przeglądarką.

Elementy wejściowe, dostawcy treści i dostawcy etykiet pozwalają przeglądarkom ukryć większość szczegółów implementacji zapełniania widgetów. Klienci przeglądarki muszą się martwić jedynie o zapełnienie jej właściwym rodzajem danych wejściowych i o właściwego dostawcę treści. Dostawca etykiet musi mieć możliwość pobrania informacji dotyczących interfejsu użytkownika z treści przeglądarki.

Dostawca etykiet może wyświetlić więcej niż tylko tekst i obraz. Biblioteka JFace udostępnia kilka różnych klas i interfejsów do obsługi tej najczęściej spotykanej, dodatkowej funkcjonalności. Poniższe klasy są obsługiwane przez klasy TableViewer, AbstractTreeViewer i TableTreeViewer.

Platforma Eclipse 3.1 umożliwia zmianę kolorów widoku na dwa sposoby: za pomocą własnych dostawców etykiet lub za pomocą dekoracji, które mogą ustawiać kolory i czcionki. Ogólnie lepiej jest używać funkcji obsługi kolorów i czcionek udostępnianych przez dostawców etykiet, ponieważ dekoracje mają wpływ na każdy widok, który wyświetla określony typ. Jeśli używana jest dekoracja czcionek lub kolorów, należy upewnić się, że można ustawić jej wartości na stronie preferencji Kolory i czcionki.

Przeglądarki i środowisko robocze

Elastyczność oferowana przez przeglądarki, dostawców treści i dostawców etykiet jest dobrze widoczna na przykładzie używania ich przez środowisko robocze.

Klasa WorkbenchContentProvider jest strukturalnym dostawcą treści uzyskującym treść z elementu wejściowego na podstawie jego elementów potomnych. Pojęcie adapterów jest używane po raz kolejny przy implementowaniu ogólnej funkcji. Po wysłaniu zapytania o listę elementów danego elementu wejściowego klasa WorkbenchContentProvider otrzymuje dla danego elementu wejściowego obiekt IWorkbenchAdapter. Jeśli dla danego elementu wejściowego został zarejestrowany interfejs IWorkbenchAdapter, dostawca treści może założyć, że w tym elemencie mogą być wyszukiwane elementy potomne. Praca klasy WorkbenchContentProvider polega również na aktualizacji przeglądarki, gdy środowisko robocze ulega zmianie. 

Klasa WorkbenchLabelProvider jest dostawcą etykiet, który otrzymuje z danego obiektu obiekt IWorkbenchAdapter, aby wyszukać w nim tekst i obraz. Idea dostawcy etykiet jest szczególnie pomocna w przypadku obiektów środowiska roboczego, ponieważ pozwala pojedynczemu dostawcy etykiet buforować często używane w przeglądarce obrazy. Jeśli na przykład klasa WorkbenchLabelProvider raz uzyska obraz dla obiektu IProject, może go umieścić w pamięci podręcznej i użyć dla wszystkich obiektów IProject wyświetlanych w przeglądarce.

Po zdefiniowaniu wspólnego adaptera (IWorkbenchAdapter) i zarejestrowaniu go dla wielu typów platform, te typy będą reprezentowane prawidłowo w zawierających je wielu powszechnych przeglądarkach i widokach środowiska roboczego.