Zasoby interfejsu użytkownika

Pakiet org.eclipse.jface.resource definiuje klasy pomagające modułom dodatkowym w zarządzaniu zasobami interfejsu użytkownika, takimi jak czcionki i ikony.

Wiele punktów rozszerzenia pozwala modułom dodatkowym na obsługę ikon, które mogą być używane do wyświetlania ich elementów dodawanych w obszarze roboczym. Ponieważ systemy operacyjne z interfejsem GUI obsługują w pamięci ograniczoną liczbę obrazów i czcionek, zasoby interfejsu użytkownika modułu dodatkowego muszą być starannie zarządzane, a czasami nawet współużytkowane między widgetami.

Mieliśmy już okazję zobaczyć wiele odwołań do ikon w module dodatkowym narzędzia pliku readme. Niektóre z tych ikon są określone w kodzie 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>

Widzieliśmy również kod opisujący obrazy na bieżąco. Poniższy fragment kodu dotyczy elementu ReadmeEditorActionBarContributor narzędzia pliku readme.

   public ReadmeEditorActionBarContributor() {
      	...
	action1 = new EditorAction(MessageUtil.getString("Editor_Action1")); 
	action1.setToolTipText(MessageUtil.getString("Readme_Editor_Action1")); 
	action1.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_DISABLE);
	action1.setImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_ENABLE);
	...

Pakiet JFace udostępnia podstawowe klasy pomocnicze, które pozwalają modułom dodatkowym na zarządzanie ich ikonami i czcionkami bez konieczności sterowania tworzeniem i usuwaniem odpowiednich obiektów graficznych platformy. Te klasy pomocnicze są używane bezpośrednio przez moduły dodatkowe (jak w przykładzie powyżej) lub pośrednio, gdy środowisko robocze używa tych klas do uzyskania obrazów opisanych w kodzie punktu rozszerzenia.

Deskryptory obrazów i rejestr

Klasa Image pakietu SWT reprezentuje obraz z perspektywy systemu operacyjnego. Ponieważ w większości systemów operacyjnych z interfejsem GUI może być otwarta jednocześnie ograniczona liczba obrazów, moduły dodatkowe muszą być ostrożne przy ich tworzeniu oraz muszą dbać o prawidłowe usuwanie niepotrzebnych obrazów. Generalnie moduły dodatkowe mogą uniknąć bezpośredniego tworzenia, zarządzania i usuwania obrazów, używając klas ImageDescriptor i ImageRegistry pakietu JFace.

Deskryptor obrazu

Klasa ImageDescriptor może być używana jako prosty opis obrazu. Określa wszystkie informacje, które są potrzebne do utworzenia obrazu, na przykład adres URL czy nazwę pliku, z którego można uzyskać obraz. Klasa ImageDescriptors nie alokuje bieżącego obrazu na platformie, o ile nie zostanie wysłane specjalne żądanie przy użyciu metody createImage().

Deskryptory obrazów są najlepszą strategią, gdy kod jest skonstruowany w taki sposób, że definiuje wszystkie ikony w jednym miejscu i przydziela je w razie potrzeby. Deskryptory obrazów mogą być tworzone w dowolnym momencie bez obawy o zasoby systemu operacyjnego i mogą zostać wszystkie utworzone w kodzie inicjującym.

Rejestr obrazów

Klasa ImageRegistry służy do przechowywania listy obrazów o określonych nazwach. Klienci mogą dodawać deskryptory obrazów i obrazy SWT bezpośrednio do listy. Jeśli do rejestru zostanie wysłane żądanie obrazu o danej nazwie, rejestr zwróci obraz, jeśli taki został wcześniej utworzony lub utworzy go na podstawie deskryptora. To pozwala klientom rejestru na współużytkowanie obrazów.

Obrazy dodane do rejestru lub pobrane z niego nie mogą być usuwane przez żadnego klienta. Ponieważ obrazy są współużytkowane przez wielu klientów, za usuwanie obrazów odpowiedzialny jest rejestr. Rejestr usuwa obrazy w momencie zamykania systemu GUI platformy.

Wzorce modułów dodatkowych dotyczące używania obrazów

Określanie obrazu w pliku plugin.xml

O ile to możliwe, ikonę dla obiektów interfejsu użytkownika modułu dodatkowego należy określać w pliku plugin.xml. Wiele punktów rozszerzenia środowiska roboczego zawiera parametry konfiguracji dla pliku ikony. Jeśli ikony są zdefiniowane w elemencie dodawanym rozszerzenia w pliku plugin.xml, strategią zarządzania obrazami zajmuje się platforma. Ponieważ ikony zazwyczaj są przechowywane w katalogu modułu dodatkowego, pozwala to na określanie ikon i zarządzanie plikami w jednym miejscu.

Inne wzorce powinny być brane pod uwagę jedynie w sytuacji, gdy nie można określić ikon jako części elementu dodawanego rozszerzenia.

Tworzenie jawne

Tworzenie jawne obrazu jest najlepszą strategią w przypadku, gdy obraz jest rzadko używany lub nie jest współużytkowany. Obraz może być utworzony bezpośrednio w pakiecie SWT i usunięty po jego użyciu.

Obrazy mogą być również tworzone jawnie przy użyciu klasy ImageDescriptor i wywoływane za pomocą metody createImage(). Podobnie jak w pierwszym przypadku, gdy obraz już nie jest potrzebny, musi zostać usunięty przy użyciu metody dispose(). Jeśli na przykład okno dialogowe w momencie otwierania tworzy obraz, powinno go usunąć, gdy będzie zamykane.

Rejestr obrazów

Jeśli obraz jest często używany w module dodatkowym lub współużytkowany między różnymi obiektami interfejsu użytkownika, pomocne jest zarejestrowanie deskryptora obrazu przy użyciu klasy ImageRegistry. Obrazy w rejestrze będą udostępniane każdemu obiektowi, który zażąda obrazu o danej nazwie. Ponieważ obrazy są używane przez wiele obiektów, nie wolno ich usuwać z rejestru.

Dodanie obrazu do rejestru obrazów jest najlepszą strategią w przypadku, gdy dany obraz jest często używany, prawdopodobnie przez cały okres istnienia modułu dodatkowego, i jest używany przez wiele obiektów. Wadą używania rejestru jest fakt, że obrazy są usuwane dopiero przy zamykaniu systemu GUI. Ponieważ liczba obrazów platformy (SWT), które mogą być jednocześnie otwarte jest ograniczona, należy uważać, aby moduły dodatkowe nie rejestrowały zbyt wielu ikon w rejestrze.

Klasa AbstractUIPlugin zawiera protokół tworzący szeroki rejestr obrazów modułu dodatkowego.

Dostawcy etykiet

Jeśli dana ikona jest często używana do wyświetlania elementów w konkretnej przeglądarce, to dzięki dostawcy etykiet może być współużytkowana między podobnymi elementami w przeglądarce. Ponieważ dostawca etykiet jest odpowiedzialny za zwracanie obrazu każdemu obiektowi w przeglądarce, może kontrolować tworzenie obrazów i ich współużytkowanie między obiektami w przeglądarce.

Dostawca etykiet może używać do tworzenia obrazu dowolnej z wcześniej opisanych technik. Przeglądając różne implementacje metody getImage() w podklasach klasy LabelProvider, można zaobserwować różne podejścia od problemu, w tym buforowanie pojedynczej ikony dla obiektów i obsługiwanie tabeli obrazów według typu. Obrazy utworzone przez dostawcę etykiet muszą być usunięte przy użyciu metody dispose() zawartej w dostawcy, która jest wywoływana w momencie usuwania przeglądarki.

Używanie dostawcy etykiet jest dobrym kompromisem między jawnym tworzeniem obrazów i rejestrem obrazów. Takie rozwiązanie pozwala na współużytkowanie ikon, tak jak w przypadku rejestru obrazów, zachowując przy tym kontrolę nad tworzeniem i usuwaniem bieżącego obrazu.

Wszechstronna klasa obrazu modułu dodatkowego

Aby dostosować moduł dodatkowy, warto wypróbować różne wzorce tworzenia obrazu. Czasami pomocne jest wydzielenie procesu podejmowania decyzji o utworzeniu obrazu w oddzielnej klasie i nakazanie wszystkim klientom używanie jej do pobierania obrazów. W ten sposób sekwencja tworzenia może zostać dostosowana do bieżącej charakterystyki wydajności modułu dodatkowego. 

ResourceManager

Klasa ResourceManager (menedżer zasobów) służy do przechowywania odwzorowania obiektów klasy ImageDescriptor na obiekty klasy klasę Image tak, aby obiekt klasy Image mógł zostać ponownie użyty przez odwołanie się do niego za pomocą jego deskryptora. Jeśli do rejestru zostanie wysłane żądanie obrazu o danym deskryptorze, rejestr zwróci obraz, jeśli taki został wcześniej utworzony lub utworzy go na podstawie deskryptora. To pozwala klientom rejestru na współużytkowanie obrazów.

Menedżerem zasobów najwyższego poziomu jest klasa DeviceResourceManager, która jest tworzona dla określonego ekranu. Klasa DeviceResourceManager jest menedżerem zasobów, który można zdefiniować za pomocą metody JFaceResources.getResources(). Może być ona używana jako menedżer zasobów najwyższego poziomu. Jeśli potrzebny jest menedżer zasobów o krótszym cyklu życia niż klasa DeviceResourceManager, można utworzyć obiekt klasy LocalResourceManager (jako obiekt potomny). Gdy przestanie on być potrzebny, można go zutylizować za pomocą metody dispose.

Obiekt klasy DeviceResourceManager zostanie zutylizowany w momencie, gdy zostanie zutylizowany obiekt ekranu, który został użyty do jego utworzenia, dlatego do wykonania tej operacji nie jest wymagany żaden specjalny kod.

Obrazy dodane do lub pobrane z menedżera nie mogą być utylizowane przez żadnego klienta. Ponieważ obrazy są współużytkowane przez wielu klientów, za utylizowanie obrazów odpowiedzialny jest menedżer. Rejestr zutylizuje obrazy w momencie, gdy zutylizowany zostanie menedżer zasobów zawierający te obrazy.

Rejestr czcionek

Czcionki są kolejnym zasobem ograniczonym w systemach operacyjnych platformy. Problemy tworzenia i usuwania są takie same w przypadku czcionek, jak w przypadku obrazów i wymagają podobnych usprawnień w zakresie wydajności i miejsca. Generalnie czcionki są przydzielane w pakiecie SWT po otrzymaniu żądania dotyczącego czcionki o nazwie zależnej od platformy.

Klasa FontRegistry przechowuje tabelę czcionek według ich nazwy. Zarządza przydzielaniem i usuwaniem czcionek.

Generalnie moduły dodatkowe powinny unikać przydzielania czcionek i opisywania ich przy użyciu nazw specyficznych dla platformy. Mimo że rejestr czcionek jest używany wewnętrznie w pakiecie JFace, zazwyczaj nie jest używany przez moduły dodatkowe. Do uzyskiwania dostępu do wspólnych czcionek powinna być używana klasa JFaceResources.

Bardzo powszechnym rozwiązaniem jest pozwalanie użytkownikowi na określanie na odpowiedniej stronie ich preferencji dotyczących czcionek w aplikacji. W takich przypadkach do uzyskania nazwy czcionki od użytkownika powinna zostać użyta klasa FontFieldEditor, a do przechowywania czcionki klasa FontRegistry.  Klasa FontFieldEditor jest używana tylko na stronach preferencji.

Klasa JFaceResources

Klasa JFaceResources kontroluje dostęp do wspólnych czcionek i obrazów platformy. Przechowuje wewnętrzny rejestr czcionek i obrazów, aby klienci mogli współużytkować nazwane czcionki i obrazy.

Do współużytkowania obrazów w środowisku roboczym i innych modułach dodatkowych używane są różne techniki. Rejestr obrazów klasy JFaceResources nie jest powszechnie stosowany w kodzie środowiska roboczego i modułów dodatkowych.

Używanie czcionek jest znacznie prostsze. Środowisko robocze i moduły dodatkowe używają klasy JFaceResources do żądania czcionek według ich nazw logicznych. Aby moduły dodatkowe mogły używać odpowiednich czcionek w ich interfejsach użytkownika, dostarczane są takie metody, jak getDialogFont() i getDefaultFont().