Upload
others
View
19
Download
0
Embed Size (px)
Citation preview
Tytuł oryginału Eclipse 4 Plug-in Development by Example Beginners Guide
Tłumaczenie Rafał Jońca
ISBN 978-83-246-8754-1
Copyright copy Packt Publishing 2013
First published in the English language under the title bdquoEclipse 4 Plug-in Development by Example Beginners Guiderdquo
Polish edition copyright copy 2014 by Helion SA All rights reserved
All rights reserved No part of this book may be reproduced or transmitted in any form or by any means electronic or mechanical including photocopying recording or by any information storage retrieval system without permission from the Publisher
Wszelkie prawa zastrzeżone Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione Wykonywanie kopii metodą kserograficzną fotograficzną a także kopiowanie książki na nośniku filmowym magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji
Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli
Autor oraz Wydawnictwo HELION dołożyli wszelkich starań by zawarte w tej książce informacje były kompletne i rzetelne Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich Autor oraz Wydawnictwo HELION nie ponoszą roacutewnież żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce
Wydawnictwo HELIONul Kościuszki 1c 44-100 GLIWICEtel 32 231 22 19 32 230 98 63e-mail helionhelionplWWW httphelionpl (księgarnia internetowa katalog książek)
Drogi CzytelnikuJeżeli chcesz ocenić tę książkę zajrzyj pod adres httphelionpluseropinieeclip4Możesz tam wpisać swoje uwagi spostrzeżenia recenzję
Printed in Poland
bull Kup książkębull Poleć książkę bull Oceń książkę
bull Księgarnia internetowabull Lubię to raquo Nasza społeczność
Spis tre ci
Przedmowa 15
Rozdzia 1 Tworzenie pierwszej wtyczki 21
Przygotowanie rodowiska 21Kroki do wykonania mdash konfiguracja rodowiska Eclipse SDK 22
Tworzenie pierwszej wtyczki 25Kroki do wykonania mdash tworzenie wtyczki 25Quiz mdash przestrzenie nazw i wtyczki Eclipse 28
Uruchomienie wtyczki 28Kroki do wykonania mdash uruchomienie Eclipse z poziomu Eclipse 28Quiz mdash uruchamianie Eclipse 31Sprawd si mdash modyfikacja wtyczki 31
Debugowanie wtyczki 31Kroki do wykonania mdash debugowanie wtyczki 31Kroki do wykonania mdash aktualizacja kodu w debuggerze 34
Debugowanie z filtrami krokoacutew 35Kroki do wykonania mdash ustawienie filtru krokoacutew 35
Korzystanie z roacute nych rodzajoacutew punktoacutew wstrzymania 37Kroki do wykonania mdash wstrzymanie przy wej ciu do metody lub wyj ciu z niej 37
Warunkowe punkty wstrzymania 38Kroki do wykonania mdash ustawienie warunkowego punktu wstrzymania 39
Wstrzymanie dzia ania po wyst pieniu wyj tku 40Kroki do wykonania mdash wy apywanie wyj tkoacutew 40Kroki do wykonania mdash obserwacja zmiennych i wyra e 43Quiz mdash debugowanie 45Sprawd si mdash korzystanie z punktoacutew wstrzymania 45
Podsumowanie 46
Rozdzia 2 Tworzenie widokoacutew w SWT 47
Tworzenie widokoacutew i widgetoacutew 48Kroki do wykonania mdash tworzenie widoku 48Kroki do wykonania mdash rysowanie w asnego widoku 50Kroki do wykonania mdash rysowanie wskazoacutewki sekund 53
Kup książkę Poleć książkę
Spis tre ci
4
Kroki do wykonania mdash animacja wskazoacutewki sekund 54Kroki do wykonania mdash uruchomienie w w tku interfejsu u ytkownika 55Kroki do wykonania mdash tworzenie widgetu wielokrotnego u ytku 56Kroki do wykonania mdash korzystanie z uk adu graficznego widoku 58Quiz mdash dzia anie widokoacutew 61Sprawd si mdash wskazoacutewki minut i godzin 61
Zarz dzanie zasobami 61Kroki do wykonania mdash wi cej koloroacutew 62Kroki do wykonania mdash znajdowanie wycieku 63Kroki do wykonania mdash zatykanie wycieku 65Quiz mdash dzia anie zasoboacutew 67Sprawd si mdash rozbudowa widgetu zegara 67
Interakcja z u ytkownikiem 67Kroki do wykonania mdash uzyskiwanie aktywno ci 67Kroki do wykonania mdash reakcja na dzia ania u ytkownika 69Quiz mdash dzia anie widgetoacutew 70Sprawd si mdash aktualizacja widgetu zegara 70
Korzystanie z innych widgetoacutew SWT 71Kroki do wykonania mdash dodanie elementoacutew do zasobnika 71Kroki do wykonania mdash reakcja na akcje u ytkownika 73Kroki do wykonania mdash obiekty modalne i inne efekty 74Kroki do wykonania mdash grupy i zak adki 76Quiz mdash korzystanie z SWT 82Sprawd si mdash rozbudowa widoku stref czasowych 82
Podsumowanie 82
Rozdzia 3 Tworzenie widokoacutew w JFace 83
Dlaczego JFace 83Tworzenie widokoacutew TreeViewer 84
Kroki do wykonania mdash tworzenie obiektu TreeViewer 84Kroki do wykonania mdash JFace i obrazy 88Kroki do wykonania mdash style w dostawcy etykiet 91Quiz mdash podstawy JFace 93Sprawd si mdash dodanie obrazoacutew dla regionoacutew 93
Sortowanie i filtracja 93Kroki do wykonania mdash sortowanie elementoacutew w widoku 94Kroki do wykonania mdash filtrowanie elementoacutew w widoku 95Quiz mdash sortowanie i filtracja 97Sprawd si mdash rozwijanie ga zi i filtracja 97
Interakcje i w a ciwo ci 98Kroki do wykonania mdash dodanie procedury obs ugi podwoacutejnego klikni cia 98Kroki do wykonania mdash wy wietlanie w a ciwo ci 101Quiz mdash dzia anie w a ciwo ci 105
Dane tabelaryczne 105Kroki do wykonania mdash przegl danie stref czasowych w tabeli 105Kroki do wykonania mdash synchronizacja wyboru 109Quiz mdash dzia anie tabel 111
Podsumowanie 112
Kup książkę Poleć książkę
Spis tre ci
5
Rozdzia 4 Interakcja z u ytkownikiem 113
Tworzenie akcji polece i procedur obs ugi 113Kroki do wykonania mdash dodanie menu kontekstowego 114Kroki do wykonania mdash tworzenie polece i procedur obs ugi 115Kroki do wykonania mdash powi zanie polece ze skroacutetami 117Kroki do wykonania mdash zmiana kontekstu 119Kroki do wykonania mdash w czanie i wy czanie elementoacutew menu 121Kroki do wykonania mdash wielokrotne u ycie wyra e 123Kroki do wykonania mdash dodanie polece do menu kontekstowego 124Sprawd si mdash wykorzystanie menu i paskoacutew narz dziowych 126Quiz mdash dzia anie menu 127
Zadania i paski post pu 127Kroki do wykonania mdash uruchamianie operacji dzia aj cych w tle 127Sprawd si mdash u ycie zadania UIJob 129Kroki do wykonania mdash raportowanie post pu prac 129Kroki do wykonania mdash sprawdzanie anulowania zadania 131Kroki do wykonania mdash podzadania i ich monitorowanie 131Kroki do wykonania mdash u ycie monitoroacutew i podmonitoroacutew typu null 133Kroki do wykonania mdash ustawienie w a ciwo ci klasy Job 135Sprawd si mdash wy wietlanie zadania w pasku systemowym 138Quiz mdash korzystanie z zada 138
Zg aszanie b doacutew 138Kroki do wykonania mdash wy wietlanie b doacutew 138Quiz mdash zg aszanie b doacutew 141
Podsumowanie 142
Rozdzia 5 Przechowywanie preferencji i ustawie 143
Przechowywanie preferencji 143Kroki do wykonania mdash trwa o warto ci 144Kroki do wykonania mdash utworzenie strony preferencji 145Kroki do wykonania mdash tworzenie komunikatoacutew ostrze e i b doacutew 146Kroki do wykonania mdash wyboacuter elementu z listy 147Kroki do wykonania mdash dodanie siatki 149Kroki do wykonania mdash lokalizacja strony preferencji 150Kroki do wykonania mdash u ycie innych edytoroacutew poacutel 151Kroki do wykonania mdash dodanie s oacutew kluczowych 153Kroki do wykonania mdash u ycie IEclipsePreferences 154Sprawd si mdash t umaczenie na inne j zyki 155
U ycie IMemento i DialogSettings 155Kroki do wykonania mdash dodanie IMemento do widoku stref czasowych 156Kroki do wykonania mdash u ycie DialogSettings 157Quiz mdash dzia anie preferencji 159
Podsumowanie 159
Kup książkę Poleć książkę
Spis tre ci
6
Rozdzia 6 Korzystanie z zasoboacutew 161
Korzystanie z przestrzeni roboczych i zasoboacutew 161Kroki do wykonania mdash tworzenie edytora 162Kroki do wykonania mdash tworzenie parsera 164Kroki do wykonania mdash tworzenie systemu buduj cego 165Kroki do wykonania mdash iteracja przez zasoby 168Kroki do wykonania mdash tworzenie zasoboacutew 170Kroki do wykonania mdash implementacja budowania inkrementacyjnego 172Kroki do wykonania mdash obs uga usuni cia 172Sprawd si mdash rozbudowa mechanizmu budowania 174
U ycie charakteroacutew projektu 175Kroki do wykonania mdash tworzenie charakteru projektu 175Sprawd si mdash ukrywanie charakteru 178
U ycie znacznikoacutew 178Kroki do wykonania mdash znacznik b du gdy plik jest pusty 179Kroki do wykonania mdash rejestracja rodzaju znacznika 180Sprawd si mdash prawid owe dzia anie gdy plik jest naprawd pusty 181Quiz mdash obs uga zasoboacutew procesu budowania i znacznikoacutew 182
Podsumowanie 182
Rozdzia 7 Model Eclipse 4 183
Korzystanie z modelu Eclipse 4 183Kroki do wykonania mdash instalacja narz dzi Eclipse 4 184Kroki do wykonania mdash tworzenie aplikacji Eclipse 4 186Kroki do wykonania mdash tworzenie cz ci 190Kroki do wykonania mdash obstylowanie interfejsu u ytkownika za pomoc CSS 194Sprawd si mdash u ycie mened era tematoacutew 199
Us ugi i konteksty 199Kroki do wykonania mdash dodanie logowania do dziennika zdarze 199Kroki do wykonania mdash pobranie okna 201Kroki do wykonania mdash uzyskanie zaznaczenia 202Kroki do wykonania mdash korzystanie ze zdarze 204Kroki do wykonania mdash obliczanie warto ci na danie 207Kroki do wykonania mdash u ycie preferencji 209Kroki do wykonania mdash interakcja z interfejsem u ytkownika 211
Korzystanie z polece procedur obs ugi i elementoacutew menu 213Kroki do wykonania mdash powi zanie menu z poleceniem i procedur obs ugi 213Kroki do wykonania mdash przekazywanie parametroacutew polecenia 215Kroki do wykonania mdash utworzenie bezpo redniego menu i skroacutetoacutew klawiszowych 218Kroki do wykonania mdash utworzenie menu kontekstowego i menu widoku 220
Tworzenie w asnych klas do wstrzykiwania 222Kroki do wykonania mdash tworzenie prostej us ugi 222Kroki do wykonania mdash wstrzykiwanie podtypoacutew 223Sprawd si mdash u ycie mostka narz dziowego 224Quiz mdash dzia anie Eclipse 4 224
Podsumowanie 225
Kup książkę Poleć książkę
Spis tre ci
7
Rozdzia 8 Tworzenie funkcjonalno ci witryn aktualizacji aplikacji i produktoacutew 227
Grupowanie wtyczek jako funkcjonalno ci 228Kroki do wykonania mdash tworzenie funkcjonalno ci 228Kroki do wykonania mdash eksport funkcjonalno ci 230Kroki do wykonania mdash instalacja funkcjonalno ci 232Kroki do wykonania mdash kategoryzacja witryny aktualizacji 234Kroki do wykonania mdash zale no od innych funkcjonalno ci 237Kroki do wykonania mdash tworzenie oznacze funkcjonalno ci 239Sprawd si mdash zdalna publikacja zawarto ci 241
Budowanie aplikacji i produktoacutew 241Kroki do wykonania mdash wykonanie aplikacji bez interfejsu u ytkownika 242Kroki do wykonania mdash tworzenie produktu 245Sprawd si mdash tworzenie produktu bazuj cego na funkcjonalno ci 249Quiz mdash sposoacuteb dzia ania funkcjonalno ci aplikacji i produktoacutew 249
Podsumowanie 249
Rozdzia 9 Automatyczne testy wtyczek 251
U ycie frameworku JUnit do testoacutew zautomatyzowanych 251Kroki do wykonania mdash wykonanie prostego przypadku testowego JUnit 252Kroki do wykonania mdash wykonanie testu wtyczki 253
Wykorzystanie SWTBot do testoacutew interfejsu graficznego 254Kroki do wykonania mdash tworzenie testoacutew SWTBot 254Kroki do wykonania mdash korzystanie z menu 256Sprawd si mdash korzystanie z zasoboacutew 258
Korzystanie z SWTBot 258Kroki do wykonania mdash ukrywanie ekranu powitalnego 258Kroki do wykonania mdash unikanie b doacutew wykonania z SWTBot 259
Korzystanie z widokoacutew 260Kroki do wykonania mdash wy wietlenie widokoacutew 260Kroki do wykonania mdash przes uchiwanie widokoacutew 261
Interakcja z interfejsem u ytkownika 262Kroki do wykonania mdash pobranie warto ci z interfejsu u ytkownika 262Kroki do wykonania mdash oczekiwanie na warunek 263Sprawd si mdash sterowanie kreatorem nowej klasy 265Quiz mdash dzia anie SWTBot 265
Podsumowanie 265
Rozdzia 10 Automatyczne budowanie przy u yciu Tycho 267
Wykorzystanie Maven i Tycho do budowania wtyczek Eclipse 267Kroki do wykonania mdash instalacja Maven 268Kroki do wykonania mdash budowanie za pomoc Tycho 270Sprawd si mdash korzystanie z platform docelowych 272
Budowanie funkcjonalno ci i witryn aktualizacji za pomoc Tycho 273Kroki do wykonania mdash tworzenie projektu nadrz dnego 273Kroki do wykonania mdash budowanie funkcjonalno ci 275Kroki do wykonania mdash budowanie witryny aktualizacji 276
Kup książkę Poleć książkę
Spis tre ci
8
Kroki do wykonania mdash budowanie produktu 278Sprawd si mdash zale no od komponentoacutew Maven 282
Testy i publikacja 283Kroki do wykonania mdash uruchomienie testoacutew automatycznych 283Kroki do wykonania mdash zmiana numeru wersji 286Sprawd si mdash w czenie budowania dla pozosta ych wtyczek 288
Podpisywanie witryn aktualizacji 288Kroki do wykonania mdash tworzenie certyfikatu podpisanego przez samego siebie 288Kroki do wykonania mdash podpisywanie wtyczek 290Kroki do wykonania mdash serwer z witryn aktualizacji 292Quiz mdash automatyczne budowanie i witryny aktualizacji 293
Podsumowanie 293
Dodatek A Odpowiedzi do quizoacutew 295
Rozdzia 1 Tworzenie pierwszej wtyczki 295Rozdzia 2 Tworzenie widokoacutew w SWT 296Rozdzia 3 Tworzenie widokoacutew w JFace 298Rozdzia 4 Interakcja z u ytkownikiem 299Rozdzia 5 Przechowywanie preferencji i ustawie 300Rozdzia 6 Korzystanie z zasoboacutew 301Rozdzia 7 Model Eclipse 4 301Rozdzia 8 Tworzenie funkcjonalno ci witryn aktualizacji aplikacji i produktoacutew 303Rozdzia 9 Automatyczne testy wtyczek 303Rozdzia 10 Automatyczne budowanie przy u yciu Tycho 304
Skorowidz 305
Kup książkę Poleć książkę
3
Tworzenie widokoacuteww JFace
W poprzednim rozdziale przyjrzeli my si podstawowym elementom SWTktoacutere stanowi pomost mi dzy elementami systemu operacyjnego a Jav W tym rozdziale
poznamy JFace ktoacutery korzysta z SWT w celu zapewnienia architektury MVCa tak e dostarczenia wielu typowych widgetoacutew u ywanych przez Eclipse
W tym rozdziale utworzymy widok do przedstawiania hierarchicznych danych u yjemy zasoboacutew obrazu czcionki lub koloru wygenerujemy stylizowany tekst posortujemy i przefiltrujemy wpisy w widokach dodamy akcje dla podwoacutejnych klikni zaznaczymy i obs u ymy w a ciwo ci utworzymy widok dla danych tabelarycznych
Dlaczego JFaceCho SWT zapewnia podstawow implementacj prostych widgetoacutew (na przyk ad drzewprzyciskoacutew i etykiet) wszystko dzia a na bardzo podstawowym poziomie bo wykorzystywanes teksty i indeksy zaznacze Aby atwiej wy wietla strukturyzowane dane JFace udost p-nia kilka zaawansowanych widokoacutew ktoacutere stanowi po czenie widgetoacutew SWT i mened eroacutewzdarze co zapewnia wygodn obs ug interfejsu u ytkownika dla strukturyzowanych tre ci
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
84
Istnieje wiele rodzajoacutew zaawansowanych widokoacutew nazywanych viewer (wszystkie dziedziczpo klasie Viewer) ale najcz ciej stosowanymi s te ktoacutere nale do ContentViewer na przyk adTreeViewer i TableViewer Istniej roacutewnie wersje bazuj ce na tek cie (TextViewer ma podklasydla SourceViewer) a tak e widoki operacyjne (ConsoleViewer dla widoku Console lub Detailed-ProgressViewer dla widoku Progress) W tym rozdziale wykonamy widoki bazuj ce na klasachTreeViewer i TableViewer Poniewa JFace bazuje na SWT wiedza na temat szczegoacute oacutewdzia ania SWT jest niezb dna do prawid owego u ytkowania JFace
Tworzenie widokoacutew TreeViewerWiele widgetoacutew w Eclipse bazuje na widoku przypominaj cym drzewo mdash jest to zaroacutewnonawigator plikoacutew jak i okno wy wietlania zawarto ci klas Framework JFace udost pnia klasTreeViewer realizuj c wszystkie niezb dne funkcjonalno ci U yjemy jej do wykonania widokuTimeZoneTreeView
Kroki do wykonania mdash tworzenie obiektu TreeViewerPodobnie jak mia o to miejsce w poprzednim rozdziale nowy widok TimeZoneTreeView utwo-rzymy przy u yciu edytora pluginxml Widok wy wietli strefy czasowe u o one hierarchiczniewzgl dem regionoacutew
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest by otworzy plik pluginxml je li jeszczenie jest otwarty
2 Otwoacuterz zak adk Extensions i znajd element orgeclipseuiviews Kliknij go prawymprzyciskiem myszy i z menu wybierz polecenie NewView Wype nij pola w sposoacutebopisany poni ej
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Name wpisz Widok drzewa stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
3 Zapisz plik Konfigurator umie ci w pliku pluginxml nast puj cy wpis
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTreeView icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTreeView name=Widok drzewa stref czasowych restorable=truegtltviewgt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
85
4 Podobnie jak wcze niej utwoacuterz klas TimeZoneTreeView ktoacutera rozszerza klasViewPart
5 W metodzie createPartControl() utwoacuterz instancj TreeViewer z opcjami V_SCROLLH_SCROLL i MULTI Zapami taj obiekt w polu klasy Zaimplementuj metod setFocus()by ustawia a widok drzewa jako aktywny element
public class TimeZoneTreeView extends ViewPart private TreeViewer treeViewer public void createPartControl(Composite parent) treeViewer = new TreeViewer(parent SWTMULTI | SWTH_SCROLL | SWTV_SCROLL ) public void setFocus() treeViewergetControl()setFocus()
E4 Cho Eclipse 4 zostanie szczegoacute owo omoacutewione w rozdziale 7 warto wspomnie e w Eclipse4 nad metod createPartControl() niezb dna jest adnotacja Inject (by zapewni przekazanieobiektu Composite) a nad metod setFocus() mdash adnotacja Focus
6 Uruchom testow wersj Eclipse i przejd do widoku wybieraj c polecenieWindowShowViewOther ledzenie czasuWidok drzewa stref czasowych
7 W odroacute nieniu od Swing gdzie oczekuje si otrzymywania danych w klasiebazuj cej na konkretnym interfejsie JFace nie wymaga adnej konkretnej klasyW zamian oczekuje obiektu warto ci do wy wietlenia (wej cie) interfejsu ktoacuteryczyta dane (dostawca tre ci) i interfejsu do wy wietlania danych (dostawca etykiet)
8 Utwoacuterz now klas o nazwie TimeZoneLabelProvider dziedzicz ca po LabelProvider(z pakietu orgeclipsejfaceviewers) B dzie zawiera a metod o nazwie getText()ktoacutera otrzymuje obiekt i zamienia go na reprezentacj tekstow Zamiast wywo ywatoString() zwroacute odpowiedni warto zwi zan z MapEntry lub TimeZone
public class TimeZoneLabelProvider extends LabelProvider public String getText(Object element) if (element instanceof Map) return Strefy czasowe
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
86
else if (element instanceof MapEntry) return ((MapEntry) element)getKey()toString() else if (element instanceof TimeZone) return ((TimeZone) element)getID()split()[1] else return Nieznany typ + elementgetClass()
Poniewa obiekt TreeViewer mo e mie wiele korzeni test instanceof Map s u ydo sprawdzenia czy to wierzcho ek drzewa ktoacutery powinien mie nazw Strefyczasowe
9 Warto zapewni warto domy ln mdash nawet je li jest to pusty tekstmdash bo otrzymanie nieznanego typu mo na atwo wy ledzi i naprawi
10 Utwoacuterz now klas TimeZoneContentProvider implementuj c interfejsITreeContentProvider Interfejs wymaga implementacji trzech metod z sze ciu(pozosta e mog pozosta puste) Oto one
hasChildren() mdash zwraca true je li w ze ma potomkoacutew getChildren() mdash zwraca potomkoacutew konkretnego w z a getElements() mdash zapewnia g oacutewne korzenie
11 Metoda hasChildren() zwroacuteci warto true je li zostanie do niej przekazany obiekttypu Map lub Collection ktoacutery nie b dzie pusty Przekazanie MapEntry spowodujewywo anie rekurencyjne Dla drzew bazuj cych na zagnie d onych Map lubCollection metoda hasChildren() b dzie wygl da a identycznie
public boolean hasChildren(Object element) if (element instanceof Map) return ((Map) element)isEmpty() else if (element instanceof MapEntry) return hasChildren(((MapEntry)element)getValue()) else if (element instanceof Collection) return ((Collection) element)isEmpty() else return false
12 Implementacja getChildren() rekurencyjnie wchodzi do obiektoacutew typu MapCollection lub MapEntry stosuj c przy tym opisany wcze niej wzorzec Poniewametoda wymaga zwroacutecenia typu Object[] kod u ywa funkcjonalno ci wbudowanejw klas Map by zamieni zawarto entrySet() na tablic
public Object[] getChildren(Object parentElement) if (parentElement instanceof Map) return ((Map) parentElement)entrySet()toArray()
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
87
else if (parentElement instanceof MapEntry) return getChildren(((MapEntry)parentElement)getValue()) else if (parentElement instanceof Collection) return ((Collection) parentElement)toArray() else return new Object[0]
13 Kluczem przy implementacji ITreeContentProvider jest zapewnienie sta ejsynchronizacji kodu metod getChildren() i hasChildren() Jednym ze sposoboacutewzapewnienia takiej sytuacji jest u ycie w metodzie hasChildren() metodygetChildren() i sprawdzanie czy tablica jest pusta ale wydajno takiej operacjinie b dzie najlepsza je li getChildren() to operacja bardzo z o ona obliczeniowo
14 Poniewa TreeViewer mo e mie wiele korzeni istnieje metoda pobieraj ca tablickorzeni z elementu wej ciowego B d we frameworku JFace uniemo liwiaargumentowi getElements() posiadanie w asnej warto ci Z tego powodu przyj osi e najlepiej przekaza tablic (zawieraj c tylko jeden element) i nast pnie jzwroacuteci Metoda przedstawiona poni ej b dzie najprawdopodobniej wygl da atak samo dla ka dej klasy TreeContentProvider ktoacuter kiedykolwiek napiszesz
public Object[] getElements(Object inputElement) if (inputElement instanceof Object[]) return (Object[]) inputElement else return new Object[0]
15 Po zako czeniu tworzenia odpowiednich klas dostawcoacutew danych przejd dometody createPartControl() klasy TimeZoneTreeView by po czy dostawcoacutewz obiektem widoku i ustali obiekt b d cy roacuted em danych
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetContentProvider(new TimeZoneContentProvider())treeViewersetInput(new Object[]TimeZoneComparatorgetTimeZones())
16 Uruchom testow wersj Eclipse i otwoacuterz widok poleceniem WindowShowViewOther ledzenie czasuWidok drzewa stref czasowych by zobaczy efekt ko cowy
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
88
Co si sta oDane do TreeViewer przekazali my przy u yciu metody setInput() Metoda prawie zawszeotrzymuje tablic obiektoacutew nawet je li jest to tylko jeden element
Aby zapewni rozpakowanie struktury danych interfejs ITreeContentProvider udost pniadwie kluczowe metody mdash hasChildren() i getChildren() Umo liwiaj one przechodzenieprzez struktur danych na danie gdy u ytkownik zwija lub rozwija ga zie drzewa Powodemistnienia dwoacutech metod jest fakt i obliczenia w metodzie getChildren() mog by bardzokosztowne Metoda hasChildren() s u y do sprawdzenia czy nale y wy wietli ikon rozwi-ni cia w z a Wywo anie metody getChildren() jest opoacute nione a do momentu faktycznegootwarcia w z a
W strukturach danych ktoacutere to zapewniaj warto roacutewnie zaimplementowa metod getParent()umo liwia ona dost p do obiektu Je li jest zaimplementowana wywo anie viewerreveal(Object)powoduje rozwini cie w z oacutew w hierarchii by ods oni wskazany obiekt
Do wy wietlenia etykiet na drzewie s u y klasa LabelProvider Dostarcza ona etykiet(i opcjonalny obrazek) dla ka dego elementu Dla ka dego typu obiektu mo na u y innejikony Z rozwi zania tego skorzystano w widoku Package z perspektywy Java ktoacutery wy wietlaikon klasy dla klas ikon pakietu dla pakietoacutew i tak dalej
Klasa LabelProvider mo e wy wietla komunikaty na roacute ne sposoby Nic nie stoi na prze-szkodzie by doda do etykiety informacj o przesuni ciu czasowym (roacute nic mi dzy konkretnstref czasow i czasem GMT)
Kroki do wykonania mdash JFace i obrazyKlasa TimeZoneLabelProvider mo e zwroacuteci obiekt Image b d cy standardowym widgetem SWTCho obraz (obiekt Image) mo na wczyta w sposoacuteb podobny jak w poprzednim rozdziale JFaceoferuje rejestry zasoboacutew s u ce do zarz dzania zestawami zasoboacutew aplikacji Rejestry obs u-guj klasy ImageRegistry FontRegistry i ColorRegistry Rejestr zasoboacutew ma za zadanie prze-chowywa list obiektoacutew Resource i zwalnia je we w a ciwy sposoacuteb ale tylko wtedy gdy nies ju potrzebne
JFace posiada rejestry globalne ale istniej roacutewnie rejestry bardziej szczegoacute owe u ywaneprzez IDE na przyk ad do przechowywania list ikon folderoacutew i plikoacutew W rejestrze tego typukorzysta si z deskryptoroacutew do okre lania konkretnych zasoboacutew wi c po przekazaniu de-skryptora otrzymuje si odpowiadaj c mu instancj zasobu Zwroacuteconym zasobem zarz dzarejestr wi c kod ktoacutery go otrzyma nie powinien go zwalnia
1 W TimeZoneLabelProvider dodaj metod getImage() w ktoacuterej u ywa si rejestruobrazoacutew ImageRegistry by pobra ikon folderu Oto kod metody
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
89
public Image getImage(Object element) if(element instanceof MapEntry) returnPlatformUIgetWorkbench()getSharedImages()getImage(ISharedImagesIMG_OBJ_FOLDER) else return supergetImage(element)
2 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowych Oboktekstu z nazw regionu pojawi si ikona folderu Instancji Image nie trzeba niszczysamodzielnie poniewa nale y do wtyczki PlatformUI (zasoacuteb obrazu zostaniezwolniony w momencie wy czania PlatformUI)
E4 W Eclipse 4 instancj ISharedImages mo na otrzyma poprzez wstrzykni cie
Injectprivate ISharedImages imagesimagesgetImage(ISharedImagesIMG_OBJ_FOLDER)
3 By otrzyma inny obraz u yj globalnych instancji ImageRegistry lub JFaceRegistrylub utwoacuterz w asn kopi Zastosowanie globalnej wersji oznacza e obraz Imagenigdy nie zostanie zniszczony poniewa JFaceRegistry istnieje przez ca y czasycia instancji Eclipse
Zamiast tego utwoacuterz obiekty LocalResourceManager i ImageRegistry powi zanez cyklem ycia kontrolki Gdy kontrolka nadrz dna b dzie usuwana automatycznieusuni te zostan roacutewnie obrazy Umie w metodzie CreatePartControl klasyTimeZoneTreeView poni szy kod
public void createPartControl(Composite parent) ResourceManager rm = JFaceResourcesgetResources() LocalResourceManager lrm = new LocalResourceManager(rmparent)
4 U ywaj c obiektu LocalResourceManger utwoacuterz instancj ImageRegistry i za pomocmetody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL
ImageRegistry ir = new ImageRegistry(lrm)URL sample = getClass()getResource(iconssamplegif)irput(sample ImageDescriptorcreateFromURL(sample))
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Spis tre ci
Przedmowa 15
Rozdzia 1 Tworzenie pierwszej wtyczki 21
Przygotowanie rodowiska 21Kroki do wykonania mdash konfiguracja rodowiska Eclipse SDK 22
Tworzenie pierwszej wtyczki 25Kroki do wykonania mdash tworzenie wtyczki 25Quiz mdash przestrzenie nazw i wtyczki Eclipse 28
Uruchomienie wtyczki 28Kroki do wykonania mdash uruchomienie Eclipse z poziomu Eclipse 28Quiz mdash uruchamianie Eclipse 31Sprawd si mdash modyfikacja wtyczki 31
Debugowanie wtyczki 31Kroki do wykonania mdash debugowanie wtyczki 31Kroki do wykonania mdash aktualizacja kodu w debuggerze 34
Debugowanie z filtrami krokoacutew 35Kroki do wykonania mdash ustawienie filtru krokoacutew 35
Korzystanie z roacute nych rodzajoacutew punktoacutew wstrzymania 37Kroki do wykonania mdash wstrzymanie przy wej ciu do metody lub wyj ciu z niej 37
Warunkowe punkty wstrzymania 38Kroki do wykonania mdash ustawienie warunkowego punktu wstrzymania 39
Wstrzymanie dzia ania po wyst pieniu wyj tku 40Kroki do wykonania mdash wy apywanie wyj tkoacutew 40Kroki do wykonania mdash obserwacja zmiennych i wyra e 43Quiz mdash debugowanie 45Sprawd si mdash korzystanie z punktoacutew wstrzymania 45
Podsumowanie 46
Rozdzia 2 Tworzenie widokoacutew w SWT 47
Tworzenie widokoacutew i widgetoacutew 48Kroki do wykonania mdash tworzenie widoku 48Kroki do wykonania mdash rysowanie w asnego widoku 50Kroki do wykonania mdash rysowanie wskazoacutewki sekund 53
Kup książkę Poleć książkę
Spis tre ci
4
Kroki do wykonania mdash animacja wskazoacutewki sekund 54Kroki do wykonania mdash uruchomienie w w tku interfejsu u ytkownika 55Kroki do wykonania mdash tworzenie widgetu wielokrotnego u ytku 56Kroki do wykonania mdash korzystanie z uk adu graficznego widoku 58Quiz mdash dzia anie widokoacutew 61Sprawd si mdash wskazoacutewki minut i godzin 61
Zarz dzanie zasobami 61Kroki do wykonania mdash wi cej koloroacutew 62Kroki do wykonania mdash znajdowanie wycieku 63Kroki do wykonania mdash zatykanie wycieku 65Quiz mdash dzia anie zasoboacutew 67Sprawd si mdash rozbudowa widgetu zegara 67
Interakcja z u ytkownikiem 67Kroki do wykonania mdash uzyskiwanie aktywno ci 67Kroki do wykonania mdash reakcja na dzia ania u ytkownika 69Quiz mdash dzia anie widgetoacutew 70Sprawd si mdash aktualizacja widgetu zegara 70
Korzystanie z innych widgetoacutew SWT 71Kroki do wykonania mdash dodanie elementoacutew do zasobnika 71Kroki do wykonania mdash reakcja na akcje u ytkownika 73Kroki do wykonania mdash obiekty modalne i inne efekty 74Kroki do wykonania mdash grupy i zak adki 76Quiz mdash korzystanie z SWT 82Sprawd si mdash rozbudowa widoku stref czasowych 82
Podsumowanie 82
Rozdzia 3 Tworzenie widokoacutew w JFace 83
Dlaczego JFace 83Tworzenie widokoacutew TreeViewer 84
Kroki do wykonania mdash tworzenie obiektu TreeViewer 84Kroki do wykonania mdash JFace i obrazy 88Kroki do wykonania mdash style w dostawcy etykiet 91Quiz mdash podstawy JFace 93Sprawd si mdash dodanie obrazoacutew dla regionoacutew 93
Sortowanie i filtracja 93Kroki do wykonania mdash sortowanie elementoacutew w widoku 94Kroki do wykonania mdash filtrowanie elementoacutew w widoku 95Quiz mdash sortowanie i filtracja 97Sprawd si mdash rozwijanie ga zi i filtracja 97
Interakcje i w a ciwo ci 98Kroki do wykonania mdash dodanie procedury obs ugi podwoacutejnego klikni cia 98Kroki do wykonania mdash wy wietlanie w a ciwo ci 101Quiz mdash dzia anie w a ciwo ci 105
Dane tabelaryczne 105Kroki do wykonania mdash przegl danie stref czasowych w tabeli 105Kroki do wykonania mdash synchronizacja wyboru 109Quiz mdash dzia anie tabel 111
Podsumowanie 112
Kup książkę Poleć książkę
Spis tre ci
5
Rozdzia 4 Interakcja z u ytkownikiem 113
Tworzenie akcji polece i procedur obs ugi 113Kroki do wykonania mdash dodanie menu kontekstowego 114Kroki do wykonania mdash tworzenie polece i procedur obs ugi 115Kroki do wykonania mdash powi zanie polece ze skroacutetami 117Kroki do wykonania mdash zmiana kontekstu 119Kroki do wykonania mdash w czanie i wy czanie elementoacutew menu 121Kroki do wykonania mdash wielokrotne u ycie wyra e 123Kroki do wykonania mdash dodanie polece do menu kontekstowego 124Sprawd si mdash wykorzystanie menu i paskoacutew narz dziowych 126Quiz mdash dzia anie menu 127
Zadania i paski post pu 127Kroki do wykonania mdash uruchamianie operacji dzia aj cych w tle 127Sprawd si mdash u ycie zadania UIJob 129Kroki do wykonania mdash raportowanie post pu prac 129Kroki do wykonania mdash sprawdzanie anulowania zadania 131Kroki do wykonania mdash podzadania i ich monitorowanie 131Kroki do wykonania mdash u ycie monitoroacutew i podmonitoroacutew typu null 133Kroki do wykonania mdash ustawienie w a ciwo ci klasy Job 135Sprawd si mdash wy wietlanie zadania w pasku systemowym 138Quiz mdash korzystanie z zada 138
Zg aszanie b doacutew 138Kroki do wykonania mdash wy wietlanie b doacutew 138Quiz mdash zg aszanie b doacutew 141
Podsumowanie 142
Rozdzia 5 Przechowywanie preferencji i ustawie 143
Przechowywanie preferencji 143Kroki do wykonania mdash trwa o warto ci 144Kroki do wykonania mdash utworzenie strony preferencji 145Kroki do wykonania mdash tworzenie komunikatoacutew ostrze e i b doacutew 146Kroki do wykonania mdash wyboacuter elementu z listy 147Kroki do wykonania mdash dodanie siatki 149Kroki do wykonania mdash lokalizacja strony preferencji 150Kroki do wykonania mdash u ycie innych edytoroacutew poacutel 151Kroki do wykonania mdash dodanie s oacutew kluczowych 153Kroki do wykonania mdash u ycie IEclipsePreferences 154Sprawd si mdash t umaczenie na inne j zyki 155
U ycie IMemento i DialogSettings 155Kroki do wykonania mdash dodanie IMemento do widoku stref czasowych 156Kroki do wykonania mdash u ycie DialogSettings 157Quiz mdash dzia anie preferencji 159
Podsumowanie 159
Kup książkę Poleć książkę
Spis tre ci
6
Rozdzia 6 Korzystanie z zasoboacutew 161
Korzystanie z przestrzeni roboczych i zasoboacutew 161Kroki do wykonania mdash tworzenie edytora 162Kroki do wykonania mdash tworzenie parsera 164Kroki do wykonania mdash tworzenie systemu buduj cego 165Kroki do wykonania mdash iteracja przez zasoby 168Kroki do wykonania mdash tworzenie zasoboacutew 170Kroki do wykonania mdash implementacja budowania inkrementacyjnego 172Kroki do wykonania mdash obs uga usuni cia 172Sprawd si mdash rozbudowa mechanizmu budowania 174
U ycie charakteroacutew projektu 175Kroki do wykonania mdash tworzenie charakteru projektu 175Sprawd si mdash ukrywanie charakteru 178
U ycie znacznikoacutew 178Kroki do wykonania mdash znacznik b du gdy plik jest pusty 179Kroki do wykonania mdash rejestracja rodzaju znacznika 180Sprawd si mdash prawid owe dzia anie gdy plik jest naprawd pusty 181Quiz mdash obs uga zasoboacutew procesu budowania i znacznikoacutew 182
Podsumowanie 182
Rozdzia 7 Model Eclipse 4 183
Korzystanie z modelu Eclipse 4 183Kroki do wykonania mdash instalacja narz dzi Eclipse 4 184Kroki do wykonania mdash tworzenie aplikacji Eclipse 4 186Kroki do wykonania mdash tworzenie cz ci 190Kroki do wykonania mdash obstylowanie interfejsu u ytkownika za pomoc CSS 194Sprawd si mdash u ycie mened era tematoacutew 199
Us ugi i konteksty 199Kroki do wykonania mdash dodanie logowania do dziennika zdarze 199Kroki do wykonania mdash pobranie okna 201Kroki do wykonania mdash uzyskanie zaznaczenia 202Kroki do wykonania mdash korzystanie ze zdarze 204Kroki do wykonania mdash obliczanie warto ci na danie 207Kroki do wykonania mdash u ycie preferencji 209Kroki do wykonania mdash interakcja z interfejsem u ytkownika 211
Korzystanie z polece procedur obs ugi i elementoacutew menu 213Kroki do wykonania mdash powi zanie menu z poleceniem i procedur obs ugi 213Kroki do wykonania mdash przekazywanie parametroacutew polecenia 215Kroki do wykonania mdash utworzenie bezpo redniego menu i skroacutetoacutew klawiszowych 218Kroki do wykonania mdash utworzenie menu kontekstowego i menu widoku 220
Tworzenie w asnych klas do wstrzykiwania 222Kroki do wykonania mdash tworzenie prostej us ugi 222Kroki do wykonania mdash wstrzykiwanie podtypoacutew 223Sprawd si mdash u ycie mostka narz dziowego 224Quiz mdash dzia anie Eclipse 4 224
Podsumowanie 225
Kup książkę Poleć książkę
Spis tre ci
7
Rozdzia 8 Tworzenie funkcjonalno ci witryn aktualizacji aplikacji i produktoacutew 227
Grupowanie wtyczek jako funkcjonalno ci 228Kroki do wykonania mdash tworzenie funkcjonalno ci 228Kroki do wykonania mdash eksport funkcjonalno ci 230Kroki do wykonania mdash instalacja funkcjonalno ci 232Kroki do wykonania mdash kategoryzacja witryny aktualizacji 234Kroki do wykonania mdash zale no od innych funkcjonalno ci 237Kroki do wykonania mdash tworzenie oznacze funkcjonalno ci 239Sprawd si mdash zdalna publikacja zawarto ci 241
Budowanie aplikacji i produktoacutew 241Kroki do wykonania mdash wykonanie aplikacji bez interfejsu u ytkownika 242Kroki do wykonania mdash tworzenie produktu 245Sprawd si mdash tworzenie produktu bazuj cego na funkcjonalno ci 249Quiz mdash sposoacuteb dzia ania funkcjonalno ci aplikacji i produktoacutew 249
Podsumowanie 249
Rozdzia 9 Automatyczne testy wtyczek 251
U ycie frameworku JUnit do testoacutew zautomatyzowanych 251Kroki do wykonania mdash wykonanie prostego przypadku testowego JUnit 252Kroki do wykonania mdash wykonanie testu wtyczki 253
Wykorzystanie SWTBot do testoacutew interfejsu graficznego 254Kroki do wykonania mdash tworzenie testoacutew SWTBot 254Kroki do wykonania mdash korzystanie z menu 256Sprawd si mdash korzystanie z zasoboacutew 258
Korzystanie z SWTBot 258Kroki do wykonania mdash ukrywanie ekranu powitalnego 258Kroki do wykonania mdash unikanie b doacutew wykonania z SWTBot 259
Korzystanie z widokoacutew 260Kroki do wykonania mdash wy wietlenie widokoacutew 260Kroki do wykonania mdash przes uchiwanie widokoacutew 261
Interakcja z interfejsem u ytkownika 262Kroki do wykonania mdash pobranie warto ci z interfejsu u ytkownika 262Kroki do wykonania mdash oczekiwanie na warunek 263Sprawd si mdash sterowanie kreatorem nowej klasy 265Quiz mdash dzia anie SWTBot 265
Podsumowanie 265
Rozdzia 10 Automatyczne budowanie przy u yciu Tycho 267
Wykorzystanie Maven i Tycho do budowania wtyczek Eclipse 267Kroki do wykonania mdash instalacja Maven 268Kroki do wykonania mdash budowanie za pomoc Tycho 270Sprawd si mdash korzystanie z platform docelowych 272
Budowanie funkcjonalno ci i witryn aktualizacji za pomoc Tycho 273Kroki do wykonania mdash tworzenie projektu nadrz dnego 273Kroki do wykonania mdash budowanie funkcjonalno ci 275Kroki do wykonania mdash budowanie witryny aktualizacji 276
Kup książkę Poleć książkę
Spis tre ci
8
Kroki do wykonania mdash budowanie produktu 278Sprawd si mdash zale no od komponentoacutew Maven 282
Testy i publikacja 283Kroki do wykonania mdash uruchomienie testoacutew automatycznych 283Kroki do wykonania mdash zmiana numeru wersji 286Sprawd si mdash w czenie budowania dla pozosta ych wtyczek 288
Podpisywanie witryn aktualizacji 288Kroki do wykonania mdash tworzenie certyfikatu podpisanego przez samego siebie 288Kroki do wykonania mdash podpisywanie wtyczek 290Kroki do wykonania mdash serwer z witryn aktualizacji 292Quiz mdash automatyczne budowanie i witryny aktualizacji 293
Podsumowanie 293
Dodatek A Odpowiedzi do quizoacutew 295
Rozdzia 1 Tworzenie pierwszej wtyczki 295Rozdzia 2 Tworzenie widokoacutew w SWT 296Rozdzia 3 Tworzenie widokoacutew w JFace 298Rozdzia 4 Interakcja z u ytkownikiem 299Rozdzia 5 Przechowywanie preferencji i ustawie 300Rozdzia 6 Korzystanie z zasoboacutew 301Rozdzia 7 Model Eclipse 4 301Rozdzia 8 Tworzenie funkcjonalno ci witryn aktualizacji aplikacji i produktoacutew 303Rozdzia 9 Automatyczne testy wtyczek 303Rozdzia 10 Automatyczne budowanie przy u yciu Tycho 304
Skorowidz 305
Kup książkę Poleć książkę
3
Tworzenie widokoacuteww JFace
W poprzednim rozdziale przyjrzeli my si podstawowym elementom SWTktoacutere stanowi pomost mi dzy elementami systemu operacyjnego a Jav W tym rozdziale
poznamy JFace ktoacutery korzysta z SWT w celu zapewnienia architektury MVCa tak e dostarczenia wielu typowych widgetoacutew u ywanych przez Eclipse
W tym rozdziale utworzymy widok do przedstawiania hierarchicznych danych u yjemy zasoboacutew obrazu czcionki lub koloru wygenerujemy stylizowany tekst posortujemy i przefiltrujemy wpisy w widokach dodamy akcje dla podwoacutejnych klikni zaznaczymy i obs u ymy w a ciwo ci utworzymy widok dla danych tabelarycznych
Dlaczego JFaceCho SWT zapewnia podstawow implementacj prostych widgetoacutew (na przyk ad drzewprzyciskoacutew i etykiet) wszystko dzia a na bardzo podstawowym poziomie bo wykorzystywanes teksty i indeksy zaznacze Aby atwiej wy wietla strukturyzowane dane JFace udost p-nia kilka zaawansowanych widokoacutew ktoacutere stanowi po czenie widgetoacutew SWT i mened eroacutewzdarze co zapewnia wygodn obs ug interfejsu u ytkownika dla strukturyzowanych tre ci
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
84
Istnieje wiele rodzajoacutew zaawansowanych widokoacutew nazywanych viewer (wszystkie dziedziczpo klasie Viewer) ale najcz ciej stosowanymi s te ktoacutere nale do ContentViewer na przyk adTreeViewer i TableViewer Istniej roacutewnie wersje bazuj ce na tek cie (TextViewer ma podklasydla SourceViewer) a tak e widoki operacyjne (ConsoleViewer dla widoku Console lub Detailed-ProgressViewer dla widoku Progress) W tym rozdziale wykonamy widoki bazuj ce na klasachTreeViewer i TableViewer Poniewa JFace bazuje na SWT wiedza na temat szczegoacute oacutewdzia ania SWT jest niezb dna do prawid owego u ytkowania JFace
Tworzenie widokoacutew TreeViewerWiele widgetoacutew w Eclipse bazuje na widoku przypominaj cym drzewo mdash jest to zaroacutewnonawigator plikoacutew jak i okno wy wietlania zawarto ci klas Framework JFace udost pnia klasTreeViewer realizuj c wszystkie niezb dne funkcjonalno ci U yjemy jej do wykonania widokuTimeZoneTreeView
Kroki do wykonania mdash tworzenie obiektu TreeViewerPodobnie jak mia o to miejsce w poprzednim rozdziale nowy widok TimeZoneTreeView utwo-rzymy przy u yciu edytora pluginxml Widok wy wietli strefy czasowe u o one hierarchiczniewzgl dem regionoacutew
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest by otworzy plik pluginxml je li jeszczenie jest otwarty
2 Otwoacuterz zak adk Extensions i znajd element orgeclipseuiviews Kliknij go prawymprzyciskiem myszy i z menu wybierz polecenie NewView Wype nij pola w sposoacutebopisany poni ej
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Name wpisz Widok drzewa stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
3 Zapisz plik Konfigurator umie ci w pliku pluginxml nast puj cy wpis
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTreeView icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTreeView name=Widok drzewa stref czasowych restorable=truegtltviewgt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
85
4 Podobnie jak wcze niej utwoacuterz klas TimeZoneTreeView ktoacutera rozszerza klasViewPart
5 W metodzie createPartControl() utwoacuterz instancj TreeViewer z opcjami V_SCROLLH_SCROLL i MULTI Zapami taj obiekt w polu klasy Zaimplementuj metod setFocus()by ustawia a widok drzewa jako aktywny element
public class TimeZoneTreeView extends ViewPart private TreeViewer treeViewer public void createPartControl(Composite parent) treeViewer = new TreeViewer(parent SWTMULTI | SWTH_SCROLL | SWTV_SCROLL ) public void setFocus() treeViewergetControl()setFocus()
E4 Cho Eclipse 4 zostanie szczegoacute owo omoacutewione w rozdziale 7 warto wspomnie e w Eclipse4 nad metod createPartControl() niezb dna jest adnotacja Inject (by zapewni przekazanieobiektu Composite) a nad metod setFocus() mdash adnotacja Focus
6 Uruchom testow wersj Eclipse i przejd do widoku wybieraj c polecenieWindowShowViewOther ledzenie czasuWidok drzewa stref czasowych
7 W odroacute nieniu od Swing gdzie oczekuje si otrzymywania danych w klasiebazuj cej na konkretnym interfejsie JFace nie wymaga adnej konkretnej klasyW zamian oczekuje obiektu warto ci do wy wietlenia (wej cie) interfejsu ktoacuteryczyta dane (dostawca tre ci) i interfejsu do wy wietlania danych (dostawca etykiet)
8 Utwoacuterz now klas o nazwie TimeZoneLabelProvider dziedzicz ca po LabelProvider(z pakietu orgeclipsejfaceviewers) B dzie zawiera a metod o nazwie getText()ktoacutera otrzymuje obiekt i zamienia go na reprezentacj tekstow Zamiast wywo ywatoString() zwroacute odpowiedni warto zwi zan z MapEntry lub TimeZone
public class TimeZoneLabelProvider extends LabelProvider public String getText(Object element) if (element instanceof Map) return Strefy czasowe
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
86
else if (element instanceof MapEntry) return ((MapEntry) element)getKey()toString() else if (element instanceof TimeZone) return ((TimeZone) element)getID()split()[1] else return Nieznany typ + elementgetClass()
Poniewa obiekt TreeViewer mo e mie wiele korzeni test instanceof Map s u ydo sprawdzenia czy to wierzcho ek drzewa ktoacutery powinien mie nazw Strefyczasowe
9 Warto zapewni warto domy ln mdash nawet je li jest to pusty tekstmdash bo otrzymanie nieznanego typu mo na atwo wy ledzi i naprawi
10 Utwoacuterz now klas TimeZoneContentProvider implementuj c interfejsITreeContentProvider Interfejs wymaga implementacji trzech metod z sze ciu(pozosta e mog pozosta puste) Oto one
hasChildren() mdash zwraca true je li w ze ma potomkoacutew getChildren() mdash zwraca potomkoacutew konkretnego w z a getElements() mdash zapewnia g oacutewne korzenie
11 Metoda hasChildren() zwroacuteci warto true je li zostanie do niej przekazany obiekttypu Map lub Collection ktoacutery nie b dzie pusty Przekazanie MapEntry spowodujewywo anie rekurencyjne Dla drzew bazuj cych na zagnie d onych Map lubCollection metoda hasChildren() b dzie wygl da a identycznie
public boolean hasChildren(Object element) if (element instanceof Map) return ((Map) element)isEmpty() else if (element instanceof MapEntry) return hasChildren(((MapEntry)element)getValue()) else if (element instanceof Collection) return ((Collection) element)isEmpty() else return false
12 Implementacja getChildren() rekurencyjnie wchodzi do obiektoacutew typu MapCollection lub MapEntry stosuj c przy tym opisany wcze niej wzorzec Poniewametoda wymaga zwroacutecenia typu Object[] kod u ywa funkcjonalno ci wbudowanejw klas Map by zamieni zawarto entrySet() na tablic
public Object[] getChildren(Object parentElement) if (parentElement instanceof Map) return ((Map) parentElement)entrySet()toArray()
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
87
else if (parentElement instanceof MapEntry) return getChildren(((MapEntry)parentElement)getValue()) else if (parentElement instanceof Collection) return ((Collection) parentElement)toArray() else return new Object[0]
13 Kluczem przy implementacji ITreeContentProvider jest zapewnienie sta ejsynchronizacji kodu metod getChildren() i hasChildren() Jednym ze sposoboacutewzapewnienia takiej sytuacji jest u ycie w metodzie hasChildren() metodygetChildren() i sprawdzanie czy tablica jest pusta ale wydajno takiej operacjinie b dzie najlepsza je li getChildren() to operacja bardzo z o ona obliczeniowo
14 Poniewa TreeViewer mo e mie wiele korzeni istnieje metoda pobieraj ca tablickorzeni z elementu wej ciowego B d we frameworku JFace uniemo liwiaargumentowi getElements() posiadanie w asnej warto ci Z tego powodu przyj osi e najlepiej przekaza tablic (zawieraj c tylko jeden element) i nast pnie jzwroacuteci Metoda przedstawiona poni ej b dzie najprawdopodobniej wygl da atak samo dla ka dej klasy TreeContentProvider ktoacuter kiedykolwiek napiszesz
public Object[] getElements(Object inputElement) if (inputElement instanceof Object[]) return (Object[]) inputElement else return new Object[0]
15 Po zako czeniu tworzenia odpowiednich klas dostawcoacutew danych przejd dometody createPartControl() klasy TimeZoneTreeView by po czy dostawcoacutewz obiektem widoku i ustali obiekt b d cy roacuted em danych
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetContentProvider(new TimeZoneContentProvider())treeViewersetInput(new Object[]TimeZoneComparatorgetTimeZones())
16 Uruchom testow wersj Eclipse i otwoacuterz widok poleceniem WindowShowViewOther ledzenie czasuWidok drzewa stref czasowych by zobaczy efekt ko cowy
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
88
Co si sta oDane do TreeViewer przekazali my przy u yciu metody setInput() Metoda prawie zawszeotrzymuje tablic obiektoacutew nawet je li jest to tylko jeden element
Aby zapewni rozpakowanie struktury danych interfejs ITreeContentProvider udost pniadwie kluczowe metody mdash hasChildren() i getChildren() Umo liwiaj one przechodzenieprzez struktur danych na danie gdy u ytkownik zwija lub rozwija ga zie drzewa Powodemistnienia dwoacutech metod jest fakt i obliczenia w metodzie getChildren() mog by bardzokosztowne Metoda hasChildren() s u y do sprawdzenia czy nale y wy wietli ikon rozwi-ni cia w z a Wywo anie metody getChildren() jest opoacute nione a do momentu faktycznegootwarcia w z a
W strukturach danych ktoacutere to zapewniaj warto roacutewnie zaimplementowa metod getParent()umo liwia ona dost p do obiektu Je li jest zaimplementowana wywo anie viewerreveal(Object)powoduje rozwini cie w z oacutew w hierarchii by ods oni wskazany obiekt
Do wy wietlenia etykiet na drzewie s u y klasa LabelProvider Dostarcza ona etykiet(i opcjonalny obrazek) dla ka dego elementu Dla ka dego typu obiektu mo na u y innejikony Z rozwi zania tego skorzystano w widoku Package z perspektywy Java ktoacutery wy wietlaikon klasy dla klas ikon pakietu dla pakietoacutew i tak dalej
Klasa LabelProvider mo e wy wietla komunikaty na roacute ne sposoby Nic nie stoi na prze-szkodzie by doda do etykiety informacj o przesuni ciu czasowym (roacute nic mi dzy konkretnstref czasow i czasem GMT)
Kroki do wykonania mdash JFace i obrazyKlasa TimeZoneLabelProvider mo e zwroacuteci obiekt Image b d cy standardowym widgetem SWTCho obraz (obiekt Image) mo na wczyta w sposoacuteb podobny jak w poprzednim rozdziale JFaceoferuje rejestry zasoboacutew s u ce do zarz dzania zestawami zasoboacutew aplikacji Rejestry obs u-guj klasy ImageRegistry FontRegistry i ColorRegistry Rejestr zasoboacutew ma za zadanie prze-chowywa list obiektoacutew Resource i zwalnia je we w a ciwy sposoacuteb ale tylko wtedy gdy nies ju potrzebne
JFace posiada rejestry globalne ale istniej roacutewnie rejestry bardziej szczegoacute owe u ywaneprzez IDE na przyk ad do przechowywania list ikon folderoacutew i plikoacutew W rejestrze tego typukorzysta si z deskryptoroacutew do okre lania konkretnych zasoboacutew wi c po przekazaniu de-skryptora otrzymuje si odpowiadaj c mu instancj zasobu Zwroacuteconym zasobem zarz dzarejestr wi c kod ktoacutery go otrzyma nie powinien go zwalnia
1 W TimeZoneLabelProvider dodaj metod getImage() w ktoacuterej u ywa si rejestruobrazoacutew ImageRegistry by pobra ikon folderu Oto kod metody
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
89
public Image getImage(Object element) if(element instanceof MapEntry) returnPlatformUIgetWorkbench()getSharedImages()getImage(ISharedImagesIMG_OBJ_FOLDER) else return supergetImage(element)
2 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowych Oboktekstu z nazw regionu pojawi si ikona folderu Instancji Image nie trzeba niszczysamodzielnie poniewa nale y do wtyczki PlatformUI (zasoacuteb obrazu zostaniezwolniony w momencie wy czania PlatformUI)
E4 W Eclipse 4 instancj ISharedImages mo na otrzyma poprzez wstrzykni cie
Injectprivate ISharedImages imagesimagesgetImage(ISharedImagesIMG_OBJ_FOLDER)
3 By otrzyma inny obraz u yj globalnych instancji ImageRegistry lub JFaceRegistrylub utwoacuterz w asn kopi Zastosowanie globalnej wersji oznacza e obraz Imagenigdy nie zostanie zniszczony poniewa JFaceRegistry istnieje przez ca y czasycia instancji Eclipse
Zamiast tego utwoacuterz obiekty LocalResourceManager i ImageRegistry powi zanez cyklem ycia kontrolki Gdy kontrolka nadrz dna b dzie usuwana automatycznieusuni te zostan roacutewnie obrazy Umie w metodzie CreatePartControl klasyTimeZoneTreeView poni szy kod
public void createPartControl(Composite parent) ResourceManager rm = JFaceResourcesgetResources() LocalResourceManager lrm = new LocalResourceManager(rmparent)
4 U ywaj c obiektu LocalResourceManger utwoacuterz instancj ImageRegistry i za pomocmetody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL
ImageRegistry ir = new ImageRegistry(lrm)URL sample = getClass()getResource(iconssamplegif)irput(sample ImageDescriptorcreateFromURL(sample))
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Spis tre ci
4
Kroki do wykonania mdash animacja wskazoacutewki sekund 54Kroki do wykonania mdash uruchomienie w w tku interfejsu u ytkownika 55Kroki do wykonania mdash tworzenie widgetu wielokrotnego u ytku 56Kroki do wykonania mdash korzystanie z uk adu graficznego widoku 58Quiz mdash dzia anie widokoacutew 61Sprawd si mdash wskazoacutewki minut i godzin 61
Zarz dzanie zasobami 61Kroki do wykonania mdash wi cej koloroacutew 62Kroki do wykonania mdash znajdowanie wycieku 63Kroki do wykonania mdash zatykanie wycieku 65Quiz mdash dzia anie zasoboacutew 67Sprawd si mdash rozbudowa widgetu zegara 67
Interakcja z u ytkownikiem 67Kroki do wykonania mdash uzyskiwanie aktywno ci 67Kroki do wykonania mdash reakcja na dzia ania u ytkownika 69Quiz mdash dzia anie widgetoacutew 70Sprawd si mdash aktualizacja widgetu zegara 70
Korzystanie z innych widgetoacutew SWT 71Kroki do wykonania mdash dodanie elementoacutew do zasobnika 71Kroki do wykonania mdash reakcja na akcje u ytkownika 73Kroki do wykonania mdash obiekty modalne i inne efekty 74Kroki do wykonania mdash grupy i zak adki 76Quiz mdash korzystanie z SWT 82Sprawd si mdash rozbudowa widoku stref czasowych 82
Podsumowanie 82
Rozdzia 3 Tworzenie widokoacutew w JFace 83
Dlaczego JFace 83Tworzenie widokoacutew TreeViewer 84
Kroki do wykonania mdash tworzenie obiektu TreeViewer 84Kroki do wykonania mdash JFace i obrazy 88Kroki do wykonania mdash style w dostawcy etykiet 91Quiz mdash podstawy JFace 93Sprawd si mdash dodanie obrazoacutew dla regionoacutew 93
Sortowanie i filtracja 93Kroki do wykonania mdash sortowanie elementoacutew w widoku 94Kroki do wykonania mdash filtrowanie elementoacutew w widoku 95Quiz mdash sortowanie i filtracja 97Sprawd si mdash rozwijanie ga zi i filtracja 97
Interakcje i w a ciwo ci 98Kroki do wykonania mdash dodanie procedury obs ugi podwoacutejnego klikni cia 98Kroki do wykonania mdash wy wietlanie w a ciwo ci 101Quiz mdash dzia anie w a ciwo ci 105
Dane tabelaryczne 105Kroki do wykonania mdash przegl danie stref czasowych w tabeli 105Kroki do wykonania mdash synchronizacja wyboru 109Quiz mdash dzia anie tabel 111
Podsumowanie 112
Kup książkę Poleć książkę
Spis tre ci
5
Rozdzia 4 Interakcja z u ytkownikiem 113
Tworzenie akcji polece i procedur obs ugi 113Kroki do wykonania mdash dodanie menu kontekstowego 114Kroki do wykonania mdash tworzenie polece i procedur obs ugi 115Kroki do wykonania mdash powi zanie polece ze skroacutetami 117Kroki do wykonania mdash zmiana kontekstu 119Kroki do wykonania mdash w czanie i wy czanie elementoacutew menu 121Kroki do wykonania mdash wielokrotne u ycie wyra e 123Kroki do wykonania mdash dodanie polece do menu kontekstowego 124Sprawd si mdash wykorzystanie menu i paskoacutew narz dziowych 126Quiz mdash dzia anie menu 127
Zadania i paski post pu 127Kroki do wykonania mdash uruchamianie operacji dzia aj cych w tle 127Sprawd si mdash u ycie zadania UIJob 129Kroki do wykonania mdash raportowanie post pu prac 129Kroki do wykonania mdash sprawdzanie anulowania zadania 131Kroki do wykonania mdash podzadania i ich monitorowanie 131Kroki do wykonania mdash u ycie monitoroacutew i podmonitoroacutew typu null 133Kroki do wykonania mdash ustawienie w a ciwo ci klasy Job 135Sprawd si mdash wy wietlanie zadania w pasku systemowym 138Quiz mdash korzystanie z zada 138
Zg aszanie b doacutew 138Kroki do wykonania mdash wy wietlanie b doacutew 138Quiz mdash zg aszanie b doacutew 141
Podsumowanie 142
Rozdzia 5 Przechowywanie preferencji i ustawie 143
Przechowywanie preferencji 143Kroki do wykonania mdash trwa o warto ci 144Kroki do wykonania mdash utworzenie strony preferencji 145Kroki do wykonania mdash tworzenie komunikatoacutew ostrze e i b doacutew 146Kroki do wykonania mdash wyboacuter elementu z listy 147Kroki do wykonania mdash dodanie siatki 149Kroki do wykonania mdash lokalizacja strony preferencji 150Kroki do wykonania mdash u ycie innych edytoroacutew poacutel 151Kroki do wykonania mdash dodanie s oacutew kluczowych 153Kroki do wykonania mdash u ycie IEclipsePreferences 154Sprawd si mdash t umaczenie na inne j zyki 155
U ycie IMemento i DialogSettings 155Kroki do wykonania mdash dodanie IMemento do widoku stref czasowych 156Kroki do wykonania mdash u ycie DialogSettings 157Quiz mdash dzia anie preferencji 159
Podsumowanie 159
Kup książkę Poleć książkę
Spis tre ci
6
Rozdzia 6 Korzystanie z zasoboacutew 161
Korzystanie z przestrzeni roboczych i zasoboacutew 161Kroki do wykonania mdash tworzenie edytora 162Kroki do wykonania mdash tworzenie parsera 164Kroki do wykonania mdash tworzenie systemu buduj cego 165Kroki do wykonania mdash iteracja przez zasoby 168Kroki do wykonania mdash tworzenie zasoboacutew 170Kroki do wykonania mdash implementacja budowania inkrementacyjnego 172Kroki do wykonania mdash obs uga usuni cia 172Sprawd si mdash rozbudowa mechanizmu budowania 174
U ycie charakteroacutew projektu 175Kroki do wykonania mdash tworzenie charakteru projektu 175Sprawd si mdash ukrywanie charakteru 178
U ycie znacznikoacutew 178Kroki do wykonania mdash znacznik b du gdy plik jest pusty 179Kroki do wykonania mdash rejestracja rodzaju znacznika 180Sprawd si mdash prawid owe dzia anie gdy plik jest naprawd pusty 181Quiz mdash obs uga zasoboacutew procesu budowania i znacznikoacutew 182
Podsumowanie 182
Rozdzia 7 Model Eclipse 4 183
Korzystanie z modelu Eclipse 4 183Kroki do wykonania mdash instalacja narz dzi Eclipse 4 184Kroki do wykonania mdash tworzenie aplikacji Eclipse 4 186Kroki do wykonania mdash tworzenie cz ci 190Kroki do wykonania mdash obstylowanie interfejsu u ytkownika za pomoc CSS 194Sprawd si mdash u ycie mened era tematoacutew 199
Us ugi i konteksty 199Kroki do wykonania mdash dodanie logowania do dziennika zdarze 199Kroki do wykonania mdash pobranie okna 201Kroki do wykonania mdash uzyskanie zaznaczenia 202Kroki do wykonania mdash korzystanie ze zdarze 204Kroki do wykonania mdash obliczanie warto ci na danie 207Kroki do wykonania mdash u ycie preferencji 209Kroki do wykonania mdash interakcja z interfejsem u ytkownika 211
Korzystanie z polece procedur obs ugi i elementoacutew menu 213Kroki do wykonania mdash powi zanie menu z poleceniem i procedur obs ugi 213Kroki do wykonania mdash przekazywanie parametroacutew polecenia 215Kroki do wykonania mdash utworzenie bezpo redniego menu i skroacutetoacutew klawiszowych 218Kroki do wykonania mdash utworzenie menu kontekstowego i menu widoku 220
Tworzenie w asnych klas do wstrzykiwania 222Kroki do wykonania mdash tworzenie prostej us ugi 222Kroki do wykonania mdash wstrzykiwanie podtypoacutew 223Sprawd si mdash u ycie mostka narz dziowego 224Quiz mdash dzia anie Eclipse 4 224
Podsumowanie 225
Kup książkę Poleć książkę
Spis tre ci
7
Rozdzia 8 Tworzenie funkcjonalno ci witryn aktualizacji aplikacji i produktoacutew 227
Grupowanie wtyczek jako funkcjonalno ci 228Kroki do wykonania mdash tworzenie funkcjonalno ci 228Kroki do wykonania mdash eksport funkcjonalno ci 230Kroki do wykonania mdash instalacja funkcjonalno ci 232Kroki do wykonania mdash kategoryzacja witryny aktualizacji 234Kroki do wykonania mdash zale no od innych funkcjonalno ci 237Kroki do wykonania mdash tworzenie oznacze funkcjonalno ci 239Sprawd si mdash zdalna publikacja zawarto ci 241
Budowanie aplikacji i produktoacutew 241Kroki do wykonania mdash wykonanie aplikacji bez interfejsu u ytkownika 242Kroki do wykonania mdash tworzenie produktu 245Sprawd si mdash tworzenie produktu bazuj cego na funkcjonalno ci 249Quiz mdash sposoacuteb dzia ania funkcjonalno ci aplikacji i produktoacutew 249
Podsumowanie 249
Rozdzia 9 Automatyczne testy wtyczek 251
U ycie frameworku JUnit do testoacutew zautomatyzowanych 251Kroki do wykonania mdash wykonanie prostego przypadku testowego JUnit 252Kroki do wykonania mdash wykonanie testu wtyczki 253
Wykorzystanie SWTBot do testoacutew interfejsu graficznego 254Kroki do wykonania mdash tworzenie testoacutew SWTBot 254Kroki do wykonania mdash korzystanie z menu 256Sprawd si mdash korzystanie z zasoboacutew 258
Korzystanie z SWTBot 258Kroki do wykonania mdash ukrywanie ekranu powitalnego 258Kroki do wykonania mdash unikanie b doacutew wykonania z SWTBot 259
Korzystanie z widokoacutew 260Kroki do wykonania mdash wy wietlenie widokoacutew 260Kroki do wykonania mdash przes uchiwanie widokoacutew 261
Interakcja z interfejsem u ytkownika 262Kroki do wykonania mdash pobranie warto ci z interfejsu u ytkownika 262Kroki do wykonania mdash oczekiwanie na warunek 263Sprawd si mdash sterowanie kreatorem nowej klasy 265Quiz mdash dzia anie SWTBot 265
Podsumowanie 265
Rozdzia 10 Automatyczne budowanie przy u yciu Tycho 267
Wykorzystanie Maven i Tycho do budowania wtyczek Eclipse 267Kroki do wykonania mdash instalacja Maven 268Kroki do wykonania mdash budowanie za pomoc Tycho 270Sprawd si mdash korzystanie z platform docelowych 272
Budowanie funkcjonalno ci i witryn aktualizacji za pomoc Tycho 273Kroki do wykonania mdash tworzenie projektu nadrz dnego 273Kroki do wykonania mdash budowanie funkcjonalno ci 275Kroki do wykonania mdash budowanie witryny aktualizacji 276
Kup książkę Poleć książkę
Spis tre ci
8
Kroki do wykonania mdash budowanie produktu 278Sprawd si mdash zale no od komponentoacutew Maven 282
Testy i publikacja 283Kroki do wykonania mdash uruchomienie testoacutew automatycznych 283Kroki do wykonania mdash zmiana numeru wersji 286Sprawd si mdash w czenie budowania dla pozosta ych wtyczek 288
Podpisywanie witryn aktualizacji 288Kroki do wykonania mdash tworzenie certyfikatu podpisanego przez samego siebie 288Kroki do wykonania mdash podpisywanie wtyczek 290Kroki do wykonania mdash serwer z witryn aktualizacji 292Quiz mdash automatyczne budowanie i witryny aktualizacji 293
Podsumowanie 293
Dodatek A Odpowiedzi do quizoacutew 295
Rozdzia 1 Tworzenie pierwszej wtyczki 295Rozdzia 2 Tworzenie widokoacutew w SWT 296Rozdzia 3 Tworzenie widokoacutew w JFace 298Rozdzia 4 Interakcja z u ytkownikiem 299Rozdzia 5 Przechowywanie preferencji i ustawie 300Rozdzia 6 Korzystanie z zasoboacutew 301Rozdzia 7 Model Eclipse 4 301Rozdzia 8 Tworzenie funkcjonalno ci witryn aktualizacji aplikacji i produktoacutew 303Rozdzia 9 Automatyczne testy wtyczek 303Rozdzia 10 Automatyczne budowanie przy u yciu Tycho 304
Skorowidz 305
Kup książkę Poleć książkę
3
Tworzenie widokoacuteww JFace
W poprzednim rozdziale przyjrzeli my si podstawowym elementom SWTktoacutere stanowi pomost mi dzy elementami systemu operacyjnego a Jav W tym rozdziale
poznamy JFace ktoacutery korzysta z SWT w celu zapewnienia architektury MVCa tak e dostarczenia wielu typowych widgetoacutew u ywanych przez Eclipse
W tym rozdziale utworzymy widok do przedstawiania hierarchicznych danych u yjemy zasoboacutew obrazu czcionki lub koloru wygenerujemy stylizowany tekst posortujemy i przefiltrujemy wpisy w widokach dodamy akcje dla podwoacutejnych klikni zaznaczymy i obs u ymy w a ciwo ci utworzymy widok dla danych tabelarycznych
Dlaczego JFaceCho SWT zapewnia podstawow implementacj prostych widgetoacutew (na przyk ad drzewprzyciskoacutew i etykiet) wszystko dzia a na bardzo podstawowym poziomie bo wykorzystywanes teksty i indeksy zaznacze Aby atwiej wy wietla strukturyzowane dane JFace udost p-nia kilka zaawansowanych widokoacutew ktoacutere stanowi po czenie widgetoacutew SWT i mened eroacutewzdarze co zapewnia wygodn obs ug interfejsu u ytkownika dla strukturyzowanych tre ci
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
84
Istnieje wiele rodzajoacutew zaawansowanych widokoacutew nazywanych viewer (wszystkie dziedziczpo klasie Viewer) ale najcz ciej stosowanymi s te ktoacutere nale do ContentViewer na przyk adTreeViewer i TableViewer Istniej roacutewnie wersje bazuj ce na tek cie (TextViewer ma podklasydla SourceViewer) a tak e widoki operacyjne (ConsoleViewer dla widoku Console lub Detailed-ProgressViewer dla widoku Progress) W tym rozdziale wykonamy widoki bazuj ce na klasachTreeViewer i TableViewer Poniewa JFace bazuje na SWT wiedza na temat szczegoacute oacutewdzia ania SWT jest niezb dna do prawid owego u ytkowania JFace
Tworzenie widokoacutew TreeViewerWiele widgetoacutew w Eclipse bazuje na widoku przypominaj cym drzewo mdash jest to zaroacutewnonawigator plikoacutew jak i okno wy wietlania zawarto ci klas Framework JFace udost pnia klasTreeViewer realizuj c wszystkie niezb dne funkcjonalno ci U yjemy jej do wykonania widokuTimeZoneTreeView
Kroki do wykonania mdash tworzenie obiektu TreeViewerPodobnie jak mia o to miejsce w poprzednim rozdziale nowy widok TimeZoneTreeView utwo-rzymy przy u yciu edytora pluginxml Widok wy wietli strefy czasowe u o one hierarchiczniewzgl dem regionoacutew
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest by otworzy plik pluginxml je li jeszczenie jest otwarty
2 Otwoacuterz zak adk Extensions i znajd element orgeclipseuiviews Kliknij go prawymprzyciskiem myszy i z menu wybierz polecenie NewView Wype nij pola w sposoacutebopisany poni ej
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Name wpisz Widok drzewa stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
3 Zapisz plik Konfigurator umie ci w pliku pluginxml nast puj cy wpis
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTreeView icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTreeView name=Widok drzewa stref czasowych restorable=truegtltviewgt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
85
4 Podobnie jak wcze niej utwoacuterz klas TimeZoneTreeView ktoacutera rozszerza klasViewPart
5 W metodzie createPartControl() utwoacuterz instancj TreeViewer z opcjami V_SCROLLH_SCROLL i MULTI Zapami taj obiekt w polu klasy Zaimplementuj metod setFocus()by ustawia a widok drzewa jako aktywny element
public class TimeZoneTreeView extends ViewPart private TreeViewer treeViewer public void createPartControl(Composite parent) treeViewer = new TreeViewer(parent SWTMULTI | SWTH_SCROLL | SWTV_SCROLL ) public void setFocus() treeViewergetControl()setFocus()
E4 Cho Eclipse 4 zostanie szczegoacute owo omoacutewione w rozdziale 7 warto wspomnie e w Eclipse4 nad metod createPartControl() niezb dna jest adnotacja Inject (by zapewni przekazanieobiektu Composite) a nad metod setFocus() mdash adnotacja Focus
6 Uruchom testow wersj Eclipse i przejd do widoku wybieraj c polecenieWindowShowViewOther ledzenie czasuWidok drzewa stref czasowych
7 W odroacute nieniu od Swing gdzie oczekuje si otrzymywania danych w klasiebazuj cej na konkretnym interfejsie JFace nie wymaga adnej konkretnej klasyW zamian oczekuje obiektu warto ci do wy wietlenia (wej cie) interfejsu ktoacuteryczyta dane (dostawca tre ci) i interfejsu do wy wietlania danych (dostawca etykiet)
8 Utwoacuterz now klas o nazwie TimeZoneLabelProvider dziedzicz ca po LabelProvider(z pakietu orgeclipsejfaceviewers) B dzie zawiera a metod o nazwie getText()ktoacutera otrzymuje obiekt i zamienia go na reprezentacj tekstow Zamiast wywo ywatoString() zwroacute odpowiedni warto zwi zan z MapEntry lub TimeZone
public class TimeZoneLabelProvider extends LabelProvider public String getText(Object element) if (element instanceof Map) return Strefy czasowe
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
86
else if (element instanceof MapEntry) return ((MapEntry) element)getKey()toString() else if (element instanceof TimeZone) return ((TimeZone) element)getID()split()[1] else return Nieznany typ + elementgetClass()
Poniewa obiekt TreeViewer mo e mie wiele korzeni test instanceof Map s u ydo sprawdzenia czy to wierzcho ek drzewa ktoacutery powinien mie nazw Strefyczasowe
9 Warto zapewni warto domy ln mdash nawet je li jest to pusty tekstmdash bo otrzymanie nieznanego typu mo na atwo wy ledzi i naprawi
10 Utwoacuterz now klas TimeZoneContentProvider implementuj c interfejsITreeContentProvider Interfejs wymaga implementacji trzech metod z sze ciu(pozosta e mog pozosta puste) Oto one
hasChildren() mdash zwraca true je li w ze ma potomkoacutew getChildren() mdash zwraca potomkoacutew konkretnego w z a getElements() mdash zapewnia g oacutewne korzenie
11 Metoda hasChildren() zwroacuteci warto true je li zostanie do niej przekazany obiekttypu Map lub Collection ktoacutery nie b dzie pusty Przekazanie MapEntry spowodujewywo anie rekurencyjne Dla drzew bazuj cych na zagnie d onych Map lubCollection metoda hasChildren() b dzie wygl da a identycznie
public boolean hasChildren(Object element) if (element instanceof Map) return ((Map) element)isEmpty() else if (element instanceof MapEntry) return hasChildren(((MapEntry)element)getValue()) else if (element instanceof Collection) return ((Collection) element)isEmpty() else return false
12 Implementacja getChildren() rekurencyjnie wchodzi do obiektoacutew typu MapCollection lub MapEntry stosuj c przy tym opisany wcze niej wzorzec Poniewametoda wymaga zwroacutecenia typu Object[] kod u ywa funkcjonalno ci wbudowanejw klas Map by zamieni zawarto entrySet() na tablic
public Object[] getChildren(Object parentElement) if (parentElement instanceof Map) return ((Map) parentElement)entrySet()toArray()
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
87
else if (parentElement instanceof MapEntry) return getChildren(((MapEntry)parentElement)getValue()) else if (parentElement instanceof Collection) return ((Collection) parentElement)toArray() else return new Object[0]
13 Kluczem przy implementacji ITreeContentProvider jest zapewnienie sta ejsynchronizacji kodu metod getChildren() i hasChildren() Jednym ze sposoboacutewzapewnienia takiej sytuacji jest u ycie w metodzie hasChildren() metodygetChildren() i sprawdzanie czy tablica jest pusta ale wydajno takiej operacjinie b dzie najlepsza je li getChildren() to operacja bardzo z o ona obliczeniowo
14 Poniewa TreeViewer mo e mie wiele korzeni istnieje metoda pobieraj ca tablickorzeni z elementu wej ciowego B d we frameworku JFace uniemo liwiaargumentowi getElements() posiadanie w asnej warto ci Z tego powodu przyj osi e najlepiej przekaza tablic (zawieraj c tylko jeden element) i nast pnie jzwroacuteci Metoda przedstawiona poni ej b dzie najprawdopodobniej wygl da atak samo dla ka dej klasy TreeContentProvider ktoacuter kiedykolwiek napiszesz
public Object[] getElements(Object inputElement) if (inputElement instanceof Object[]) return (Object[]) inputElement else return new Object[0]
15 Po zako czeniu tworzenia odpowiednich klas dostawcoacutew danych przejd dometody createPartControl() klasy TimeZoneTreeView by po czy dostawcoacutewz obiektem widoku i ustali obiekt b d cy roacuted em danych
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetContentProvider(new TimeZoneContentProvider())treeViewersetInput(new Object[]TimeZoneComparatorgetTimeZones())
16 Uruchom testow wersj Eclipse i otwoacuterz widok poleceniem WindowShowViewOther ledzenie czasuWidok drzewa stref czasowych by zobaczy efekt ko cowy
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
88
Co si sta oDane do TreeViewer przekazali my przy u yciu metody setInput() Metoda prawie zawszeotrzymuje tablic obiektoacutew nawet je li jest to tylko jeden element
Aby zapewni rozpakowanie struktury danych interfejs ITreeContentProvider udost pniadwie kluczowe metody mdash hasChildren() i getChildren() Umo liwiaj one przechodzenieprzez struktur danych na danie gdy u ytkownik zwija lub rozwija ga zie drzewa Powodemistnienia dwoacutech metod jest fakt i obliczenia w metodzie getChildren() mog by bardzokosztowne Metoda hasChildren() s u y do sprawdzenia czy nale y wy wietli ikon rozwi-ni cia w z a Wywo anie metody getChildren() jest opoacute nione a do momentu faktycznegootwarcia w z a
W strukturach danych ktoacutere to zapewniaj warto roacutewnie zaimplementowa metod getParent()umo liwia ona dost p do obiektu Je li jest zaimplementowana wywo anie viewerreveal(Object)powoduje rozwini cie w z oacutew w hierarchii by ods oni wskazany obiekt
Do wy wietlenia etykiet na drzewie s u y klasa LabelProvider Dostarcza ona etykiet(i opcjonalny obrazek) dla ka dego elementu Dla ka dego typu obiektu mo na u y innejikony Z rozwi zania tego skorzystano w widoku Package z perspektywy Java ktoacutery wy wietlaikon klasy dla klas ikon pakietu dla pakietoacutew i tak dalej
Klasa LabelProvider mo e wy wietla komunikaty na roacute ne sposoby Nic nie stoi na prze-szkodzie by doda do etykiety informacj o przesuni ciu czasowym (roacute nic mi dzy konkretnstref czasow i czasem GMT)
Kroki do wykonania mdash JFace i obrazyKlasa TimeZoneLabelProvider mo e zwroacuteci obiekt Image b d cy standardowym widgetem SWTCho obraz (obiekt Image) mo na wczyta w sposoacuteb podobny jak w poprzednim rozdziale JFaceoferuje rejestry zasoboacutew s u ce do zarz dzania zestawami zasoboacutew aplikacji Rejestry obs u-guj klasy ImageRegistry FontRegistry i ColorRegistry Rejestr zasoboacutew ma za zadanie prze-chowywa list obiektoacutew Resource i zwalnia je we w a ciwy sposoacuteb ale tylko wtedy gdy nies ju potrzebne
JFace posiada rejestry globalne ale istniej roacutewnie rejestry bardziej szczegoacute owe u ywaneprzez IDE na przyk ad do przechowywania list ikon folderoacutew i plikoacutew W rejestrze tego typukorzysta si z deskryptoroacutew do okre lania konkretnych zasoboacutew wi c po przekazaniu de-skryptora otrzymuje si odpowiadaj c mu instancj zasobu Zwroacuteconym zasobem zarz dzarejestr wi c kod ktoacutery go otrzyma nie powinien go zwalnia
1 W TimeZoneLabelProvider dodaj metod getImage() w ktoacuterej u ywa si rejestruobrazoacutew ImageRegistry by pobra ikon folderu Oto kod metody
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
89
public Image getImage(Object element) if(element instanceof MapEntry) returnPlatformUIgetWorkbench()getSharedImages()getImage(ISharedImagesIMG_OBJ_FOLDER) else return supergetImage(element)
2 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowych Oboktekstu z nazw regionu pojawi si ikona folderu Instancji Image nie trzeba niszczysamodzielnie poniewa nale y do wtyczki PlatformUI (zasoacuteb obrazu zostaniezwolniony w momencie wy czania PlatformUI)
E4 W Eclipse 4 instancj ISharedImages mo na otrzyma poprzez wstrzykni cie
Injectprivate ISharedImages imagesimagesgetImage(ISharedImagesIMG_OBJ_FOLDER)
3 By otrzyma inny obraz u yj globalnych instancji ImageRegistry lub JFaceRegistrylub utwoacuterz w asn kopi Zastosowanie globalnej wersji oznacza e obraz Imagenigdy nie zostanie zniszczony poniewa JFaceRegistry istnieje przez ca y czasycia instancji Eclipse
Zamiast tego utwoacuterz obiekty LocalResourceManager i ImageRegistry powi zanez cyklem ycia kontrolki Gdy kontrolka nadrz dna b dzie usuwana automatycznieusuni te zostan roacutewnie obrazy Umie w metodzie CreatePartControl klasyTimeZoneTreeView poni szy kod
public void createPartControl(Composite parent) ResourceManager rm = JFaceResourcesgetResources() LocalResourceManager lrm = new LocalResourceManager(rmparent)
4 U ywaj c obiektu LocalResourceManger utwoacuterz instancj ImageRegistry i za pomocmetody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL
ImageRegistry ir = new ImageRegistry(lrm)URL sample = getClass()getResource(iconssamplegif)irput(sample ImageDescriptorcreateFromURL(sample))
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Spis tre ci
5
Rozdzia 4 Interakcja z u ytkownikiem 113
Tworzenie akcji polece i procedur obs ugi 113Kroki do wykonania mdash dodanie menu kontekstowego 114Kroki do wykonania mdash tworzenie polece i procedur obs ugi 115Kroki do wykonania mdash powi zanie polece ze skroacutetami 117Kroki do wykonania mdash zmiana kontekstu 119Kroki do wykonania mdash w czanie i wy czanie elementoacutew menu 121Kroki do wykonania mdash wielokrotne u ycie wyra e 123Kroki do wykonania mdash dodanie polece do menu kontekstowego 124Sprawd si mdash wykorzystanie menu i paskoacutew narz dziowych 126Quiz mdash dzia anie menu 127
Zadania i paski post pu 127Kroki do wykonania mdash uruchamianie operacji dzia aj cych w tle 127Sprawd si mdash u ycie zadania UIJob 129Kroki do wykonania mdash raportowanie post pu prac 129Kroki do wykonania mdash sprawdzanie anulowania zadania 131Kroki do wykonania mdash podzadania i ich monitorowanie 131Kroki do wykonania mdash u ycie monitoroacutew i podmonitoroacutew typu null 133Kroki do wykonania mdash ustawienie w a ciwo ci klasy Job 135Sprawd si mdash wy wietlanie zadania w pasku systemowym 138Quiz mdash korzystanie z zada 138
Zg aszanie b doacutew 138Kroki do wykonania mdash wy wietlanie b doacutew 138Quiz mdash zg aszanie b doacutew 141
Podsumowanie 142
Rozdzia 5 Przechowywanie preferencji i ustawie 143
Przechowywanie preferencji 143Kroki do wykonania mdash trwa o warto ci 144Kroki do wykonania mdash utworzenie strony preferencji 145Kroki do wykonania mdash tworzenie komunikatoacutew ostrze e i b doacutew 146Kroki do wykonania mdash wyboacuter elementu z listy 147Kroki do wykonania mdash dodanie siatki 149Kroki do wykonania mdash lokalizacja strony preferencji 150Kroki do wykonania mdash u ycie innych edytoroacutew poacutel 151Kroki do wykonania mdash dodanie s oacutew kluczowych 153Kroki do wykonania mdash u ycie IEclipsePreferences 154Sprawd si mdash t umaczenie na inne j zyki 155
U ycie IMemento i DialogSettings 155Kroki do wykonania mdash dodanie IMemento do widoku stref czasowych 156Kroki do wykonania mdash u ycie DialogSettings 157Quiz mdash dzia anie preferencji 159
Podsumowanie 159
Kup książkę Poleć książkę
Spis tre ci
6
Rozdzia 6 Korzystanie z zasoboacutew 161
Korzystanie z przestrzeni roboczych i zasoboacutew 161Kroki do wykonania mdash tworzenie edytora 162Kroki do wykonania mdash tworzenie parsera 164Kroki do wykonania mdash tworzenie systemu buduj cego 165Kroki do wykonania mdash iteracja przez zasoby 168Kroki do wykonania mdash tworzenie zasoboacutew 170Kroki do wykonania mdash implementacja budowania inkrementacyjnego 172Kroki do wykonania mdash obs uga usuni cia 172Sprawd si mdash rozbudowa mechanizmu budowania 174
U ycie charakteroacutew projektu 175Kroki do wykonania mdash tworzenie charakteru projektu 175Sprawd si mdash ukrywanie charakteru 178
U ycie znacznikoacutew 178Kroki do wykonania mdash znacznik b du gdy plik jest pusty 179Kroki do wykonania mdash rejestracja rodzaju znacznika 180Sprawd si mdash prawid owe dzia anie gdy plik jest naprawd pusty 181Quiz mdash obs uga zasoboacutew procesu budowania i znacznikoacutew 182
Podsumowanie 182
Rozdzia 7 Model Eclipse 4 183
Korzystanie z modelu Eclipse 4 183Kroki do wykonania mdash instalacja narz dzi Eclipse 4 184Kroki do wykonania mdash tworzenie aplikacji Eclipse 4 186Kroki do wykonania mdash tworzenie cz ci 190Kroki do wykonania mdash obstylowanie interfejsu u ytkownika za pomoc CSS 194Sprawd si mdash u ycie mened era tematoacutew 199
Us ugi i konteksty 199Kroki do wykonania mdash dodanie logowania do dziennika zdarze 199Kroki do wykonania mdash pobranie okna 201Kroki do wykonania mdash uzyskanie zaznaczenia 202Kroki do wykonania mdash korzystanie ze zdarze 204Kroki do wykonania mdash obliczanie warto ci na danie 207Kroki do wykonania mdash u ycie preferencji 209Kroki do wykonania mdash interakcja z interfejsem u ytkownika 211
Korzystanie z polece procedur obs ugi i elementoacutew menu 213Kroki do wykonania mdash powi zanie menu z poleceniem i procedur obs ugi 213Kroki do wykonania mdash przekazywanie parametroacutew polecenia 215Kroki do wykonania mdash utworzenie bezpo redniego menu i skroacutetoacutew klawiszowych 218Kroki do wykonania mdash utworzenie menu kontekstowego i menu widoku 220
Tworzenie w asnych klas do wstrzykiwania 222Kroki do wykonania mdash tworzenie prostej us ugi 222Kroki do wykonania mdash wstrzykiwanie podtypoacutew 223Sprawd si mdash u ycie mostka narz dziowego 224Quiz mdash dzia anie Eclipse 4 224
Podsumowanie 225
Kup książkę Poleć książkę
Spis tre ci
7
Rozdzia 8 Tworzenie funkcjonalno ci witryn aktualizacji aplikacji i produktoacutew 227
Grupowanie wtyczek jako funkcjonalno ci 228Kroki do wykonania mdash tworzenie funkcjonalno ci 228Kroki do wykonania mdash eksport funkcjonalno ci 230Kroki do wykonania mdash instalacja funkcjonalno ci 232Kroki do wykonania mdash kategoryzacja witryny aktualizacji 234Kroki do wykonania mdash zale no od innych funkcjonalno ci 237Kroki do wykonania mdash tworzenie oznacze funkcjonalno ci 239Sprawd si mdash zdalna publikacja zawarto ci 241
Budowanie aplikacji i produktoacutew 241Kroki do wykonania mdash wykonanie aplikacji bez interfejsu u ytkownika 242Kroki do wykonania mdash tworzenie produktu 245Sprawd si mdash tworzenie produktu bazuj cego na funkcjonalno ci 249Quiz mdash sposoacuteb dzia ania funkcjonalno ci aplikacji i produktoacutew 249
Podsumowanie 249
Rozdzia 9 Automatyczne testy wtyczek 251
U ycie frameworku JUnit do testoacutew zautomatyzowanych 251Kroki do wykonania mdash wykonanie prostego przypadku testowego JUnit 252Kroki do wykonania mdash wykonanie testu wtyczki 253
Wykorzystanie SWTBot do testoacutew interfejsu graficznego 254Kroki do wykonania mdash tworzenie testoacutew SWTBot 254Kroki do wykonania mdash korzystanie z menu 256Sprawd si mdash korzystanie z zasoboacutew 258
Korzystanie z SWTBot 258Kroki do wykonania mdash ukrywanie ekranu powitalnego 258Kroki do wykonania mdash unikanie b doacutew wykonania z SWTBot 259
Korzystanie z widokoacutew 260Kroki do wykonania mdash wy wietlenie widokoacutew 260Kroki do wykonania mdash przes uchiwanie widokoacutew 261
Interakcja z interfejsem u ytkownika 262Kroki do wykonania mdash pobranie warto ci z interfejsu u ytkownika 262Kroki do wykonania mdash oczekiwanie na warunek 263Sprawd si mdash sterowanie kreatorem nowej klasy 265Quiz mdash dzia anie SWTBot 265
Podsumowanie 265
Rozdzia 10 Automatyczne budowanie przy u yciu Tycho 267
Wykorzystanie Maven i Tycho do budowania wtyczek Eclipse 267Kroki do wykonania mdash instalacja Maven 268Kroki do wykonania mdash budowanie za pomoc Tycho 270Sprawd si mdash korzystanie z platform docelowych 272
Budowanie funkcjonalno ci i witryn aktualizacji za pomoc Tycho 273Kroki do wykonania mdash tworzenie projektu nadrz dnego 273Kroki do wykonania mdash budowanie funkcjonalno ci 275Kroki do wykonania mdash budowanie witryny aktualizacji 276
Kup książkę Poleć książkę
Spis tre ci
8
Kroki do wykonania mdash budowanie produktu 278Sprawd si mdash zale no od komponentoacutew Maven 282
Testy i publikacja 283Kroki do wykonania mdash uruchomienie testoacutew automatycznych 283Kroki do wykonania mdash zmiana numeru wersji 286Sprawd si mdash w czenie budowania dla pozosta ych wtyczek 288
Podpisywanie witryn aktualizacji 288Kroki do wykonania mdash tworzenie certyfikatu podpisanego przez samego siebie 288Kroki do wykonania mdash podpisywanie wtyczek 290Kroki do wykonania mdash serwer z witryn aktualizacji 292Quiz mdash automatyczne budowanie i witryny aktualizacji 293
Podsumowanie 293
Dodatek A Odpowiedzi do quizoacutew 295
Rozdzia 1 Tworzenie pierwszej wtyczki 295Rozdzia 2 Tworzenie widokoacutew w SWT 296Rozdzia 3 Tworzenie widokoacutew w JFace 298Rozdzia 4 Interakcja z u ytkownikiem 299Rozdzia 5 Przechowywanie preferencji i ustawie 300Rozdzia 6 Korzystanie z zasoboacutew 301Rozdzia 7 Model Eclipse 4 301Rozdzia 8 Tworzenie funkcjonalno ci witryn aktualizacji aplikacji i produktoacutew 303Rozdzia 9 Automatyczne testy wtyczek 303Rozdzia 10 Automatyczne budowanie przy u yciu Tycho 304
Skorowidz 305
Kup książkę Poleć książkę
3
Tworzenie widokoacuteww JFace
W poprzednim rozdziale przyjrzeli my si podstawowym elementom SWTktoacutere stanowi pomost mi dzy elementami systemu operacyjnego a Jav W tym rozdziale
poznamy JFace ktoacutery korzysta z SWT w celu zapewnienia architektury MVCa tak e dostarczenia wielu typowych widgetoacutew u ywanych przez Eclipse
W tym rozdziale utworzymy widok do przedstawiania hierarchicznych danych u yjemy zasoboacutew obrazu czcionki lub koloru wygenerujemy stylizowany tekst posortujemy i przefiltrujemy wpisy w widokach dodamy akcje dla podwoacutejnych klikni zaznaczymy i obs u ymy w a ciwo ci utworzymy widok dla danych tabelarycznych
Dlaczego JFaceCho SWT zapewnia podstawow implementacj prostych widgetoacutew (na przyk ad drzewprzyciskoacutew i etykiet) wszystko dzia a na bardzo podstawowym poziomie bo wykorzystywanes teksty i indeksy zaznacze Aby atwiej wy wietla strukturyzowane dane JFace udost p-nia kilka zaawansowanych widokoacutew ktoacutere stanowi po czenie widgetoacutew SWT i mened eroacutewzdarze co zapewnia wygodn obs ug interfejsu u ytkownika dla strukturyzowanych tre ci
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
84
Istnieje wiele rodzajoacutew zaawansowanych widokoacutew nazywanych viewer (wszystkie dziedziczpo klasie Viewer) ale najcz ciej stosowanymi s te ktoacutere nale do ContentViewer na przyk adTreeViewer i TableViewer Istniej roacutewnie wersje bazuj ce na tek cie (TextViewer ma podklasydla SourceViewer) a tak e widoki operacyjne (ConsoleViewer dla widoku Console lub Detailed-ProgressViewer dla widoku Progress) W tym rozdziale wykonamy widoki bazuj ce na klasachTreeViewer i TableViewer Poniewa JFace bazuje na SWT wiedza na temat szczegoacute oacutewdzia ania SWT jest niezb dna do prawid owego u ytkowania JFace
Tworzenie widokoacutew TreeViewerWiele widgetoacutew w Eclipse bazuje na widoku przypominaj cym drzewo mdash jest to zaroacutewnonawigator plikoacutew jak i okno wy wietlania zawarto ci klas Framework JFace udost pnia klasTreeViewer realizuj c wszystkie niezb dne funkcjonalno ci U yjemy jej do wykonania widokuTimeZoneTreeView
Kroki do wykonania mdash tworzenie obiektu TreeViewerPodobnie jak mia o to miejsce w poprzednim rozdziale nowy widok TimeZoneTreeView utwo-rzymy przy u yciu edytora pluginxml Widok wy wietli strefy czasowe u o one hierarchiczniewzgl dem regionoacutew
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest by otworzy plik pluginxml je li jeszczenie jest otwarty
2 Otwoacuterz zak adk Extensions i znajd element orgeclipseuiviews Kliknij go prawymprzyciskiem myszy i z menu wybierz polecenie NewView Wype nij pola w sposoacutebopisany poni ej
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Name wpisz Widok drzewa stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
3 Zapisz plik Konfigurator umie ci w pliku pluginxml nast puj cy wpis
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTreeView icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTreeView name=Widok drzewa stref czasowych restorable=truegtltviewgt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
85
4 Podobnie jak wcze niej utwoacuterz klas TimeZoneTreeView ktoacutera rozszerza klasViewPart
5 W metodzie createPartControl() utwoacuterz instancj TreeViewer z opcjami V_SCROLLH_SCROLL i MULTI Zapami taj obiekt w polu klasy Zaimplementuj metod setFocus()by ustawia a widok drzewa jako aktywny element
public class TimeZoneTreeView extends ViewPart private TreeViewer treeViewer public void createPartControl(Composite parent) treeViewer = new TreeViewer(parent SWTMULTI | SWTH_SCROLL | SWTV_SCROLL ) public void setFocus() treeViewergetControl()setFocus()
E4 Cho Eclipse 4 zostanie szczegoacute owo omoacutewione w rozdziale 7 warto wspomnie e w Eclipse4 nad metod createPartControl() niezb dna jest adnotacja Inject (by zapewni przekazanieobiektu Composite) a nad metod setFocus() mdash adnotacja Focus
6 Uruchom testow wersj Eclipse i przejd do widoku wybieraj c polecenieWindowShowViewOther ledzenie czasuWidok drzewa stref czasowych
7 W odroacute nieniu od Swing gdzie oczekuje si otrzymywania danych w klasiebazuj cej na konkretnym interfejsie JFace nie wymaga adnej konkretnej klasyW zamian oczekuje obiektu warto ci do wy wietlenia (wej cie) interfejsu ktoacuteryczyta dane (dostawca tre ci) i interfejsu do wy wietlania danych (dostawca etykiet)
8 Utwoacuterz now klas o nazwie TimeZoneLabelProvider dziedzicz ca po LabelProvider(z pakietu orgeclipsejfaceviewers) B dzie zawiera a metod o nazwie getText()ktoacutera otrzymuje obiekt i zamienia go na reprezentacj tekstow Zamiast wywo ywatoString() zwroacute odpowiedni warto zwi zan z MapEntry lub TimeZone
public class TimeZoneLabelProvider extends LabelProvider public String getText(Object element) if (element instanceof Map) return Strefy czasowe
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
86
else if (element instanceof MapEntry) return ((MapEntry) element)getKey()toString() else if (element instanceof TimeZone) return ((TimeZone) element)getID()split()[1] else return Nieznany typ + elementgetClass()
Poniewa obiekt TreeViewer mo e mie wiele korzeni test instanceof Map s u ydo sprawdzenia czy to wierzcho ek drzewa ktoacutery powinien mie nazw Strefyczasowe
9 Warto zapewni warto domy ln mdash nawet je li jest to pusty tekstmdash bo otrzymanie nieznanego typu mo na atwo wy ledzi i naprawi
10 Utwoacuterz now klas TimeZoneContentProvider implementuj c interfejsITreeContentProvider Interfejs wymaga implementacji trzech metod z sze ciu(pozosta e mog pozosta puste) Oto one
hasChildren() mdash zwraca true je li w ze ma potomkoacutew getChildren() mdash zwraca potomkoacutew konkretnego w z a getElements() mdash zapewnia g oacutewne korzenie
11 Metoda hasChildren() zwroacuteci warto true je li zostanie do niej przekazany obiekttypu Map lub Collection ktoacutery nie b dzie pusty Przekazanie MapEntry spowodujewywo anie rekurencyjne Dla drzew bazuj cych na zagnie d onych Map lubCollection metoda hasChildren() b dzie wygl da a identycznie
public boolean hasChildren(Object element) if (element instanceof Map) return ((Map) element)isEmpty() else if (element instanceof MapEntry) return hasChildren(((MapEntry)element)getValue()) else if (element instanceof Collection) return ((Collection) element)isEmpty() else return false
12 Implementacja getChildren() rekurencyjnie wchodzi do obiektoacutew typu MapCollection lub MapEntry stosuj c przy tym opisany wcze niej wzorzec Poniewametoda wymaga zwroacutecenia typu Object[] kod u ywa funkcjonalno ci wbudowanejw klas Map by zamieni zawarto entrySet() na tablic
public Object[] getChildren(Object parentElement) if (parentElement instanceof Map) return ((Map) parentElement)entrySet()toArray()
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
87
else if (parentElement instanceof MapEntry) return getChildren(((MapEntry)parentElement)getValue()) else if (parentElement instanceof Collection) return ((Collection) parentElement)toArray() else return new Object[0]
13 Kluczem przy implementacji ITreeContentProvider jest zapewnienie sta ejsynchronizacji kodu metod getChildren() i hasChildren() Jednym ze sposoboacutewzapewnienia takiej sytuacji jest u ycie w metodzie hasChildren() metodygetChildren() i sprawdzanie czy tablica jest pusta ale wydajno takiej operacjinie b dzie najlepsza je li getChildren() to operacja bardzo z o ona obliczeniowo
14 Poniewa TreeViewer mo e mie wiele korzeni istnieje metoda pobieraj ca tablickorzeni z elementu wej ciowego B d we frameworku JFace uniemo liwiaargumentowi getElements() posiadanie w asnej warto ci Z tego powodu przyj osi e najlepiej przekaza tablic (zawieraj c tylko jeden element) i nast pnie jzwroacuteci Metoda przedstawiona poni ej b dzie najprawdopodobniej wygl da atak samo dla ka dej klasy TreeContentProvider ktoacuter kiedykolwiek napiszesz
public Object[] getElements(Object inputElement) if (inputElement instanceof Object[]) return (Object[]) inputElement else return new Object[0]
15 Po zako czeniu tworzenia odpowiednich klas dostawcoacutew danych przejd dometody createPartControl() klasy TimeZoneTreeView by po czy dostawcoacutewz obiektem widoku i ustali obiekt b d cy roacuted em danych
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetContentProvider(new TimeZoneContentProvider())treeViewersetInput(new Object[]TimeZoneComparatorgetTimeZones())
16 Uruchom testow wersj Eclipse i otwoacuterz widok poleceniem WindowShowViewOther ledzenie czasuWidok drzewa stref czasowych by zobaczy efekt ko cowy
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
88
Co si sta oDane do TreeViewer przekazali my przy u yciu metody setInput() Metoda prawie zawszeotrzymuje tablic obiektoacutew nawet je li jest to tylko jeden element
Aby zapewni rozpakowanie struktury danych interfejs ITreeContentProvider udost pniadwie kluczowe metody mdash hasChildren() i getChildren() Umo liwiaj one przechodzenieprzez struktur danych na danie gdy u ytkownik zwija lub rozwija ga zie drzewa Powodemistnienia dwoacutech metod jest fakt i obliczenia w metodzie getChildren() mog by bardzokosztowne Metoda hasChildren() s u y do sprawdzenia czy nale y wy wietli ikon rozwi-ni cia w z a Wywo anie metody getChildren() jest opoacute nione a do momentu faktycznegootwarcia w z a
W strukturach danych ktoacutere to zapewniaj warto roacutewnie zaimplementowa metod getParent()umo liwia ona dost p do obiektu Je li jest zaimplementowana wywo anie viewerreveal(Object)powoduje rozwini cie w z oacutew w hierarchii by ods oni wskazany obiekt
Do wy wietlenia etykiet na drzewie s u y klasa LabelProvider Dostarcza ona etykiet(i opcjonalny obrazek) dla ka dego elementu Dla ka dego typu obiektu mo na u y innejikony Z rozwi zania tego skorzystano w widoku Package z perspektywy Java ktoacutery wy wietlaikon klasy dla klas ikon pakietu dla pakietoacutew i tak dalej
Klasa LabelProvider mo e wy wietla komunikaty na roacute ne sposoby Nic nie stoi na prze-szkodzie by doda do etykiety informacj o przesuni ciu czasowym (roacute nic mi dzy konkretnstref czasow i czasem GMT)
Kroki do wykonania mdash JFace i obrazyKlasa TimeZoneLabelProvider mo e zwroacuteci obiekt Image b d cy standardowym widgetem SWTCho obraz (obiekt Image) mo na wczyta w sposoacuteb podobny jak w poprzednim rozdziale JFaceoferuje rejestry zasoboacutew s u ce do zarz dzania zestawami zasoboacutew aplikacji Rejestry obs u-guj klasy ImageRegistry FontRegistry i ColorRegistry Rejestr zasoboacutew ma za zadanie prze-chowywa list obiektoacutew Resource i zwalnia je we w a ciwy sposoacuteb ale tylko wtedy gdy nies ju potrzebne
JFace posiada rejestry globalne ale istniej roacutewnie rejestry bardziej szczegoacute owe u ywaneprzez IDE na przyk ad do przechowywania list ikon folderoacutew i plikoacutew W rejestrze tego typukorzysta si z deskryptoroacutew do okre lania konkretnych zasoboacutew wi c po przekazaniu de-skryptora otrzymuje si odpowiadaj c mu instancj zasobu Zwroacuteconym zasobem zarz dzarejestr wi c kod ktoacutery go otrzyma nie powinien go zwalnia
1 W TimeZoneLabelProvider dodaj metod getImage() w ktoacuterej u ywa si rejestruobrazoacutew ImageRegistry by pobra ikon folderu Oto kod metody
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
89
public Image getImage(Object element) if(element instanceof MapEntry) returnPlatformUIgetWorkbench()getSharedImages()getImage(ISharedImagesIMG_OBJ_FOLDER) else return supergetImage(element)
2 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowych Oboktekstu z nazw regionu pojawi si ikona folderu Instancji Image nie trzeba niszczysamodzielnie poniewa nale y do wtyczki PlatformUI (zasoacuteb obrazu zostaniezwolniony w momencie wy czania PlatformUI)
E4 W Eclipse 4 instancj ISharedImages mo na otrzyma poprzez wstrzykni cie
Injectprivate ISharedImages imagesimagesgetImage(ISharedImagesIMG_OBJ_FOLDER)
3 By otrzyma inny obraz u yj globalnych instancji ImageRegistry lub JFaceRegistrylub utwoacuterz w asn kopi Zastosowanie globalnej wersji oznacza e obraz Imagenigdy nie zostanie zniszczony poniewa JFaceRegistry istnieje przez ca y czasycia instancji Eclipse
Zamiast tego utwoacuterz obiekty LocalResourceManager i ImageRegistry powi zanez cyklem ycia kontrolki Gdy kontrolka nadrz dna b dzie usuwana automatycznieusuni te zostan roacutewnie obrazy Umie w metodzie CreatePartControl klasyTimeZoneTreeView poni szy kod
public void createPartControl(Composite parent) ResourceManager rm = JFaceResourcesgetResources() LocalResourceManager lrm = new LocalResourceManager(rmparent)
4 U ywaj c obiektu LocalResourceManger utwoacuterz instancj ImageRegistry i za pomocmetody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL
ImageRegistry ir = new ImageRegistry(lrm)URL sample = getClass()getResource(iconssamplegif)irput(sample ImageDescriptorcreateFromURL(sample))
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Spis tre ci
6
Rozdzia 6 Korzystanie z zasoboacutew 161
Korzystanie z przestrzeni roboczych i zasoboacutew 161Kroki do wykonania mdash tworzenie edytora 162Kroki do wykonania mdash tworzenie parsera 164Kroki do wykonania mdash tworzenie systemu buduj cego 165Kroki do wykonania mdash iteracja przez zasoby 168Kroki do wykonania mdash tworzenie zasoboacutew 170Kroki do wykonania mdash implementacja budowania inkrementacyjnego 172Kroki do wykonania mdash obs uga usuni cia 172Sprawd si mdash rozbudowa mechanizmu budowania 174
U ycie charakteroacutew projektu 175Kroki do wykonania mdash tworzenie charakteru projektu 175Sprawd si mdash ukrywanie charakteru 178
U ycie znacznikoacutew 178Kroki do wykonania mdash znacznik b du gdy plik jest pusty 179Kroki do wykonania mdash rejestracja rodzaju znacznika 180Sprawd si mdash prawid owe dzia anie gdy plik jest naprawd pusty 181Quiz mdash obs uga zasoboacutew procesu budowania i znacznikoacutew 182
Podsumowanie 182
Rozdzia 7 Model Eclipse 4 183
Korzystanie z modelu Eclipse 4 183Kroki do wykonania mdash instalacja narz dzi Eclipse 4 184Kroki do wykonania mdash tworzenie aplikacji Eclipse 4 186Kroki do wykonania mdash tworzenie cz ci 190Kroki do wykonania mdash obstylowanie interfejsu u ytkownika za pomoc CSS 194Sprawd si mdash u ycie mened era tematoacutew 199
Us ugi i konteksty 199Kroki do wykonania mdash dodanie logowania do dziennika zdarze 199Kroki do wykonania mdash pobranie okna 201Kroki do wykonania mdash uzyskanie zaznaczenia 202Kroki do wykonania mdash korzystanie ze zdarze 204Kroki do wykonania mdash obliczanie warto ci na danie 207Kroki do wykonania mdash u ycie preferencji 209Kroki do wykonania mdash interakcja z interfejsem u ytkownika 211
Korzystanie z polece procedur obs ugi i elementoacutew menu 213Kroki do wykonania mdash powi zanie menu z poleceniem i procedur obs ugi 213Kroki do wykonania mdash przekazywanie parametroacutew polecenia 215Kroki do wykonania mdash utworzenie bezpo redniego menu i skroacutetoacutew klawiszowych 218Kroki do wykonania mdash utworzenie menu kontekstowego i menu widoku 220
Tworzenie w asnych klas do wstrzykiwania 222Kroki do wykonania mdash tworzenie prostej us ugi 222Kroki do wykonania mdash wstrzykiwanie podtypoacutew 223Sprawd si mdash u ycie mostka narz dziowego 224Quiz mdash dzia anie Eclipse 4 224
Podsumowanie 225
Kup książkę Poleć książkę
Spis tre ci
7
Rozdzia 8 Tworzenie funkcjonalno ci witryn aktualizacji aplikacji i produktoacutew 227
Grupowanie wtyczek jako funkcjonalno ci 228Kroki do wykonania mdash tworzenie funkcjonalno ci 228Kroki do wykonania mdash eksport funkcjonalno ci 230Kroki do wykonania mdash instalacja funkcjonalno ci 232Kroki do wykonania mdash kategoryzacja witryny aktualizacji 234Kroki do wykonania mdash zale no od innych funkcjonalno ci 237Kroki do wykonania mdash tworzenie oznacze funkcjonalno ci 239Sprawd si mdash zdalna publikacja zawarto ci 241
Budowanie aplikacji i produktoacutew 241Kroki do wykonania mdash wykonanie aplikacji bez interfejsu u ytkownika 242Kroki do wykonania mdash tworzenie produktu 245Sprawd si mdash tworzenie produktu bazuj cego na funkcjonalno ci 249Quiz mdash sposoacuteb dzia ania funkcjonalno ci aplikacji i produktoacutew 249
Podsumowanie 249
Rozdzia 9 Automatyczne testy wtyczek 251
U ycie frameworku JUnit do testoacutew zautomatyzowanych 251Kroki do wykonania mdash wykonanie prostego przypadku testowego JUnit 252Kroki do wykonania mdash wykonanie testu wtyczki 253
Wykorzystanie SWTBot do testoacutew interfejsu graficznego 254Kroki do wykonania mdash tworzenie testoacutew SWTBot 254Kroki do wykonania mdash korzystanie z menu 256Sprawd si mdash korzystanie z zasoboacutew 258
Korzystanie z SWTBot 258Kroki do wykonania mdash ukrywanie ekranu powitalnego 258Kroki do wykonania mdash unikanie b doacutew wykonania z SWTBot 259
Korzystanie z widokoacutew 260Kroki do wykonania mdash wy wietlenie widokoacutew 260Kroki do wykonania mdash przes uchiwanie widokoacutew 261
Interakcja z interfejsem u ytkownika 262Kroki do wykonania mdash pobranie warto ci z interfejsu u ytkownika 262Kroki do wykonania mdash oczekiwanie na warunek 263Sprawd si mdash sterowanie kreatorem nowej klasy 265Quiz mdash dzia anie SWTBot 265
Podsumowanie 265
Rozdzia 10 Automatyczne budowanie przy u yciu Tycho 267
Wykorzystanie Maven i Tycho do budowania wtyczek Eclipse 267Kroki do wykonania mdash instalacja Maven 268Kroki do wykonania mdash budowanie za pomoc Tycho 270Sprawd si mdash korzystanie z platform docelowych 272
Budowanie funkcjonalno ci i witryn aktualizacji za pomoc Tycho 273Kroki do wykonania mdash tworzenie projektu nadrz dnego 273Kroki do wykonania mdash budowanie funkcjonalno ci 275Kroki do wykonania mdash budowanie witryny aktualizacji 276
Kup książkę Poleć książkę
Spis tre ci
8
Kroki do wykonania mdash budowanie produktu 278Sprawd si mdash zale no od komponentoacutew Maven 282
Testy i publikacja 283Kroki do wykonania mdash uruchomienie testoacutew automatycznych 283Kroki do wykonania mdash zmiana numeru wersji 286Sprawd si mdash w czenie budowania dla pozosta ych wtyczek 288
Podpisywanie witryn aktualizacji 288Kroki do wykonania mdash tworzenie certyfikatu podpisanego przez samego siebie 288Kroki do wykonania mdash podpisywanie wtyczek 290Kroki do wykonania mdash serwer z witryn aktualizacji 292Quiz mdash automatyczne budowanie i witryny aktualizacji 293
Podsumowanie 293
Dodatek A Odpowiedzi do quizoacutew 295
Rozdzia 1 Tworzenie pierwszej wtyczki 295Rozdzia 2 Tworzenie widokoacutew w SWT 296Rozdzia 3 Tworzenie widokoacutew w JFace 298Rozdzia 4 Interakcja z u ytkownikiem 299Rozdzia 5 Przechowywanie preferencji i ustawie 300Rozdzia 6 Korzystanie z zasoboacutew 301Rozdzia 7 Model Eclipse 4 301Rozdzia 8 Tworzenie funkcjonalno ci witryn aktualizacji aplikacji i produktoacutew 303Rozdzia 9 Automatyczne testy wtyczek 303Rozdzia 10 Automatyczne budowanie przy u yciu Tycho 304
Skorowidz 305
Kup książkę Poleć książkę
3
Tworzenie widokoacuteww JFace
W poprzednim rozdziale przyjrzeli my si podstawowym elementom SWTktoacutere stanowi pomost mi dzy elementami systemu operacyjnego a Jav W tym rozdziale
poznamy JFace ktoacutery korzysta z SWT w celu zapewnienia architektury MVCa tak e dostarczenia wielu typowych widgetoacutew u ywanych przez Eclipse
W tym rozdziale utworzymy widok do przedstawiania hierarchicznych danych u yjemy zasoboacutew obrazu czcionki lub koloru wygenerujemy stylizowany tekst posortujemy i przefiltrujemy wpisy w widokach dodamy akcje dla podwoacutejnych klikni zaznaczymy i obs u ymy w a ciwo ci utworzymy widok dla danych tabelarycznych
Dlaczego JFaceCho SWT zapewnia podstawow implementacj prostych widgetoacutew (na przyk ad drzewprzyciskoacutew i etykiet) wszystko dzia a na bardzo podstawowym poziomie bo wykorzystywanes teksty i indeksy zaznacze Aby atwiej wy wietla strukturyzowane dane JFace udost p-nia kilka zaawansowanych widokoacutew ktoacutere stanowi po czenie widgetoacutew SWT i mened eroacutewzdarze co zapewnia wygodn obs ug interfejsu u ytkownika dla strukturyzowanych tre ci
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
84
Istnieje wiele rodzajoacutew zaawansowanych widokoacutew nazywanych viewer (wszystkie dziedziczpo klasie Viewer) ale najcz ciej stosowanymi s te ktoacutere nale do ContentViewer na przyk adTreeViewer i TableViewer Istniej roacutewnie wersje bazuj ce na tek cie (TextViewer ma podklasydla SourceViewer) a tak e widoki operacyjne (ConsoleViewer dla widoku Console lub Detailed-ProgressViewer dla widoku Progress) W tym rozdziale wykonamy widoki bazuj ce na klasachTreeViewer i TableViewer Poniewa JFace bazuje na SWT wiedza na temat szczegoacute oacutewdzia ania SWT jest niezb dna do prawid owego u ytkowania JFace
Tworzenie widokoacutew TreeViewerWiele widgetoacutew w Eclipse bazuje na widoku przypominaj cym drzewo mdash jest to zaroacutewnonawigator plikoacutew jak i okno wy wietlania zawarto ci klas Framework JFace udost pnia klasTreeViewer realizuj c wszystkie niezb dne funkcjonalno ci U yjemy jej do wykonania widokuTimeZoneTreeView
Kroki do wykonania mdash tworzenie obiektu TreeViewerPodobnie jak mia o to miejsce w poprzednim rozdziale nowy widok TimeZoneTreeView utwo-rzymy przy u yciu edytora pluginxml Widok wy wietli strefy czasowe u o one hierarchiczniewzgl dem regionoacutew
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest by otworzy plik pluginxml je li jeszczenie jest otwarty
2 Otwoacuterz zak adk Extensions i znajd element orgeclipseuiviews Kliknij go prawymprzyciskiem myszy i z menu wybierz polecenie NewView Wype nij pola w sposoacutebopisany poni ej
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Name wpisz Widok drzewa stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
3 Zapisz plik Konfigurator umie ci w pliku pluginxml nast puj cy wpis
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTreeView icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTreeView name=Widok drzewa stref czasowych restorable=truegtltviewgt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
85
4 Podobnie jak wcze niej utwoacuterz klas TimeZoneTreeView ktoacutera rozszerza klasViewPart
5 W metodzie createPartControl() utwoacuterz instancj TreeViewer z opcjami V_SCROLLH_SCROLL i MULTI Zapami taj obiekt w polu klasy Zaimplementuj metod setFocus()by ustawia a widok drzewa jako aktywny element
public class TimeZoneTreeView extends ViewPart private TreeViewer treeViewer public void createPartControl(Composite parent) treeViewer = new TreeViewer(parent SWTMULTI | SWTH_SCROLL | SWTV_SCROLL ) public void setFocus() treeViewergetControl()setFocus()
E4 Cho Eclipse 4 zostanie szczegoacute owo omoacutewione w rozdziale 7 warto wspomnie e w Eclipse4 nad metod createPartControl() niezb dna jest adnotacja Inject (by zapewni przekazanieobiektu Composite) a nad metod setFocus() mdash adnotacja Focus
6 Uruchom testow wersj Eclipse i przejd do widoku wybieraj c polecenieWindowShowViewOther ledzenie czasuWidok drzewa stref czasowych
7 W odroacute nieniu od Swing gdzie oczekuje si otrzymywania danych w klasiebazuj cej na konkretnym interfejsie JFace nie wymaga adnej konkretnej klasyW zamian oczekuje obiektu warto ci do wy wietlenia (wej cie) interfejsu ktoacuteryczyta dane (dostawca tre ci) i interfejsu do wy wietlania danych (dostawca etykiet)
8 Utwoacuterz now klas o nazwie TimeZoneLabelProvider dziedzicz ca po LabelProvider(z pakietu orgeclipsejfaceviewers) B dzie zawiera a metod o nazwie getText()ktoacutera otrzymuje obiekt i zamienia go na reprezentacj tekstow Zamiast wywo ywatoString() zwroacute odpowiedni warto zwi zan z MapEntry lub TimeZone
public class TimeZoneLabelProvider extends LabelProvider public String getText(Object element) if (element instanceof Map) return Strefy czasowe
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
86
else if (element instanceof MapEntry) return ((MapEntry) element)getKey()toString() else if (element instanceof TimeZone) return ((TimeZone) element)getID()split()[1] else return Nieznany typ + elementgetClass()
Poniewa obiekt TreeViewer mo e mie wiele korzeni test instanceof Map s u ydo sprawdzenia czy to wierzcho ek drzewa ktoacutery powinien mie nazw Strefyczasowe
9 Warto zapewni warto domy ln mdash nawet je li jest to pusty tekstmdash bo otrzymanie nieznanego typu mo na atwo wy ledzi i naprawi
10 Utwoacuterz now klas TimeZoneContentProvider implementuj c interfejsITreeContentProvider Interfejs wymaga implementacji trzech metod z sze ciu(pozosta e mog pozosta puste) Oto one
hasChildren() mdash zwraca true je li w ze ma potomkoacutew getChildren() mdash zwraca potomkoacutew konkretnego w z a getElements() mdash zapewnia g oacutewne korzenie
11 Metoda hasChildren() zwroacuteci warto true je li zostanie do niej przekazany obiekttypu Map lub Collection ktoacutery nie b dzie pusty Przekazanie MapEntry spowodujewywo anie rekurencyjne Dla drzew bazuj cych na zagnie d onych Map lubCollection metoda hasChildren() b dzie wygl da a identycznie
public boolean hasChildren(Object element) if (element instanceof Map) return ((Map) element)isEmpty() else if (element instanceof MapEntry) return hasChildren(((MapEntry)element)getValue()) else if (element instanceof Collection) return ((Collection) element)isEmpty() else return false
12 Implementacja getChildren() rekurencyjnie wchodzi do obiektoacutew typu MapCollection lub MapEntry stosuj c przy tym opisany wcze niej wzorzec Poniewametoda wymaga zwroacutecenia typu Object[] kod u ywa funkcjonalno ci wbudowanejw klas Map by zamieni zawarto entrySet() na tablic
public Object[] getChildren(Object parentElement) if (parentElement instanceof Map) return ((Map) parentElement)entrySet()toArray()
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
87
else if (parentElement instanceof MapEntry) return getChildren(((MapEntry)parentElement)getValue()) else if (parentElement instanceof Collection) return ((Collection) parentElement)toArray() else return new Object[0]
13 Kluczem przy implementacji ITreeContentProvider jest zapewnienie sta ejsynchronizacji kodu metod getChildren() i hasChildren() Jednym ze sposoboacutewzapewnienia takiej sytuacji jest u ycie w metodzie hasChildren() metodygetChildren() i sprawdzanie czy tablica jest pusta ale wydajno takiej operacjinie b dzie najlepsza je li getChildren() to operacja bardzo z o ona obliczeniowo
14 Poniewa TreeViewer mo e mie wiele korzeni istnieje metoda pobieraj ca tablickorzeni z elementu wej ciowego B d we frameworku JFace uniemo liwiaargumentowi getElements() posiadanie w asnej warto ci Z tego powodu przyj osi e najlepiej przekaza tablic (zawieraj c tylko jeden element) i nast pnie jzwroacuteci Metoda przedstawiona poni ej b dzie najprawdopodobniej wygl da atak samo dla ka dej klasy TreeContentProvider ktoacuter kiedykolwiek napiszesz
public Object[] getElements(Object inputElement) if (inputElement instanceof Object[]) return (Object[]) inputElement else return new Object[0]
15 Po zako czeniu tworzenia odpowiednich klas dostawcoacutew danych przejd dometody createPartControl() klasy TimeZoneTreeView by po czy dostawcoacutewz obiektem widoku i ustali obiekt b d cy roacuted em danych
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetContentProvider(new TimeZoneContentProvider())treeViewersetInput(new Object[]TimeZoneComparatorgetTimeZones())
16 Uruchom testow wersj Eclipse i otwoacuterz widok poleceniem WindowShowViewOther ledzenie czasuWidok drzewa stref czasowych by zobaczy efekt ko cowy
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
88
Co si sta oDane do TreeViewer przekazali my przy u yciu metody setInput() Metoda prawie zawszeotrzymuje tablic obiektoacutew nawet je li jest to tylko jeden element
Aby zapewni rozpakowanie struktury danych interfejs ITreeContentProvider udost pniadwie kluczowe metody mdash hasChildren() i getChildren() Umo liwiaj one przechodzenieprzez struktur danych na danie gdy u ytkownik zwija lub rozwija ga zie drzewa Powodemistnienia dwoacutech metod jest fakt i obliczenia w metodzie getChildren() mog by bardzokosztowne Metoda hasChildren() s u y do sprawdzenia czy nale y wy wietli ikon rozwi-ni cia w z a Wywo anie metody getChildren() jest opoacute nione a do momentu faktycznegootwarcia w z a
W strukturach danych ktoacutere to zapewniaj warto roacutewnie zaimplementowa metod getParent()umo liwia ona dost p do obiektu Je li jest zaimplementowana wywo anie viewerreveal(Object)powoduje rozwini cie w z oacutew w hierarchii by ods oni wskazany obiekt
Do wy wietlenia etykiet na drzewie s u y klasa LabelProvider Dostarcza ona etykiet(i opcjonalny obrazek) dla ka dego elementu Dla ka dego typu obiektu mo na u y innejikony Z rozwi zania tego skorzystano w widoku Package z perspektywy Java ktoacutery wy wietlaikon klasy dla klas ikon pakietu dla pakietoacutew i tak dalej
Klasa LabelProvider mo e wy wietla komunikaty na roacute ne sposoby Nic nie stoi na prze-szkodzie by doda do etykiety informacj o przesuni ciu czasowym (roacute nic mi dzy konkretnstref czasow i czasem GMT)
Kroki do wykonania mdash JFace i obrazyKlasa TimeZoneLabelProvider mo e zwroacuteci obiekt Image b d cy standardowym widgetem SWTCho obraz (obiekt Image) mo na wczyta w sposoacuteb podobny jak w poprzednim rozdziale JFaceoferuje rejestry zasoboacutew s u ce do zarz dzania zestawami zasoboacutew aplikacji Rejestry obs u-guj klasy ImageRegistry FontRegistry i ColorRegistry Rejestr zasoboacutew ma za zadanie prze-chowywa list obiektoacutew Resource i zwalnia je we w a ciwy sposoacuteb ale tylko wtedy gdy nies ju potrzebne
JFace posiada rejestry globalne ale istniej roacutewnie rejestry bardziej szczegoacute owe u ywaneprzez IDE na przyk ad do przechowywania list ikon folderoacutew i plikoacutew W rejestrze tego typukorzysta si z deskryptoroacutew do okre lania konkretnych zasoboacutew wi c po przekazaniu de-skryptora otrzymuje si odpowiadaj c mu instancj zasobu Zwroacuteconym zasobem zarz dzarejestr wi c kod ktoacutery go otrzyma nie powinien go zwalnia
1 W TimeZoneLabelProvider dodaj metod getImage() w ktoacuterej u ywa si rejestruobrazoacutew ImageRegistry by pobra ikon folderu Oto kod metody
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
89
public Image getImage(Object element) if(element instanceof MapEntry) returnPlatformUIgetWorkbench()getSharedImages()getImage(ISharedImagesIMG_OBJ_FOLDER) else return supergetImage(element)
2 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowych Oboktekstu z nazw regionu pojawi si ikona folderu Instancji Image nie trzeba niszczysamodzielnie poniewa nale y do wtyczki PlatformUI (zasoacuteb obrazu zostaniezwolniony w momencie wy czania PlatformUI)
E4 W Eclipse 4 instancj ISharedImages mo na otrzyma poprzez wstrzykni cie
Injectprivate ISharedImages imagesimagesgetImage(ISharedImagesIMG_OBJ_FOLDER)
3 By otrzyma inny obraz u yj globalnych instancji ImageRegistry lub JFaceRegistrylub utwoacuterz w asn kopi Zastosowanie globalnej wersji oznacza e obraz Imagenigdy nie zostanie zniszczony poniewa JFaceRegistry istnieje przez ca y czasycia instancji Eclipse
Zamiast tego utwoacuterz obiekty LocalResourceManager i ImageRegistry powi zanez cyklem ycia kontrolki Gdy kontrolka nadrz dna b dzie usuwana automatycznieusuni te zostan roacutewnie obrazy Umie w metodzie CreatePartControl klasyTimeZoneTreeView poni szy kod
public void createPartControl(Composite parent) ResourceManager rm = JFaceResourcesgetResources() LocalResourceManager lrm = new LocalResourceManager(rmparent)
4 U ywaj c obiektu LocalResourceManger utwoacuterz instancj ImageRegistry i za pomocmetody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL
ImageRegistry ir = new ImageRegistry(lrm)URL sample = getClass()getResource(iconssamplegif)irput(sample ImageDescriptorcreateFromURL(sample))
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Spis tre ci
7
Rozdzia 8 Tworzenie funkcjonalno ci witryn aktualizacji aplikacji i produktoacutew 227
Grupowanie wtyczek jako funkcjonalno ci 228Kroki do wykonania mdash tworzenie funkcjonalno ci 228Kroki do wykonania mdash eksport funkcjonalno ci 230Kroki do wykonania mdash instalacja funkcjonalno ci 232Kroki do wykonania mdash kategoryzacja witryny aktualizacji 234Kroki do wykonania mdash zale no od innych funkcjonalno ci 237Kroki do wykonania mdash tworzenie oznacze funkcjonalno ci 239Sprawd si mdash zdalna publikacja zawarto ci 241
Budowanie aplikacji i produktoacutew 241Kroki do wykonania mdash wykonanie aplikacji bez interfejsu u ytkownika 242Kroki do wykonania mdash tworzenie produktu 245Sprawd si mdash tworzenie produktu bazuj cego na funkcjonalno ci 249Quiz mdash sposoacuteb dzia ania funkcjonalno ci aplikacji i produktoacutew 249
Podsumowanie 249
Rozdzia 9 Automatyczne testy wtyczek 251
U ycie frameworku JUnit do testoacutew zautomatyzowanych 251Kroki do wykonania mdash wykonanie prostego przypadku testowego JUnit 252Kroki do wykonania mdash wykonanie testu wtyczki 253
Wykorzystanie SWTBot do testoacutew interfejsu graficznego 254Kroki do wykonania mdash tworzenie testoacutew SWTBot 254Kroki do wykonania mdash korzystanie z menu 256Sprawd si mdash korzystanie z zasoboacutew 258
Korzystanie z SWTBot 258Kroki do wykonania mdash ukrywanie ekranu powitalnego 258Kroki do wykonania mdash unikanie b doacutew wykonania z SWTBot 259
Korzystanie z widokoacutew 260Kroki do wykonania mdash wy wietlenie widokoacutew 260Kroki do wykonania mdash przes uchiwanie widokoacutew 261
Interakcja z interfejsem u ytkownika 262Kroki do wykonania mdash pobranie warto ci z interfejsu u ytkownika 262Kroki do wykonania mdash oczekiwanie na warunek 263Sprawd si mdash sterowanie kreatorem nowej klasy 265Quiz mdash dzia anie SWTBot 265
Podsumowanie 265
Rozdzia 10 Automatyczne budowanie przy u yciu Tycho 267
Wykorzystanie Maven i Tycho do budowania wtyczek Eclipse 267Kroki do wykonania mdash instalacja Maven 268Kroki do wykonania mdash budowanie za pomoc Tycho 270Sprawd si mdash korzystanie z platform docelowych 272
Budowanie funkcjonalno ci i witryn aktualizacji za pomoc Tycho 273Kroki do wykonania mdash tworzenie projektu nadrz dnego 273Kroki do wykonania mdash budowanie funkcjonalno ci 275Kroki do wykonania mdash budowanie witryny aktualizacji 276
Kup książkę Poleć książkę
Spis tre ci
8
Kroki do wykonania mdash budowanie produktu 278Sprawd si mdash zale no od komponentoacutew Maven 282
Testy i publikacja 283Kroki do wykonania mdash uruchomienie testoacutew automatycznych 283Kroki do wykonania mdash zmiana numeru wersji 286Sprawd si mdash w czenie budowania dla pozosta ych wtyczek 288
Podpisywanie witryn aktualizacji 288Kroki do wykonania mdash tworzenie certyfikatu podpisanego przez samego siebie 288Kroki do wykonania mdash podpisywanie wtyczek 290Kroki do wykonania mdash serwer z witryn aktualizacji 292Quiz mdash automatyczne budowanie i witryny aktualizacji 293
Podsumowanie 293
Dodatek A Odpowiedzi do quizoacutew 295
Rozdzia 1 Tworzenie pierwszej wtyczki 295Rozdzia 2 Tworzenie widokoacutew w SWT 296Rozdzia 3 Tworzenie widokoacutew w JFace 298Rozdzia 4 Interakcja z u ytkownikiem 299Rozdzia 5 Przechowywanie preferencji i ustawie 300Rozdzia 6 Korzystanie z zasoboacutew 301Rozdzia 7 Model Eclipse 4 301Rozdzia 8 Tworzenie funkcjonalno ci witryn aktualizacji aplikacji i produktoacutew 303Rozdzia 9 Automatyczne testy wtyczek 303Rozdzia 10 Automatyczne budowanie przy u yciu Tycho 304
Skorowidz 305
Kup książkę Poleć książkę
3
Tworzenie widokoacuteww JFace
W poprzednim rozdziale przyjrzeli my si podstawowym elementom SWTktoacutere stanowi pomost mi dzy elementami systemu operacyjnego a Jav W tym rozdziale
poznamy JFace ktoacutery korzysta z SWT w celu zapewnienia architektury MVCa tak e dostarczenia wielu typowych widgetoacutew u ywanych przez Eclipse
W tym rozdziale utworzymy widok do przedstawiania hierarchicznych danych u yjemy zasoboacutew obrazu czcionki lub koloru wygenerujemy stylizowany tekst posortujemy i przefiltrujemy wpisy w widokach dodamy akcje dla podwoacutejnych klikni zaznaczymy i obs u ymy w a ciwo ci utworzymy widok dla danych tabelarycznych
Dlaczego JFaceCho SWT zapewnia podstawow implementacj prostych widgetoacutew (na przyk ad drzewprzyciskoacutew i etykiet) wszystko dzia a na bardzo podstawowym poziomie bo wykorzystywanes teksty i indeksy zaznacze Aby atwiej wy wietla strukturyzowane dane JFace udost p-nia kilka zaawansowanych widokoacutew ktoacutere stanowi po czenie widgetoacutew SWT i mened eroacutewzdarze co zapewnia wygodn obs ug interfejsu u ytkownika dla strukturyzowanych tre ci
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
84
Istnieje wiele rodzajoacutew zaawansowanych widokoacutew nazywanych viewer (wszystkie dziedziczpo klasie Viewer) ale najcz ciej stosowanymi s te ktoacutere nale do ContentViewer na przyk adTreeViewer i TableViewer Istniej roacutewnie wersje bazuj ce na tek cie (TextViewer ma podklasydla SourceViewer) a tak e widoki operacyjne (ConsoleViewer dla widoku Console lub Detailed-ProgressViewer dla widoku Progress) W tym rozdziale wykonamy widoki bazuj ce na klasachTreeViewer i TableViewer Poniewa JFace bazuje na SWT wiedza na temat szczegoacute oacutewdzia ania SWT jest niezb dna do prawid owego u ytkowania JFace
Tworzenie widokoacutew TreeViewerWiele widgetoacutew w Eclipse bazuje na widoku przypominaj cym drzewo mdash jest to zaroacutewnonawigator plikoacutew jak i okno wy wietlania zawarto ci klas Framework JFace udost pnia klasTreeViewer realizuj c wszystkie niezb dne funkcjonalno ci U yjemy jej do wykonania widokuTimeZoneTreeView
Kroki do wykonania mdash tworzenie obiektu TreeViewerPodobnie jak mia o to miejsce w poprzednim rozdziale nowy widok TimeZoneTreeView utwo-rzymy przy u yciu edytora pluginxml Widok wy wietli strefy czasowe u o one hierarchiczniewzgl dem regionoacutew
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest by otworzy plik pluginxml je li jeszczenie jest otwarty
2 Otwoacuterz zak adk Extensions i znajd element orgeclipseuiviews Kliknij go prawymprzyciskiem myszy i z menu wybierz polecenie NewView Wype nij pola w sposoacutebopisany poni ej
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Name wpisz Widok drzewa stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
3 Zapisz plik Konfigurator umie ci w pliku pluginxml nast puj cy wpis
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTreeView icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTreeView name=Widok drzewa stref czasowych restorable=truegtltviewgt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
85
4 Podobnie jak wcze niej utwoacuterz klas TimeZoneTreeView ktoacutera rozszerza klasViewPart
5 W metodzie createPartControl() utwoacuterz instancj TreeViewer z opcjami V_SCROLLH_SCROLL i MULTI Zapami taj obiekt w polu klasy Zaimplementuj metod setFocus()by ustawia a widok drzewa jako aktywny element
public class TimeZoneTreeView extends ViewPart private TreeViewer treeViewer public void createPartControl(Composite parent) treeViewer = new TreeViewer(parent SWTMULTI | SWTH_SCROLL | SWTV_SCROLL ) public void setFocus() treeViewergetControl()setFocus()
E4 Cho Eclipse 4 zostanie szczegoacute owo omoacutewione w rozdziale 7 warto wspomnie e w Eclipse4 nad metod createPartControl() niezb dna jest adnotacja Inject (by zapewni przekazanieobiektu Composite) a nad metod setFocus() mdash adnotacja Focus
6 Uruchom testow wersj Eclipse i przejd do widoku wybieraj c polecenieWindowShowViewOther ledzenie czasuWidok drzewa stref czasowych
7 W odroacute nieniu od Swing gdzie oczekuje si otrzymywania danych w klasiebazuj cej na konkretnym interfejsie JFace nie wymaga adnej konkretnej klasyW zamian oczekuje obiektu warto ci do wy wietlenia (wej cie) interfejsu ktoacuteryczyta dane (dostawca tre ci) i interfejsu do wy wietlania danych (dostawca etykiet)
8 Utwoacuterz now klas o nazwie TimeZoneLabelProvider dziedzicz ca po LabelProvider(z pakietu orgeclipsejfaceviewers) B dzie zawiera a metod o nazwie getText()ktoacutera otrzymuje obiekt i zamienia go na reprezentacj tekstow Zamiast wywo ywatoString() zwroacute odpowiedni warto zwi zan z MapEntry lub TimeZone
public class TimeZoneLabelProvider extends LabelProvider public String getText(Object element) if (element instanceof Map) return Strefy czasowe
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
86
else if (element instanceof MapEntry) return ((MapEntry) element)getKey()toString() else if (element instanceof TimeZone) return ((TimeZone) element)getID()split()[1] else return Nieznany typ + elementgetClass()
Poniewa obiekt TreeViewer mo e mie wiele korzeni test instanceof Map s u ydo sprawdzenia czy to wierzcho ek drzewa ktoacutery powinien mie nazw Strefyczasowe
9 Warto zapewni warto domy ln mdash nawet je li jest to pusty tekstmdash bo otrzymanie nieznanego typu mo na atwo wy ledzi i naprawi
10 Utwoacuterz now klas TimeZoneContentProvider implementuj c interfejsITreeContentProvider Interfejs wymaga implementacji trzech metod z sze ciu(pozosta e mog pozosta puste) Oto one
hasChildren() mdash zwraca true je li w ze ma potomkoacutew getChildren() mdash zwraca potomkoacutew konkretnego w z a getElements() mdash zapewnia g oacutewne korzenie
11 Metoda hasChildren() zwroacuteci warto true je li zostanie do niej przekazany obiekttypu Map lub Collection ktoacutery nie b dzie pusty Przekazanie MapEntry spowodujewywo anie rekurencyjne Dla drzew bazuj cych na zagnie d onych Map lubCollection metoda hasChildren() b dzie wygl da a identycznie
public boolean hasChildren(Object element) if (element instanceof Map) return ((Map) element)isEmpty() else if (element instanceof MapEntry) return hasChildren(((MapEntry)element)getValue()) else if (element instanceof Collection) return ((Collection) element)isEmpty() else return false
12 Implementacja getChildren() rekurencyjnie wchodzi do obiektoacutew typu MapCollection lub MapEntry stosuj c przy tym opisany wcze niej wzorzec Poniewametoda wymaga zwroacutecenia typu Object[] kod u ywa funkcjonalno ci wbudowanejw klas Map by zamieni zawarto entrySet() na tablic
public Object[] getChildren(Object parentElement) if (parentElement instanceof Map) return ((Map) parentElement)entrySet()toArray()
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
87
else if (parentElement instanceof MapEntry) return getChildren(((MapEntry)parentElement)getValue()) else if (parentElement instanceof Collection) return ((Collection) parentElement)toArray() else return new Object[0]
13 Kluczem przy implementacji ITreeContentProvider jest zapewnienie sta ejsynchronizacji kodu metod getChildren() i hasChildren() Jednym ze sposoboacutewzapewnienia takiej sytuacji jest u ycie w metodzie hasChildren() metodygetChildren() i sprawdzanie czy tablica jest pusta ale wydajno takiej operacjinie b dzie najlepsza je li getChildren() to operacja bardzo z o ona obliczeniowo
14 Poniewa TreeViewer mo e mie wiele korzeni istnieje metoda pobieraj ca tablickorzeni z elementu wej ciowego B d we frameworku JFace uniemo liwiaargumentowi getElements() posiadanie w asnej warto ci Z tego powodu przyj osi e najlepiej przekaza tablic (zawieraj c tylko jeden element) i nast pnie jzwroacuteci Metoda przedstawiona poni ej b dzie najprawdopodobniej wygl da atak samo dla ka dej klasy TreeContentProvider ktoacuter kiedykolwiek napiszesz
public Object[] getElements(Object inputElement) if (inputElement instanceof Object[]) return (Object[]) inputElement else return new Object[0]
15 Po zako czeniu tworzenia odpowiednich klas dostawcoacutew danych przejd dometody createPartControl() klasy TimeZoneTreeView by po czy dostawcoacutewz obiektem widoku i ustali obiekt b d cy roacuted em danych
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetContentProvider(new TimeZoneContentProvider())treeViewersetInput(new Object[]TimeZoneComparatorgetTimeZones())
16 Uruchom testow wersj Eclipse i otwoacuterz widok poleceniem WindowShowViewOther ledzenie czasuWidok drzewa stref czasowych by zobaczy efekt ko cowy
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
88
Co si sta oDane do TreeViewer przekazali my przy u yciu metody setInput() Metoda prawie zawszeotrzymuje tablic obiektoacutew nawet je li jest to tylko jeden element
Aby zapewni rozpakowanie struktury danych interfejs ITreeContentProvider udost pniadwie kluczowe metody mdash hasChildren() i getChildren() Umo liwiaj one przechodzenieprzez struktur danych na danie gdy u ytkownik zwija lub rozwija ga zie drzewa Powodemistnienia dwoacutech metod jest fakt i obliczenia w metodzie getChildren() mog by bardzokosztowne Metoda hasChildren() s u y do sprawdzenia czy nale y wy wietli ikon rozwi-ni cia w z a Wywo anie metody getChildren() jest opoacute nione a do momentu faktycznegootwarcia w z a
W strukturach danych ktoacutere to zapewniaj warto roacutewnie zaimplementowa metod getParent()umo liwia ona dost p do obiektu Je li jest zaimplementowana wywo anie viewerreveal(Object)powoduje rozwini cie w z oacutew w hierarchii by ods oni wskazany obiekt
Do wy wietlenia etykiet na drzewie s u y klasa LabelProvider Dostarcza ona etykiet(i opcjonalny obrazek) dla ka dego elementu Dla ka dego typu obiektu mo na u y innejikony Z rozwi zania tego skorzystano w widoku Package z perspektywy Java ktoacutery wy wietlaikon klasy dla klas ikon pakietu dla pakietoacutew i tak dalej
Klasa LabelProvider mo e wy wietla komunikaty na roacute ne sposoby Nic nie stoi na prze-szkodzie by doda do etykiety informacj o przesuni ciu czasowym (roacute nic mi dzy konkretnstref czasow i czasem GMT)
Kroki do wykonania mdash JFace i obrazyKlasa TimeZoneLabelProvider mo e zwroacuteci obiekt Image b d cy standardowym widgetem SWTCho obraz (obiekt Image) mo na wczyta w sposoacuteb podobny jak w poprzednim rozdziale JFaceoferuje rejestry zasoboacutew s u ce do zarz dzania zestawami zasoboacutew aplikacji Rejestry obs u-guj klasy ImageRegistry FontRegistry i ColorRegistry Rejestr zasoboacutew ma za zadanie prze-chowywa list obiektoacutew Resource i zwalnia je we w a ciwy sposoacuteb ale tylko wtedy gdy nies ju potrzebne
JFace posiada rejestry globalne ale istniej roacutewnie rejestry bardziej szczegoacute owe u ywaneprzez IDE na przyk ad do przechowywania list ikon folderoacutew i plikoacutew W rejestrze tego typukorzysta si z deskryptoroacutew do okre lania konkretnych zasoboacutew wi c po przekazaniu de-skryptora otrzymuje si odpowiadaj c mu instancj zasobu Zwroacuteconym zasobem zarz dzarejestr wi c kod ktoacutery go otrzyma nie powinien go zwalnia
1 W TimeZoneLabelProvider dodaj metod getImage() w ktoacuterej u ywa si rejestruobrazoacutew ImageRegistry by pobra ikon folderu Oto kod metody
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
89
public Image getImage(Object element) if(element instanceof MapEntry) returnPlatformUIgetWorkbench()getSharedImages()getImage(ISharedImagesIMG_OBJ_FOLDER) else return supergetImage(element)
2 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowych Oboktekstu z nazw regionu pojawi si ikona folderu Instancji Image nie trzeba niszczysamodzielnie poniewa nale y do wtyczki PlatformUI (zasoacuteb obrazu zostaniezwolniony w momencie wy czania PlatformUI)
E4 W Eclipse 4 instancj ISharedImages mo na otrzyma poprzez wstrzykni cie
Injectprivate ISharedImages imagesimagesgetImage(ISharedImagesIMG_OBJ_FOLDER)
3 By otrzyma inny obraz u yj globalnych instancji ImageRegistry lub JFaceRegistrylub utwoacuterz w asn kopi Zastosowanie globalnej wersji oznacza e obraz Imagenigdy nie zostanie zniszczony poniewa JFaceRegistry istnieje przez ca y czasycia instancji Eclipse
Zamiast tego utwoacuterz obiekty LocalResourceManager i ImageRegistry powi zanez cyklem ycia kontrolki Gdy kontrolka nadrz dna b dzie usuwana automatycznieusuni te zostan roacutewnie obrazy Umie w metodzie CreatePartControl klasyTimeZoneTreeView poni szy kod
public void createPartControl(Composite parent) ResourceManager rm = JFaceResourcesgetResources() LocalResourceManager lrm = new LocalResourceManager(rmparent)
4 U ywaj c obiektu LocalResourceManger utwoacuterz instancj ImageRegistry i za pomocmetody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL
ImageRegistry ir = new ImageRegistry(lrm)URL sample = getClass()getResource(iconssamplegif)irput(sample ImageDescriptorcreateFromURL(sample))
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Spis tre ci
8
Kroki do wykonania mdash budowanie produktu 278Sprawd si mdash zale no od komponentoacutew Maven 282
Testy i publikacja 283Kroki do wykonania mdash uruchomienie testoacutew automatycznych 283Kroki do wykonania mdash zmiana numeru wersji 286Sprawd si mdash w czenie budowania dla pozosta ych wtyczek 288
Podpisywanie witryn aktualizacji 288Kroki do wykonania mdash tworzenie certyfikatu podpisanego przez samego siebie 288Kroki do wykonania mdash podpisywanie wtyczek 290Kroki do wykonania mdash serwer z witryn aktualizacji 292Quiz mdash automatyczne budowanie i witryny aktualizacji 293
Podsumowanie 293
Dodatek A Odpowiedzi do quizoacutew 295
Rozdzia 1 Tworzenie pierwszej wtyczki 295Rozdzia 2 Tworzenie widokoacutew w SWT 296Rozdzia 3 Tworzenie widokoacutew w JFace 298Rozdzia 4 Interakcja z u ytkownikiem 299Rozdzia 5 Przechowywanie preferencji i ustawie 300Rozdzia 6 Korzystanie z zasoboacutew 301Rozdzia 7 Model Eclipse 4 301Rozdzia 8 Tworzenie funkcjonalno ci witryn aktualizacji aplikacji i produktoacutew 303Rozdzia 9 Automatyczne testy wtyczek 303Rozdzia 10 Automatyczne budowanie przy u yciu Tycho 304
Skorowidz 305
Kup książkę Poleć książkę
3
Tworzenie widokoacuteww JFace
W poprzednim rozdziale przyjrzeli my si podstawowym elementom SWTktoacutere stanowi pomost mi dzy elementami systemu operacyjnego a Jav W tym rozdziale
poznamy JFace ktoacutery korzysta z SWT w celu zapewnienia architektury MVCa tak e dostarczenia wielu typowych widgetoacutew u ywanych przez Eclipse
W tym rozdziale utworzymy widok do przedstawiania hierarchicznych danych u yjemy zasoboacutew obrazu czcionki lub koloru wygenerujemy stylizowany tekst posortujemy i przefiltrujemy wpisy w widokach dodamy akcje dla podwoacutejnych klikni zaznaczymy i obs u ymy w a ciwo ci utworzymy widok dla danych tabelarycznych
Dlaczego JFaceCho SWT zapewnia podstawow implementacj prostych widgetoacutew (na przyk ad drzewprzyciskoacutew i etykiet) wszystko dzia a na bardzo podstawowym poziomie bo wykorzystywanes teksty i indeksy zaznacze Aby atwiej wy wietla strukturyzowane dane JFace udost p-nia kilka zaawansowanych widokoacutew ktoacutere stanowi po czenie widgetoacutew SWT i mened eroacutewzdarze co zapewnia wygodn obs ug interfejsu u ytkownika dla strukturyzowanych tre ci
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
84
Istnieje wiele rodzajoacutew zaawansowanych widokoacutew nazywanych viewer (wszystkie dziedziczpo klasie Viewer) ale najcz ciej stosowanymi s te ktoacutere nale do ContentViewer na przyk adTreeViewer i TableViewer Istniej roacutewnie wersje bazuj ce na tek cie (TextViewer ma podklasydla SourceViewer) a tak e widoki operacyjne (ConsoleViewer dla widoku Console lub Detailed-ProgressViewer dla widoku Progress) W tym rozdziale wykonamy widoki bazuj ce na klasachTreeViewer i TableViewer Poniewa JFace bazuje na SWT wiedza na temat szczegoacute oacutewdzia ania SWT jest niezb dna do prawid owego u ytkowania JFace
Tworzenie widokoacutew TreeViewerWiele widgetoacutew w Eclipse bazuje na widoku przypominaj cym drzewo mdash jest to zaroacutewnonawigator plikoacutew jak i okno wy wietlania zawarto ci klas Framework JFace udost pnia klasTreeViewer realizuj c wszystkie niezb dne funkcjonalno ci U yjemy jej do wykonania widokuTimeZoneTreeView
Kroki do wykonania mdash tworzenie obiektu TreeViewerPodobnie jak mia o to miejsce w poprzednim rozdziale nowy widok TimeZoneTreeView utwo-rzymy przy u yciu edytora pluginxml Widok wy wietli strefy czasowe u o one hierarchiczniewzgl dem regionoacutew
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest by otworzy plik pluginxml je li jeszczenie jest otwarty
2 Otwoacuterz zak adk Extensions i znajd element orgeclipseuiviews Kliknij go prawymprzyciskiem myszy i z menu wybierz polecenie NewView Wype nij pola w sposoacutebopisany poni ej
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Name wpisz Widok drzewa stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
3 Zapisz plik Konfigurator umie ci w pliku pluginxml nast puj cy wpis
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTreeView icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTreeView name=Widok drzewa stref czasowych restorable=truegtltviewgt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
85
4 Podobnie jak wcze niej utwoacuterz klas TimeZoneTreeView ktoacutera rozszerza klasViewPart
5 W metodzie createPartControl() utwoacuterz instancj TreeViewer z opcjami V_SCROLLH_SCROLL i MULTI Zapami taj obiekt w polu klasy Zaimplementuj metod setFocus()by ustawia a widok drzewa jako aktywny element
public class TimeZoneTreeView extends ViewPart private TreeViewer treeViewer public void createPartControl(Composite parent) treeViewer = new TreeViewer(parent SWTMULTI | SWTH_SCROLL | SWTV_SCROLL ) public void setFocus() treeViewergetControl()setFocus()
E4 Cho Eclipse 4 zostanie szczegoacute owo omoacutewione w rozdziale 7 warto wspomnie e w Eclipse4 nad metod createPartControl() niezb dna jest adnotacja Inject (by zapewni przekazanieobiektu Composite) a nad metod setFocus() mdash adnotacja Focus
6 Uruchom testow wersj Eclipse i przejd do widoku wybieraj c polecenieWindowShowViewOther ledzenie czasuWidok drzewa stref czasowych
7 W odroacute nieniu od Swing gdzie oczekuje si otrzymywania danych w klasiebazuj cej na konkretnym interfejsie JFace nie wymaga adnej konkretnej klasyW zamian oczekuje obiektu warto ci do wy wietlenia (wej cie) interfejsu ktoacuteryczyta dane (dostawca tre ci) i interfejsu do wy wietlania danych (dostawca etykiet)
8 Utwoacuterz now klas o nazwie TimeZoneLabelProvider dziedzicz ca po LabelProvider(z pakietu orgeclipsejfaceviewers) B dzie zawiera a metod o nazwie getText()ktoacutera otrzymuje obiekt i zamienia go na reprezentacj tekstow Zamiast wywo ywatoString() zwroacute odpowiedni warto zwi zan z MapEntry lub TimeZone
public class TimeZoneLabelProvider extends LabelProvider public String getText(Object element) if (element instanceof Map) return Strefy czasowe
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
86
else if (element instanceof MapEntry) return ((MapEntry) element)getKey()toString() else if (element instanceof TimeZone) return ((TimeZone) element)getID()split()[1] else return Nieznany typ + elementgetClass()
Poniewa obiekt TreeViewer mo e mie wiele korzeni test instanceof Map s u ydo sprawdzenia czy to wierzcho ek drzewa ktoacutery powinien mie nazw Strefyczasowe
9 Warto zapewni warto domy ln mdash nawet je li jest to pusty tekstmdash bo otrzymanie nieznanego typu mo na atwo wy ledzi i naprawi
10 Utwoacuterz now klas TimeZoneContentProvider implementuj c interfejsITreeContentProvider Interfejs wymaga implementacji trzech metod z sze ciu(pozosta e mog pozosta puste) Oto one
hasChildren() mdash zwraca true je li w ze ma potomkoacutew getChildren() mdash zwraca potomkoacutew konkretnego w z a getElements() mdash zapewnia g oacutewne korzenie
11 Metoda hasChildren() zwroacuteci warto true je li zostanie do niej przekazany obiekttypu Map lub Collection ktoacutery nie b dzie pusty Przekazanie MapEntry spowodujewywo anie rekurencyjne Dla drzew bazuj cych na zagnie d onych Map lubCollection metoda hasChildren() b dzie wygl da a identycznie
public boolean hasChildren(Object element) if (element instanceof Map) return ((Map) element)isEmpty() else if (element instanceof MapEntry) return hasChildren(((MapEntry)element)getValue()) else if (element instanceof Collection) return ((Collection) element)isEmpty() else return false
12 Implementacja getChildren() rekurencyjnie wchodzi do obiektoacutew typu MapCollection lub MapEntry stosuj c przy tym opisany wcze niej wzorzec Poniewametoda wymaga zwroacutecenia typu Object[] kod u ywa funkcjonalno ci wbudowanejw klas Map by zamieni zawarto entrySet() na tablic
public Object[] getChildren(Object parentElement) if (parentElement instanceof Map) return ((Map) parentElement)entrySet()toArray()
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
87
else if (parentElement instanceof MapEntry) return getChildren(((MapEntry)parentElement)getValue()) else if (parentElement instanceof Collection) return ((Collection) parentElement)toArray() else return new Object[0]
13 Kluczem przy implementacji ITreeContentProvider jest zapewnienie sta ejsynchronizacji kodu metod getChildren() i hasChildren() Jednym ze sposoboacutewzapewnienia takiej sytuacji jest u ycie w metodzie hasChildren() metodygetChildren() i sprawdzanie czy tablica jest pusta ale wydajno takiej operacjinie b dzie najlepsza je li getChildren() to operacja bardzo z o ona obliczeniowo
14 Poniewa TreeViewer mo e mie wiele korzeni istnieje metoda pobieraj ca tablickorzeni z elementu wej ciowego B d we frameworku JFace uniemo liwiaargumentowi getElements() posiadanie w asnej warto ci Z tego powodu przyj osi e najlepiej przekaza tablic (zawieraj c tylko jeden element) i nast pnie jzwroacuteci Metoda przedstawiona poni ej b dzie najprawdopodobniej wygl da atak samo dla ka dej klasy TreeContentProvider ktoacuter kiedykolwiek napiszesz
public Object[] getElements(Object inputElement) if (inputElement instanceof Object[]) return (Object[]) inputElement else return new Object[0]
15 Po zako czeniu tworzenia odpowiednich klas dostawcoacutew danych przejd dometody createPartControl() klasy TimeZoneTreeView by po czy dostawcoacutewz obiektem widoku i ustali obiekt b d cy roacuted em danych
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetContentProvider(new TimeZoneContentProvider())treeViewersetInput(new Object[]TimeZoneComparatorgetTimeZones())
16 Uruchom testow wersj Eclipse i otwoacuterz widok poleceniem WindowShowViewOther ledzenie czasuWidok drzewa stref czasowych by zobaczy efekt ko cowy
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
88
Co si sta oDane do TreeViewer przekazali my przy u yciu metody setInput() Metoda prawie zawszeotrzymuje tablic obiektoacutew nawet je li jest to tylko jeden element
Aby zapewni rozpakowanie struktury danych interfejs ITreeContentProvider udost pniadwie kluczowe metody mdash hasChildren() i getChildren() Umo liwiaj one przechodzenieprzez struktur danych na danie gdy u ytkownik zwija lub rozwija ga zie drzewa Powodemistnienia dwoacutech metod jest fakt i obliczenia w metodzie getChildren() mog by bardzokosztowne Metoda hasChildren() s u y do sprawdzenia czy nale y wy wietli ikon rozwi-ni cia w z a Wywo anie metody getChildren() jest opoacute nione a do momentu faktycznegootwarcia w z a
W strukturach danych ktoacutere to zapewniaj warto roacutewnie zaimplementowa metod getParent()umo liwia ona dost p do obiektu Je li jest zaimplementowana wywo anie viewerreveal(Object)powoduje rozwini cie w z oacutew w hierarchii by ods oni wskazany obiekt
Do wy wietlenia etykiet na drzewie s u y klasa LabelProvider Dostarcza ona etykiet(i opcjonalny obrazek) dla ka dego elementu Dla ka dego typu obiektu mo na u y innejikony Z rozwi zania tego skorzystano w widoku Package z perspektywy Java ktoacutery wy wietlaikon klasy dla klas ikon pakietu dla pakietoacutew i tak dalej
Klasa LabelProvider mo e wy wietla komunikaty na roacute ne sposoby Nic nie stoi na prze-szkodzie by doda do etykiety informacj o przesuni ciu czasowym (roacute nic mi dzy konkretnstref czasow i czasem GMT)
Kroki do wykonania mdash JFace i obrazyKlasa TimeZoneLabelProvider mo e zwroacuteci obiekt Image b d cy standardowym widgetem SWTCho obraz (obiekt Image) mo na wczyta w sposoacuteb podobny jak w poprzednim rozdziale JFaceoferuje rejestry zasoboacutew s u ce do zarz dzania zestawami zasoboacutew aplikacji Rejestry obs u-guj klasy ImageRegistry FontRegistry i ColorRegistry Rejestr zasoboacutew ma za zadanie prze-chowywa list obiektoacutew Resource i zwalnia je we w a ciwy sposoacuteb ale tylko wtedy gdy nies ju potrzebne
JFace posiada rejestry globalne ale istniej roacutewnie rejestry bardziej szczegoacute owe u ywaneprzez IDE na przyk ad do przechowywania list ikon folderoacutew i plikoacutew W rejestrze tego typukorzysta si z deskryptoroacutew do okre lania konkretnych zasoboacutew wi c po przekazaniu de-skryptora otrzymuje si odpowiadaj c mu instancj zasobu Zwroacuteconym zasobem zarz dzarejestr wi c kod ktoacutery go otrzyma nie powinien go zwalnia
1 W TimeZoneLabelProvider dodaj metod getImage() w ktoacuterej u ywa si rejestruobrazoacutew ImageRegistry by pobra ikon folderu Oto kod metody
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
89
public Image getImage(Object element) if(element instanceof MapEntry) returnPlatformUIgetWorkbench()getSharedImages()getImage(ISharedImagesIMG_OBJ_FOLDER) else return supergetImage(element)
2 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowych Oboktekstu z nazw regionu pojawi si ikona folderu Instancji Image nie trzeba niszczysamodzielnie poniewa nale y do wtyczki PlatformUI (zasoacuteb obrazu zostaniezwolniony w momencie wy czania PlatformUI)
E4 W Eclipse 4 instancj ISharedImages mo na otrzyma poprzez wstrzykni cie
Injectprivate ISharedImages imagesimagesgetImage(ISharedImagesIMG_OBJ_FOLDER)
3 By otrzyma inny obraz u yj globalnych instancji ImageRegistry lub JFaceRegistrylub utwoacuterz w asn kopi Zastosowanie globalnej wersji oznacza e obraz Imagenigdy nie zostanie zniszczony poniewa JFaceRegistry istnieje przez ca y czasycia instancji Eclipse
Zamiast tego utwoacuterz obiekty LocalResourceManager i ImageRegistry powi zanez cyklem ycia kontrolki Gdy kontrolka nadrz dna b dzie usuwana automatycznieusuni te zostan roacutewnie obrazy Umie w metodzie CreatePartControl klasyTimeZoneTreeView poni szy kod
public void createPartControl(Composite parent) ResourceManager rm = JFaceResourcesgetResources() LocalResourceManager lrm = new LocalResourceManager(rmparent)
4 U ywaj c obiektu LocalResourceManger utwoacuterz instancj ImageRegistry i za pomocmetody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL
ImageRegistry ir = new ImageRegistry(lrm)URL sample = getClass()getResource(iconssamplegif)irput(sample ImageDescriptorcreateFromURL(sample))
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
3
Tworzenie widokoacuteww JFace
W poprzednim rozdziale przyjrzeli my si podstawowym elementom SWTktoacutere stanowi pomost mi dzy elementami systemu operacyjnego a Jav W tym rozdziale
poznamy JFace ktoacutery korzysta z SWT w celu zapewnienia architektury MVCa tak e dostarczenia wielu typowych widgetoacutew u ywanych przez Eclipse
W tym rozdziale utworzymy widok do przedstawiania hierarchicznych danych u yjemy zasoboacutew obrazu czcionki lub koloru wygenerujemy stylizowany tekst posortujemy i przefiltrujemy wpisy w widokach dodamy akcje dla podwoacutejnych klikni zaznaczymy i obs u ymy w a ciwo ci utworzymy widok dla danych tabelarycznych
Dlaczego JFaceCho SWT zapewnia podstawow implementacj prostych widgetoacutew (na przyk ad drzewprzyciskoacutew i etykiet) wszystko dzia a na bardzo podstawowym poziomie bo wykorzystywanes teksty i indeksy zaznacze Aby atwiej wy wietla strukturyzowane dane JFace udost p-nia kilka zaawansowanych widokoacutew ktoacutere stanowi po czenie widgetoacutew SWT i mened eroacutewzdarze co zapewnia wygodn obs ug interfejsu u ytkownika dla strukturyzowanych tre ci
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
84
Istnieje wiele rodzajoacutew zaawansowanych widokoacutew nazywanych viewer (wszystkie dziedziczpo klasie Viewer) ale najcz ciej stosowanymi s te ktoacutere nale do ContentViewer na przyk adTreeViewer i TableViewer Istniej roacutewnie wersje bazuj ce na tek cie (TextViewer ma podklasydla SourceViewer) a tak e widoki operacyjne (ConsoleViewer dla widoku Console lub Detailed-ProgressViewer dla widoku Progress) W tym rozdziale wykonamy widoki bazuj ce na klasachTreeViewer i TableViewer Poniewa JFace bazuje na SWT wiedza na temat szczegoacute oacutewdzia ania SWT jest niezb dna do prawid owego u ytkowania JFace
Tworzenie widokoacutew TreeViewerWiele widgetoacutew w Eclipse bazuje na widoku przypominaj cym drzewo mdash jest to zaroacutewnonawigator plikoacutew jak i okno wy wietlania zawarto ci klas Framework JFace udost pnia klasTreeViewer realizuj c wszystkie niezb dne funkcjonalno ci U yjemy jej do wykonania widokuTimeZoneTreeView
Kroki do wykonania mdash tworzenie obiektu TreeViewerPodobnie jak mia o to miejsce w poprzednim rozdziale nowy widok TimeZoneTreeView utwo-rzymy przy u yciu edytora pluginxml Widok wy wietli strefy czasowe u o one hierarchiczniewzgl dem regionoacutew
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest by otworzy plik pluginxml je li jeszczenie jest otwarty
2 Otwoacuterz zak adk Extensions i znajd element orgeclipseuiviews Kliknij go prawymprzyciskiem myszy i z menu wybierz polecenie NewView Wype nij pola w sposoacutebopisany poni ej
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Name wpisz Widok drzewa stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
3 Zapisz plik Konfigurator umie ci w pliku pluginxml nast puj cy wpis
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTreeView icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTreeView name=Widok drzewa stref czasowych restorable=truegtltviewgt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
85
4 Podobnie jak wcze niej utwoacuterz klas TimeZoneTreeView ktoacutera rozszerza klasViewPart
5 W metodzie createPartControl() utwoacuterz instancj TreeViewer z opcjami V_SCROLLH_SCROLL i MULTI Zapami taj obiekt w polu klasy Zaimplementuj metod setFocus()by ustawia a widok drzewa jako aktywny element
public class TimeZoneTreeView extends ViewPart private TreeViewer treeViewer public void createPartControl(Composite parent) treeViewer = new TreeViewer(parent SWTMULTI | SWTH_SCROLL | SWTV_SCROLL ) public void setFocus() treeViewergetControl()setFocus()
E4 Cho Eclipse 4 zostanie szczegoacute owo omoacutewione w rozdziale 7 warto wspomnie e w Eclipse4 nad metod createPartControl() niezb dna jest adnotacja Inject (by zapewni przekazanieobiektu Composite) a nad metod setFocus() mdash adnotacja Focus
6 Uruchom testow wersj Eclipse i przejd do widoku wybieraj c polecenieWindowShowViewOther ledzenie czasuWidok drzewa stref czasowych
7 W odroacute nieniu od Swing gdzie oczekuje si otrzymywania danych w klasiebazuj cej na konkretnym interfejsie JFace nie wymaga adnej konkretnej klasyW zamian oczekuje obiektu warto ci do wy wietlenia (wej cie) interfejsu ktoacuteryczyta dane (dostawca tre ci) i interfejsu do wy wietlania danych (dostawca etykiet)
8 Utwoacuterz now klas o nazwie TimeZoneLabelProvider dziedzicz ca po LabelProvider(z pakietu orgeclipsejfaceviewers) B dzie zawiera a metod o nazwie getText()ktoacutera otrzymuje obiekt i zamienia go na reprezentacj tekstow Zamiast wywo ywatoString() zwroacute odpowiedni warto zwi zan z MapEntry lub TimeZone
public class TimeZoneLabelProvider extends LabelProvider public String getText(Object element) if (element instanceof Map) return Strefy czasowe
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
86
else if (element instanceof MapEntry) return ((MapEntry) element)getKey()toString() else if (element instanceof TimeZone) return ((TimeZone) element)getID()split()[1] else return Nieznany typ + elementgetClass()
Poniewa obiekt TreeViewer mo e mie wiele korzeni test instanceof Map s u ydo sprawdzenia czy to wierzcho ek drzewa ktoacutery powinien mie nazw Strefyczasowe
9 Warto zapewni warto domy ln mdash nawet je li jest to pusty tekstmdash bo otrzymanie nieznanego typu mo na atwo wy ledzi i naprawi
10 Utwoacuterz now klas TimeZoneContentProvider implementuj c interfejsITreeContentProvider Interfejs wymaga implementacji trzech metod z sze ciu(pozosta e mog pozosta puste) Oto one
hasChildren() mdash zwraca true je li w ze ma potomkoacutew getChildren() mdash zwraca potomkoacutew konkretnego w z a getElements() mdash zapewnia g oacutewne korzenie
11 Metoda hasChildren() zwroacuteci warto true je li zostanie do niej przekazany obiekttypu Map lub Collection ktoacutery nie b dzie pusty Przekazanie MapEntry spowodujewywo anie rekurencyjne Dla drzew bazuj cych na zagnie d onych Map lubCollection metoda hasChildren() b dzie wygl da a identycznie
public boolean hasChildren(Object element) if (element instanceof Map) return ((Map) element)isEmpty() else if (element instanceof MapEntry) return hasChildren(((MapEntry)element)getValue()) else if (element instanceof Collection) return ((Collection) element)isEmpty() else return false
12 Implementacja getChildren() rekurencyjnie wchodzi do obiektoacutew typu MapCollection lub MapEntry stosuj c przy tym opisany wcze niej wzorzec Poniewametoda wymaga zwroacutecenia typu Object[] kod u ywa funkcjonalno ci wbudowanejw klas Map by zamieni zawarto entrySet() na tablic
public Object[] getChildren(Object parentElement) if (parentElement instanceof Map) return ((Map) parentElement)entrySet()toArray()
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
87
else if (parentElement instanceof MapEntry) return getChildren(((MapEntry)parentElement)getValue()) else if (parentElement instanceof Collection) return ((Collection) parentElement)toArray() else return new Object[0]
13 Kluczem przy implementacji ITreeContentProvider jest zapewnienie sta ejsynchronizacji kodu metod getChildren() i hasChildren() Jednym ze sposoboacutewzapewnienia takiej sytuacji jest u ycie w metodzie hasChildren() metodygetChildren() i sprawdzanie czy tablica jest pusta ale wydajno takiej operacjinie b dzie najlepsza je li getChildren() to operacja bardzo z o ona obliczeniowo
14 Poniewa TreeViewer mo e mie wiele korzeni istnieje metoda pobieraj ca tablickorzeni z elementu wej ciowego B d we frameworku JFace uniemo liwiaargumentowi getElements() posiadanie w asnej warto ci Z tego powodu przyj osi e najlepiej przekaza tablic (zawieraj c tylko jeden element) i nast pnie jzwroacuteci Metoda przedstawiona poni ej b dzie najprawdopodobniej wygl da atak samo dla ka dej klasy TreeContentProvider ktoacuter kiedykolwiek napiszesz
public Object[] getElements(Object inputElement) if (inputElement instanceof Object[]) return (Object[]) inputElement else return new Object[0]
15 Po zako czeniu tworzenia odpowiednich klas dostawcoacutew danych przejd dometody createPartControl() klasy TimeZoneTreeView by po czy dostawcoacutewz obiektem widoku i ustali obiekt b d cy roacuted em danych
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetContentProvider(new TimeZoneContentProvider())treeViewersetInput(new Object[]TimeZoneComparatorgetTimeZones())
16 Uruchom testow wersj Eclipse i otwoacuterz widok poleceniem WindowShowViewOther ledzenie czasuWidok drzewa stref czasowych by zobaczy efekt ko cowy
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
88
Co si sta oDane do TreeViewer przekazali my przy u yciu metody setInput() Metoda prawie zawszeotrzymuje tablic obiektoacutew nawet je li jest to tylko jeden element
Aby zapewni rozpakowanie struktury danych interfejs ITreeContentProvider udost pniadwie kluczowe metody mdash hasChildren() i getChildren() Umo liwiaj one przechodzenieprzez struktur danych na danie gdy u ytkownik zwija lub rozwija ga zie drzewa Powodemistnienia dwoacutech metod jest fakt i obliczenia w metodzie getChildren() mog by bardzokosztowne Metoda hasChildren() s u y do sprawdzenia czy nale y wy wietli ikon rozwi-ni cia w z a Wywo anie metody getChildren() jest opoacute nione a do momentu faktycznegootwarcia w z a
W strukturach danych ktoacutere to zapewniaj warto roacutewnie zaimplementowa metod getParent()umo liwia ona dost p do obiektu Je li jest zaimplementowana wywo anie viewerreveal(Object)powoduje rozwini cie w z oacutew w hierarchii by ods oni wskazany obiekt
Do wy wietlenia etykiet na drzewie s u y klasa LabelProvider Dostarcza ona etykiet(i opcjonalny obrazek) dla ka dego elementu Dla ka dego typu obiektu mo na u y innejikony Z rozwi zania tego skorzystano w widoku Package z perspektywy Java ktoacutery wy wietlaikon klasy dla klas ikon pakietu dla pakietoacutew i tak dalej
Klasa LabelProvider mo e wy wietla komunikaty na roacute ne sposoby Nic nie stoi na prze-szkodzie by doda do etykiety informacj o przesuni ciu czasowym (roacute nic mi dzy konkretnstref czasow i czasem GMT)
Kroki do wykonania mdash JFace i obrazyKlasa TimeZoneLabelProvider mo e zwroacuteci obiekt Image b d cy standardowym widgetem SWTCho obraz (obiekt Image) mo na wczyta w sposoacuteb podobny jak w poprzednim rozdziale JFaceoferuje rejestry zasoboacutew s u ce do zarz dzania zestawami zasoboacutew aplikacji Rejestry obs u-guj klasy ImageRegistry FontRegistry i ColorRegistry Rejestr zasoboacutew ma za zadanie prze-chowywa list obiektoacutew Resource i zwalnia je we w a ciwy sposoacuteb ale tylko wtedy gdy nies ju potrzebne
JFace posiada rejestry globalne ale istniej roacutewnie rejestry bardziej szczegoacute owe u ywaneprzez IDE na przyk ad do przechowywania list ikon folderoacutew i plikoacutew W rejestrze tego typukorzysta si z deskryptoroacutew do okre lania konkretnych zasoboacutew wi c po przekazaniu de-skryptora otrzymuje si odpowiadaj c mu instancj zasobu Zwroacuteconym zasobem zarz dzarejestr wi c kod ktoacutery go otrzyma nie powinien go zwalnia
1 W TimeZoneLabelProvider dodaj metod getImage() w ktoacuterej u ywa si rejestruobrazoacutew ImageRegistry by pobra ikon folderu Oto kod metody
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
89
public Image getImage(Object element) if(element instanceof MapEntry) returnPlatformUIgetWorkbench()getSharedImages()getImage(ISharedImagesIMG_OBJ_FOLDER) else return supergetImage(element)
2 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowych Oboktekstu z nazw regionu pojawi si ikona folderu Instancji Image nie trzeba niszczysamodzielnie poniewa nale y do wtyczki PlatformUI (zasoacuteb obrazu zostaniezwolniony w momencie wy czania PlatformUI)
E4 W Eclipse 4 instancj ISharedImages mo na otrzyma poprzez wstrzykni cie
Injectprivate ISharedImages imagesimagesgetImage(ISharedImagesIMG_OBJ_FOLDER)
3 By otrzyma inny obraz u yj globalnych instancji ImageRegistry lub JFaceRegistrylub utwoacuterz w asn kopi Zastosowanie globalnej wersji oznacza e obraz Imagenigdy nie zostanie zniszczony poniewa JFaceRegistry istnieje przez ca y czasycia instancji Eclipse
Zamiast tego utwoacuterz obiekty LocalResourceManager i ImageRegistry powi zanez cyklem ycia kontrolki Gdy kontrolka nadrz dna b dzie usuwana automatycznieusuni te zostan roacutewnie obrazy Umie w metodzie CreatePartControl klasyTimeZoneTreeView poni szy kod
public void createPartControl(Composite parent) ResourceManager rm = JFaceResourcesgetResources() LocalResourceManager lrm = new LocalResourceManager(rmparent)
4 U ywaj c obiektu LocalResourceManger utwoacuterz instancj ImageRegistry i za pomocmetody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL
ImageRegistry ir = new ImageRegistry(lrm)URL sample = getClass()getResource(iconssamplegif)irput(sample ImageDescriptorcreateFromURL(sample))
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
84
Istnieje wiele rodzajoacutew zaawansowanych widokoacutew nazywanych viewer (wszystkie dziedziczpo klasie Viewer) ale najcz ciej stosowanymi s te ktoacutere nale do ContentViewer na przyk adTreeViewer i TableViewer Istniej roacutewnie wersje bazuj ce na tek cie (TextViewer ma podklasydla SourceViewer) a tak e widoki operacyjne (ConsoleViewer dla widoku Console lub Detailed-ProgressViewer dla widoku Progress) W tym rozdziale wykonamy widoki bazuj ce na klasachTreeViewer i TableViewer Poniewa JFace bazuje na SWT wiedza na temat szczegoacute oacutewdzia ania SWT jest niezb dna do prawid owego u ytkowania JFace
Tworzenie widokoacutew TreeViewerWiele widgetoacutew w Eclipse bazuje na widoku przypominaj cym drzewo mdash jest to zaroacutewnonawigator plikoacutew jak i okno wy wietlania zawarto ci klas Framework JFace udost pnia klasTreeViewer realizuj c wszystkie niezb dne funkcjonalno ci U yjemy jej do wykonania widokuTimeZoneTreeView
Kroki do wykonania mdash tworzenie obiektu TreeViewerPodobnie jak mia o to miejsce w poprzednim rozdziale nowy widok TimeZoneTreeView utwo-rzymy przy u yciu edytora pluginxml Widok wy wietli strefy czasowe u o one hierarchiczniewzgl dem regionoacutew
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest by otworzy plik pluginxml je li jeszczenie jest otwarty
2 Otwoacuterz zak adk Extensions i znajd element orgeclipseuiviews Kliknij go prawymprzyciskiem myszy i z menu wybierz polecenie NewView Wype nij pola w sposoacutebopisany poni ej
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Name wpisz Widok drzewa stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTreeView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
3 Zapisz plik Konfigurator umie ci w pliku pluginxml nast puj cy wpis
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTreeView icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTreeView name=Widok drzewa stref czasowych restorable=truegtltviewgt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
85
4 Podobnie jak wcze niej utwoacuterz klas TimeZoneTreeView ktoacutera rozszerza klasViewPart
5 W metodzie createPartControl() utwoacuterz instancj TreeViewer z opcjami V_SCROLLH_SCROLL i MULTI Zapami taj obiekt w polu klasy Zaimplementuj metod setFocus()by ustawia a widok drzewa jako aktywny element
public class TimeZoneTreeView extends ViewPart private TreeViewer treeViewer public void createPartControl(Composite parent) treeViewer = new TreeViewer(parent SWTMULTI | SWTH_SCROLL | SWTV_SCROLL ) public void setFocus() treeViewergetControl()setFocus()
E4 Cho Eclipse 4 zostanie szczegoacute owo omoacutewione w rozdziale 7 warto wspomnie e w Eclipse4 nad metod createPartControl() niezb dna jest adnotacja Inject (by zapewni przekazanieobiektu Composite) a nad metod setFocus() mdash adnotacja Focus
6 Uruchom testow wersj Eclipse i przejd do widoku wybieraj c polecenieWindowShowViewOther ledzenie czasuWidok drzewa stref czasowych
7 W odroacute nieniu od Swing gdzie oczekuje si otrzymywania danych w klasiebazuj cej na konkretnym interfejsie JFace nie wymaga adnej konkretnej klasyW zamian oczekuje obiektu warto ci do wy wietlenia (wej cie) interfejsu ktoacuteryczyta dane (dostawca tre ci) i interfejsu do wy wietlania danych (dostawca etykiet)
8 Utwoacuterz now klas o nazwie TimeZoneLabelProvider dziedzicz ca po LabelProvider(z pakietu orgeclipsejfaceviewers) B dzie zawiera a metod o nazwie getText()ktoacutera otrzymuje obiekt i zamienia go na reprezentacj tekstow Zamiast wywo ywatoString() zwroacute odpowiedni warto zwi zan z MapEntry lub TimeZone
public class TimeZoneLabelProvider extends LabelProvider public String getText(Object element) if (element instanceof Map) return Strefy czasowe
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
86
else if (element instanceof MapEntry) return ((MapEntry) element)getKey()toString() else if (element instanceof TimeZone) return ((TimeZone) element)getID()split()[1] else return Nieznany typ + elementgetClass()
Poniewa obiekt TreeViewer mo e mie wiele korzeni test instanceof Map s u ydo sprawdzenia czy to wierzcho ek drzewa ktoacutery powinien mie nazw Strefyczasowe
9 Warto zapewni warto domy ln mdash nawet je li jest to pusty tekstmdash bo otrzymanie nieznanego typu mo na atwo wy ledzi i naprawi
10 Utwoacuterz now klas TimeZoneContentProvider implementuj c interfejsITreeContentProvider Interfejs wymaga implementacji trzech metod z sze ciu(pozosta e mog pozosta puste) Oto one
hasChildren() mdash zwraca true je li w ze ma potomkoacutew getChildren() mdash zwraca potomkoacutew konkretnego w z a getElements() mdash zapewnia g oacutewne korzenie
11 Metoda hasChildren() zwroacuteci warto true je li zostanie do niej przekazany obiekttypu Map lub Collection ktoacutery nie b dzie pusty Przekazanie MapEntry spowodujewywo anie rekurencyjne Dla drzew bazuj cych na zagnie d onych Map lubCollection metoda hasChildren() b dzie wygl da a identycznie
public boolean hasChildren(Object element) if (element instanceof Map) return ((Map) element)isEmpty() else if (element instanceof MapEntry) return hasChildren(((MapEntry)element)getValue()) else if (element instanceof Collection) return ((Collection) element)isEmpty() else return false
12 Implementacja getChildren() rekurencyjnie wchodzi do obiektoacutew typu MapCollection lub MapEntry stosuj c przy tym opisany wcze niej wzorzec Poniewametoda wymaga zwroacutecenia typu Object[] kod u ywa funkcjonalno ci wbudowanejw klas Map by zamieni zawarto entrySet() na tablic
public Object[] getChildren(Object parentElement) if (parentElement instanceof Map) return ((Map) parentElement)entrySet()toArray()
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
87
else if (parentElement instanceof MapEntry) return getChildren(((MapEntry)parentElement)getValue()) else if (parentElement instanceof Collection) return ((Collection) parentElement)toArray() else return new Object[0]
13 Kluczem przy implementacji ITreeContentProvider jest zapewnienie sta ejsynchronizacji kodu metod getChildren() i hasChildren() Jednym ze sposoboacutewzapewnienia takiej sytuacji jest u ycie w metodzie hasChildren() metodygetChildren() i sprawdzanie czy tablica jest pusta ale wydajno takiej operacjinie b dzie najlepsza je li getChildren() to operacja bardzo z o ona obliczeniowo
14 Poniewa TreeViewer mo e mie wiele korzeni istnieje metoda pobieraj ca tablickorzeni z elementu wej ciowego B d we frameworku JFace uniemo liwiaargumentowi getElements() posiadanie w asnej warto ci Z tego powodu przyj osi e najlepiej przekaza tablic (zawieraj c tylko jeden element) i nast pnie jzwroacuteci Metoda przedstawiona poni ej b dzie najprawdopodobniej wygl da atak samo dla ka dej klasy TreeContentProvider ktoacuter kiedykolwiek napiszesz
public Object[] getElements(Object inputElement) if (inputElement instanceof Object[]) return (Object[]) inputElement else return new Object[0]
15 Po zako czeniu tworzenia odpowiednich klas dostawcoacutew danych przejd dometody createPartControl() klasy TimeZoneTreeView by po czy dostawcoacutewz obiektem widoku i ustali obiekt b d cy roacuted em danych
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetContentProvider(new TimeZoneContentProvider())treeViewersetInput(new Object[]TimeZoneComparatorgetTimeZones())
16 Uruchom testow wersj Eclipse i otwoacuterz widok poleceniem WindowShowViewOther ledzenie czasuWidok drzewa stref czasowych by zobaczy efekt ko cowy
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
88
Co si sta oDane do TreeViewer przekazali my przy u yciu metody setInput() Metoda prawie zawszeotrzymuje tablic obiektoacutew nawet je li jest to tylko jeden element
Aby zapewni rozpakowanie struktury danych interfejs ITreeContentProvider udost pniadwie kluczowe metody mdash hasChildren() i getChildren() Umo liwiaj one przechodzenieprzez struktur danych na danie gdy u ytkownik zwija lub rozwija ga zie drzewa Powodemistnienia dwoacutech metod jest fakt i obliczenia w metodzie getChildren() mog by bardzokosztowne Metoda hasChildren() s u y do sprawdzenia czy nale y wy wietli ikon rozwi-ni cia w z a Wywo anie metody getChildren() jest opoacute nione a do momentu faktycznegootwarcia w z a
W strukturach danych ktoacutere to zapewniaj warto roacutewnie zaimplementowa metod getParent()umo liwia ona dost p do obiektu Je li jest zaimplementowana wywo anie viewerreveal(Object)powoduje rozwini cie w z oacutew w hierarchii by ods oni wskazany obiekt
Do wy wietlenia etykiet na drzewie s u y klasa LabelProvider Dostarcza ona etykiet(i opcjonalny obrazek) dla ka dego elementu Dla ka dego typu obiektu mo na u y innejikony Z rozwi zania tego skorzystano w widoku Package z perspektywy Java ktoacutery wy wietlaikon klasy dla klas ikon pakietu dla pakietoacutew i tak dalej
Klasa LabelProvider mo e wy wietla komunikaty na roacute ne sposoby Nic nie stoi na prze-szkodzie by doda do etykiety informacj o przesuni ciu czasowym (roacute nic mi dzy konkretnstref czasow i czasem GMT)
Kroki do wykonania mdash JFace i obrazyKlasa TimeZoneLabelProvider mo e zwroacuteci obiekt Image b d cy standardowym widgetem SWTCho obraz (obiekt Image) mo na wczyta w sposoacuteb podobny jak w poprzednim rozdziale JFaceoferuje rejestry zasoboacutew s u ce do zarz dzania zestawami zasoboacutew aplikacji Rejestry obs u-guj klasy ImageRegistry FontRegistry i ColorRegistry Rejestr zasoboacutew ma za zadanie prze-chowywa list obiektoacutew Resource i zwalnia je we w a ciwy sposoacuteb ale tylko wtedy gdy nies ju potrzebne
JFace posiada rejestry globalne ale istniej roacutewnie rejestry bardziej szczegoacute owe u ywaneprzez IDE na przyk ad do przechowywania list ikon folderoacutew i plikoacutew W rejestrze tego typukorzysta si z deskryptoroacutew do okre lania konkretnych zasoboacutew wi c po przekazaniu de-skryptora otrzymuje si odpowiadaj c mu instancj zasobu Zwroacuteconym zasobem zarz dzarejestr wi c kod ktoacutery go otrzyma nie powinien go zwalnia
1 W TimeZoneLabelProvider dodaj metod getImage() w ktoacuterej u ywa si rejestruobrazoacutew ImageRegistry by pobra ikon folderu Oto kod metody
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
89
public Image getImage(Object element) if(element instanceof MapEntry) returnPlatformUIgetWorkbench()getSharedImages()getImage(ISharedImagesIMG_OBJ_FOLDER) else return supergetImage(element)
2 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowych Oboktekstu z nazw regionu pojawi si ikona folderu Instancji Image nie trzeba niszczysamodzielnie poniewa nale y do wtyczki PlatformUI (zasoacuteb obrazu zostaniezwolniony w momencie wy czania PlatformUI)
E4 W Eclipse 4 instancj ISharedImages mo na otrzyma poprzez wstrzykni cie
Injectprivate ISharedImages imagesimagesgetImage(ISharedImagesIMG_OBJ_FOLDER)
3 By otrzyma inny obraz u yj globalnych instancji ImageRegistry lub JFaceRegistrylub utwoacuterz w asn kopi Zastosowanie globalnej wersji oznacza e obraz Imagenigdy nie zostanie zniszczony poniewa JFaceRegistry istnieje przez ca y czasycia instancji Eclipse
Zamiast tego utwoacuterz obiekty LocalResourceManager i ImageRegistry powi zanez cyklem ycia kontrolki Gdy kontrolka nadrz dna b dzie usuwana automatycznieusuni te zostan roacutewnie obrazy Umie w metodzie CreatePartControl klasyTimeZoneTreeView poni szy kod
public void createPartControl(Composite parent) ResourceManager rm = JFaceResourcesgetResources() LocalResourceManager lrm = new LocalResourceManager(rmparent)
4 U ywaj c obiektu LocalResourceManger utwoacuterz instancj ImageRegistry i za pomocmetody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL
ImageRegistry ir = new ImageRegistry(lrm)URL sample = getClass()getResource(iconssamplegif)irput(sample ImageDescriptorcreateFromURL(sample))
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
85
4 Podobnie jak wcze niej utwoacuterz klas TimeZoneTreeView ktoacutera rozszerza klasViewPart
5 W metodzie createPartControl() utwoacuterz instancj TreeViewer z opcjami V_SCROLLH_SCROLL i MULTI Zapami taj obiekt w polu klasy Zaimplementuj metod setFocus()by ustawia a widok drzewa jako aktywny element
public class TimeZoneTreeView extends ViewPart private TreeViewer treeViewer public void createPartControl(Composite parent) treeViewer = new TreeViewer(parent SWTMULTI | SWTH_SCROLL | SWTV_SCROLL ) public void setFocus() treeViewergetControl()setFocus()
E4 Cho Eclipse 4 zostanie szczegoacute owo omoacutewione w rozdziale 7 warto wspomnie e w Eclipse4 nad metod createPartControl() niezb dna jest adnotacja Inject (by zapewni przekazanieobiektu Composite) a nad metod setFocus() mdash adnotacja Focus
6 Uruchom testow wersj Eclipse i przejd do widoku wybieraj c polecenieWindowShowViewOther ledzenie czasuWidok drzewa stref czasowych
7 W odroacute nieniu od Swing gdzie oczekuje si otrzymywania danych w klasiebazuj cej na konkretnym interfejsie JFace nie wymaga adnej konkretnej klasyW zamian oczekuje obiektu warto ci do wy wietlenia (wej cie) interfejsu ktoacuteryczyta dane (dostawca tre ci) i interfejsu do wy wietlania danych (dostawca etykiet)
8 Utwoacuterz now klas o nazwie TimeZoneLabelProvider dziedzicz ca po LabelProvider(z pakietu orgeclipsejfaceviewers) B dzie zawiera a metod o nazwie getText()ktoacutera otrzymuje obiekt i zamienia go na reprezentacj tekstow Zamiast wywo ywatoString() zwroacute odpowiedni warto zwi zan z MapEntry lub TimeZone
public class TimeZoneLabelProvider extends LabelProvider public String getText(Object element) if (element instanceof Map) return Strefy czasowe
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
86
else if (element instanceof MapEntry) return ((MapEntry) element)getKey()toString() else if (element instanceof TimeZone) return ((TimeZone) element)getID()split()[1] else return Nieznany typ + elementgetClass()
Poniewa obiekt TreeViewer mo e mie wiele korzeni test instanceof Map s u ydo sprawdzenia czy to wierzcho ek drzewa ktoacutery powinien mie nazw Strefyczasowe
9 Warto zapewni warto domy ln mdash nawet je li jest to pusty tekstmdash bo otrzymanie nieznanego typu mo na atwo wy ledzi i naprawi
10 Utwoacuterz now klas TimeZoneContentProvider implementuj c interfejsITreeContentProvider Interfejs wymaga implementacji trzech metod z sze ciu(pozosta e mog pozosta puste) Oto one
hasChildren() mdash zwraca true je li w ze ma potomkoacutew getChildren() mdash zwraca potomkoacutew konkretnego w z a getElements() mdash zapewnia g oacutewne korzenie
11 Metoda hasChildren() zwroacuteci warto true je li zostanie do niej przekazany obiekttypu Map lub Collection ktoacutery nie b dzie pusty Przekazanie MapEntry spowodujewywo anie rekurencyjne Dla drzew bazuj cych na zagnie d onych Map lubCollection metoda hasChildren() b dzie wygl da a identycznie
public boolean hasChildren(Object element) if (element instanceof Map) return ((Map) element)isEmpty() else if (element instanceof MapEntry) return hasChildren(((MapEntry)element)getValue()) else if (element instanceof Collection) return ((Collection) element)isEmpty() else return false
12 Implementacja getChildren() rekurencyjnie wchodzi do obiektoacutew typu MapCollection lub MapEntry stosuj c przy tym opisany wcze niej wzorzec Poniewametoda wymaga zwroacutecenia typu Object[] kod u ywa funkcjonalno ci wbudowanejw klas Map by zamieni zawarto entrySet() na tablic
public Object[] getChildren(Object parentElement) if (parentElement instanceof Map) return ((Map) parentElement)entrySet()toArray()
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
87
else if (parentElement instanceof MapEntry) return getChildren(((MapEntry)parentElement)getValue()) else if (parentElement instanceof Collection) return ((Collection) parentElement)toArray() else return new Object[0]
13 Kluczem przy implementacji ITreeContentProvider jest zapewnienie sta ejsynchronizacji kodu metod getChildren() i hasChildren() Jednym ze sposoboacutewzapewnienia takiej sytuacji jest u ycie w metodzie hasChildren() metodygetChildren() i sprawdzanie czy tablica jest pusta ale wydajno takiej operacjinie b dzie najlepsza je li getChildren() to operacja bardzo z o ona obliczeniowo
14 Poniewa TreeViewer mo e mie wiele korzeni istnieje metoda pobieraj ca tablickorzeni z elementu wej ciowego B d we frameworku JFace uniemo liwiaargumentowi getElements() posiadanie w asnej warto ci Z tego powodu przyj osi e najlepiej przekaza tablic (zawieraj c tylko jeden element) i nast pnie jzwroacuteci Metoda przedstawiona poni ej b dzie najprawdopodobniej wygl da atak samo dla ka dej klasy TreeContentProvider ktoacuter kiedykolwiek napiszesz
public Object[] getElements(Object inputElement) if (inputElement instanceof Object[]) return (Object[]) inputElement else return new Object[0]
15 Po zako czeniu tworzenia odpowiednich klas dostawcoacutew danych przejd dometody createPartControl() klasy TimeZoneTreeView by po czy dostawcoacutewz obiektem widoku i ustali obiekt b d cy roacuted em danych
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetContentProvider(new TimeZoneContentProvider())treeViewersetInput(new Object[]TimeZoneComparatorgetTimeZones())
16 Uruchom testow wersj Eclipse i otwoacuterz widok poleceniem WindowShowViewOther ledzenie czasuWidok drzewa stref czasowych by zobaczy efekt ko cowy
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
88
Co si sta oDane do TreeViewer przekazali my przy u yciu metody setInput() Metoda prawie zawszeotrzymuje tablic obiektoacutew nawet je li jest to tylko jeden element
Aby zapewni rozpakowanie struktury danych interfejs ITreeContentProvider udost pniadwie kluczowe metody mdash hasChildren() i getChildren() Umo liwiaj one przechodzenieprzez struktur danych na danie gdy u ytkownik zwija lub rozwija ga zie drzewa Powodemistnienia dwoacutech metod jest fakt i obliczenia w metodzie getChildren() mog by bardzokosztowne Metoda hasChildren() s u y do sprawdzenia czy nale y wy wietli ikon rozwi-ni cia w z a Wywo anie metody getChildren() jest opoacute nione a do momentu faktycznegootwarcia w z a
W strukturach danych ktoacutere to zapewniaj warto roacutewnie zaimplementowa metod getParent()umo liwia ona dost p do obiektu Je li jest zaimplementowana wywo anie viewerreveal(Object)powoduje rozwini cie w z oacutew w hierarchii by ods oni wskazany obiekt
Do wy wietlenia etykiet na drzewie s u y klasa LabelProvider Dostarcza ona etykiet(i opcjonalny obrazek) dla ka dego elementu Dla ka dego typu obiektu mo na u y innejikony Z rozwi zania tego skorzystano w widoku Package z perspektywy Java ktoacutery wy wietlaikon klasy dla klas ikon pakietu dla pakietoacutew i tak dalej
Klasa LabelProvider mo e wy wietla komunikaty na roacute ne sposoby Nic nie stoi na prze-szkodzie by doda do etykiety informacj o przesuni ciu czasowym (roacute nic mi dzy konkretnstref czasow i czasem GMT)
Kroki do wykonania mdash JFace i obrazyKlasa TimeZoneLabelProvider mo e zwroacuteci obiekt Image b d cy standardowym widgetem SWTCho obraz (obiekt Image) mo na wczyta w sposoacuteb podobny jak w poprzednim rozdziale JFaceoferuje rejestry zasoboacutew s u ce do zarz dzania zestawami zasoboacutew aplikacji Rejestry obs u-guj klasy ImageRegistry FontRegistry i ColorRegistry Rejestr zasoboacutew ma za zadanie prze-chowywa list obiektoacutew Resource i zwalnia je we w a ciwy sposoacuteb ale tylko wtedy gdy nies ju potrzebne
JFace posiada rejestry globalne ale istniej roacutewnie rejestry bardziej szczegoacute owe u ywaneprzez IDE na przyk ad do przechowywania list ikon folderoacutew i plikoacutew W rejestrze tego typukorzysta si z deskryptoroacutew do okre lania konkretnych zasoboacutew wi c po przekazaniu de-skryptora otrzymuje si odpowiadaj c mu instancj zasobu Zwroacuteconym zasobem zarz dzarejestr wi c kod ktoacutery go otrzyma nie powinien go zwalnia
1 W TimeZoneLabelProvider dodaj metod getImage() w ktoacuterej u ywa si rejestruobrazoacutew ImageRegistry by pobra ikon folderu Oto kod metody
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
89
public Image getImage(Object element) if(element instanceof MapEntry) returnPlatformUIgetWorkbench()getSharedImages()getImage(ISharedImagesIMG_OBJ_FOLDER) else return supergetImage(element)
2 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowych Oboktekstu z nazw regionu pojawi si ikona folderu Instancji Image nie trzeba niszczysamodzielnie poniewa nale y do wtyczki PlatformUI (zasoacuteb obrazu zostaniezwolniony w momencie wy czania PlatformUI)
E4 W Eclipse 4 instancj ISharedImages mo na otrzyma poprzez wstrzykni cie
Injectprivate ISharedImages imagesimagesgetImage(ISharedImagesIMG_OBJ_FOLDER)
3 By otrzyma inny obraz u yj globalnych instancji ImageRegistry lub JFaceRegistrylub utwoacuterz w asn kopi Zastosowanie globalnej wersji oznacza e obraz Imagenigdy nie zostanie zniszczony poniewa JFaceRegistry istnieje przez ca y czasycia instancji Eclipse
Zamiast tego utwoacuterz obiekty LocalResourceManager i ImageRegistry powi zanez cyklem ycia kontrolki Gdy kontrolka nadrz dna b dzie usuwana automatycznieusuni te zostan roacutewnie obrazy Umie w metodzie CreatePartControl klasyTimeZoneTreeView poni szy kod
public void createPartControl(Composite parent) ResourceManager rm = JFaceResourcesgetResources() LocalResourceManager lrm = new LocalResourceManager(rmparent)
4 U ywaj c obiektu LocalResourceManger utwoacuterz instancj ImageRegistry i za pomocmetody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL
ImageRegistry ir = new ImageRegistry(lrm)URL sample = getClass()getResource(iconssamplegif)irput(sample ImageDescriptorcreateFromURL(sample))
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
86
else if (element instanceof MapEntry) return ((MapEntry) element)getKey()toString() else if (element instanceof TimeZone) return ((TimeZone) element)getID()split()[1] else return Nieznany typ + elementgetClass()
Poniewa obiekt TreeViewer mo e mie wiele korzeni test instanceof Map s u ydo sprawdzenia czy to wierzcho ek drzewa ktoacutery powinien mie nazw Strefyczasowe
9 Warto zapewni warto domy ln mdash nawet je li jest to pusty tekstmdash bo otrzymanie nieznanego typu mo na atwo wy ledzi i naprawi
10 Utwoacuterz now klas TimeZoneContentProvider implementuj c interfejsITreeContentProvider Interfejs wymaga implementacji trzech metod z sze ciu(pozosta e mog pozosta puste) Oto one
hasChildren() mdash zwraca true je li w ze ma potomkoacutew getChildren() mdash zwraca potomkoacutew konkretnego w z a getElements() mdash zapewnia g oacutewne korzenie
11 Metoda hasChildren() zwroacuteci warto true je li zostanie do niej przekazany obiekttypu Map lub Collection ktoacutery nie b dzie pusty Przekazanie MapEntry spowodujewywo anie rekurencyjne Dla drzew bazuj cych na zagnie d onych Map lubCollection metoda hasChildren() b dzie wygl da a identycznie
public boolean hasChildren(Object element) if (element instanceof Map) return ((Map) element)isEmpty() else if (element instanceof MapEntry) return hasChildren(((MapEntry)element)getValue()) else if (element instanceof Collection) return ((Collection) element)isEmpty() else return false
12 Implementacja getChildren() rekurencyjnie wchodzi do obiektoacutew typu MapCollection lub MapEntry stosuj c przy tym opisany wcze niej wzorzec Poniewametoda wymaga zwroacutecenia typu Object[] kod u ywa funkcjonalno ci wbudowanejw klas Map by zamieni zawarto entrySet() na tablic
public Object[] getChildren(Object parentElement) if (parentElement instanceof Map) return ((Map) parentElement)entrySet()toArray()
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
87
else if (parentElement instanceof MapEntry) return getChildren(((MapEntry)parentElement)getValue()) else if (parentElement instanceof Collection) return ((Collection) parentElement)toArray() else return new Object[0]
13 Kluczem przy implementacji ITreeContentProvider jest zapewnienie sta ejsynchronizacji kodu metod getChildren() i hasChildren() Jednym ze sposoboacutewzapewnienia takiej sytuacji jest u ycie w metodzie hasChildren() metodygetChildren() i sprawdzanie czy tablica jest pusta ale wydajno takiej operacjinie b dzie najlepsza je li getChildren() to operacja bardzo z o ona obliczeniowo
14 Poniewa TreeViewer mo e mie wiele korzeni istnieje metoda pobieraj ca tablickorzeni z elementu wej ciowego B d we frameworku JFace uniemo liwiaargumentowi getElements() posiadanie w asnej warto ci Z tego powodu przyj osi e najlepiej przekaza tablic (zawieraj c tylko jeden element) i nast pnie jzwroacuteci Metoda przedstawiona poni ej b dzie najprawdopodobniej wygl da atak samo dla ka dej klasy TreeContentProvider ktoacuter kiedykolwiek napiszesz
public Object[] getElements(Object inputElement) if (inputElement instanceof Object[]) return (Object[]) inputElement else return new Object[0]
15 Po zako czeniu tworzenia odpowiednich klas dostawcoacutew danych przejd dometody createPartControl() klasy TimeZoneTreeView by po czy dostawcoacutewz obiektem widoku i ustali obiekt b d cy roacuted em danych
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetContentProvider(new TimeZoneContentProvider())treeViewersetInput(new Object[]TimeZoneComparatorgetTimeZones())
16 Uruchom testow wersj Eclipse i otwoacuterz widok poleceniem WindowShowViewOther ledzenie czasuWidok drzewa stref czasowych by zobaczy efekt ko cowy
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
88
Co si sta oDane do TreeViewer przekazali my przy u yciu metody setInput() Metoda prawie zawszeotrzymuje tablic obiektoacutew nawet je li jest to tylko jeden element
Aby zapewni rozpakowanie struktury danych interfejs ITreeContentProvider udost pniadwie kluczowe metody mdash hasChildren() i getChildren() Umo liwiaj one przechodzenieprzez struktur danych na danie gdy u ytkownik zwija lub rozwija ga zie drzewa Powodemistnienia dwoacutech metod jest fakt i obliczenia w metodzie getChildren() mog by bardzokosztowne Metoda hasChildren() s u y do sprawdzenia czy nale y wy wietli ikon rozwi-ni cia w z a Wywo anie metody getChildren() jest opoacute nione a do momentu faktycznegootwarcia w z a
W strukturach danych ktoacutere to zapewniaj warto roacutewnie zaimplementowa metod getParent()umo liwia ona dost p do obiektu Je li jest zaimplementowana wywo anie viewerreveal(Object)powoduje rozwini cie w z oacutew w hierarchii by ods oni wskazany obiekt
Do wy wietlenia etykiet na drzewie s u y klasa LabelProvider Dostarcza ona etykiet(i opcjonalny obrazek) dla ka dego elementu Dla ka dego typu obiektu mo na u y innejikony Z rozwi zania tego skorzystano w widoku Package z perspektywy Java ktoacutery wy wietlaikon klasy dla klas ikon pakietu dla pakietoacutew i tak dalej
Klasa LabelProvider mo e wy wietla komunikaty na roacute ne sposoby Nic nie stoi na prze-szkodzie by doda do etykiety informacj o przesuni ciu czasowym (roacute nic mi dzy konkretnstref czasow i czasem GMT)
Kroki do wykonania mdash JFace i obrazyKlasa TimeZoneLabelProvider mo e zwroacuteci obiekt Image b d cy standardowym widgetem SWTCho obraz (obiekt Image) mo na wczyta w sposoacuteb podobny jak w poprzednim rozdziale JFaceoferuje rejestry zasoboacutew s u ce do zarz dzania zestawami zasoboacutew aplikacji Rejestry obs u-guj klasy ImageRegistry FontRegistry i ColorRegistry Rejestr zasoboacutew ma za zadanie prze-chowywa list obiektoacutew Resource i zwalnia je we w a ciwy sposoacuteb ale tylko wtedy gdy nies ju potrzebne
JFace posiada rejestry globalne ale istniej roacutewnie rejestry bardziej szczegoacute owe u ywaneprzez IDE na przyk ad do przechowywania list ikon folderoacutew i plikoacutew W rejestrze tego typukorzysta si z deskryptoroacutew do okre lania konkretnych zasoboacutew wi c po przekazaniu de-skryptora otrzymuje si odpowiadaj c mu instancj zasobu Zwroacuteconym zasobem zarz dzarejestr wi c kod ktoacutery go otrzyma nie powinien go zwalnia
1 W TimeZoneLabelProvider dodaj metod getImage() w ktoacuterej u ywa si rejestruobrazoacutew ImageRegistry by pobra ikon folderu Oto kod metody
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
89
public Image getImage(Object element) if(element instanceof MapEntry) returnPlatformUIgetWorkbench()getSharedImages()getImage(ISharedImagesIMG_OBJ_FOLDER) else return supergetImage(element)
2 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowych Oboktekstu z nazw regionu pojawi si ikona folderu Instancji Image nie trzeba niszczysamodzielnie poniewa nale y do wtyczki PlatformUI (zasoacuteb obrazu zostaniezwolniony w momencie wy czania PlatformUI)
E4 W Eclipse 4 instancj ISharedImages mo na otrzyma poprzez wstrzykni cie
Injectprivate ISharedImages imagesimagesgetImage(ISharedImagesIMG_OBJ_FOLDER)
3 By otrzyma inny obraz u yj globalnych instancji ImageRegistry lub JFaceRegistrylub utwoacuterz w asn kopi Zastosowanie globalnej wersji oznacza e obraz Imagenigdy nie zostanie zniszczony poniewa JFaceRegistry istnieje przez ca y czasycia instancji Eclipse
Zamiast tego utwoacuterz obiekty LocalResourceManager i ImageRegistry powi zanez cyklem ycia kontrolki Gdy kontrolka nadrz dna b dzie usuwana automatycznieusuni te zostan roacutewnie obrazy Umie w metodzie CreatePartControl klasyTimeZoneTreeView poni szy kod
public void createPartControl(Composite parent) ResourceManager rm = JFaceResourcesgetResources() LocalResourceManager lrm = new LocalResourceManager(rmparent)
4 U ywaj c obiektu LocalResourceManger utwoacuterz instancj ImageRegistry i za pomocmetody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL
ImageRegistry ir = new ImageRegistry(lrm)URL sample = getClass()getResource(iconssamplegif)irput(sample ImageDescriptorcreateFromURL(sample))
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
87
else if (parentElement instanceof MapEntry) return getChildren(((MapEntry)parentElement)getValue()) else if (parentElement instanceof Collection) return ((Collection) parentElement)toArray() else return new Object[0]
13 Kluczem przy implementacji ITreeContentProvider jest zapewnienie sta ejsynchronizacji kodu metod getChildren() i hasChildren() Jednym ze sposoboacutewzapewnienia takiej sytuacji jest u ycie w metodzie hasChildren() metodygetChildren() i sprawdzanie czy tablica jest pusta ale wydajno takiej operacjinie b dzie najlepsza je li getChildren() to operacja bardzo z o ona obliczeniowo
14 Poniewa TreeViewer mo e mie wiele korzeni istnieje metoda pobieraj ca tablickorzeni z elementu wej ciowego B d we frameworku JFace uniemo liwiaargumentowi getElements() posiadanie w asnej warto ci Z tego powodu przyj osi e najlepiej przekaza tablic (zawieraj c tylko jeden element) i nast pnie jzwroacuteci Metoda przedstawiona poni ej b dzie najprawdopodobniej wygl da atak samo dla ka dej klasy TreeContentProvider ktoacuter kiedykolwiek napiszesz
public Object[] getElements(Object inputElement) if (inputElement instanceof Object[]) return (Object[]) inputElement else return new Object[0]
15 Po zako czeniu tworzenia odpowiednich klas dostawcoacutew danych przejd dometody createPartControl() klasy TimeZoneTreeView by po czy dostawcoacutewz obiektem widoku i ustali obiekt b d cy roacuted em danych
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetContentProvider(new TimeZoneContentProvider())treeViewersetInput(new Object[]TimeZoneComparatorgetTimeZones())
16 Uruchom testow wersj Eclipse i otwoacuterz widok poleceniem WindowShowViewOther ledzenie czasuWidok drzewa stref czasowych by zobaczy efekt ko cowy
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
88
Co si sta oDane do TreeViewer przekazali my przy u yciu metody setInput() Metoda prawie zawszeotrzymuje tablic obiektoacutew nawet je li jest to tylko jeden element
Aby zapewni rozpakowanie struktury danych interfejs ITreeContentProvider udost pniadwie kluczowe metody mdash hasChildren() i getChildren() Umo liwiaj one przechodzenieprzez struktur danych na danie gdy u ytkownik zwija lub rozwija ga zie drzewa Powodemistnienia dwoacutech metod jest fakt i obliczenia w metodzie getChildren() mog by bardzokosztowne Metoda hasChildren() s u y do sprawdzenia czy nale y wy wietli ikon rozwi-ni cia w z a Wywo anie metody getChildren() jest opoacute nione a do momentu faktycznegootwarcia w z a
W strukturach danych ktoacutere to zapewniaj warto roacutewnie zaimplementowa metod getParent()umo liwia ona dost p do obiektu Je li jest zaimplementowana wywo anie viewerreveal(Object)powoduje rozwini cie w z oacutew w hierarchii by ods oni wskazany obiekt
Do wy wietlenia etykiet na drzewie s u y klasa LabelProvider Dostarcza ona etykiet(i opcjonalny obrazek) dla ka dego elementu Dla ka dego typu obiektu mo na u y innejikony Z rozwi zania tego skorzystano w widoku Package z perspektywy Java ktoacutery wy wietlaikon klasy dla klas ikon pakietu dla pakietoacutew i tak dalej
Klasa LabelProvider mo e wy wietla komunikaty na roacute ne sposoby Nic nie stoi na prze-szkodzie by doda do etykiety informacj o przesuni ciu czasowym (roacute nic mi dzy konkretnstref czasow i czasem GMT)
Kroki do wykonania mdash JFace i obrazyKlasa TimeZoneLabelProvider mo e zwroacuteci obiekt Image b d cy standardowym widgetem SWTCho obraz (obiekt Image) mo na wczyta w sposoacuteb podobny jak w poprzednim rozdziale JFaceoferuje rejestry zasoboacutew s u ce do zarz dzania zestawami zasoboacutew aplikacji Rejestry obs u-guj klasy ImageRegistry FontRegistry i ColorRegistry Rejestr zasoboacutew ma za zadanie prze-chowywa list obiektoacutew Resource i zwalnia je we w a ciwy sposoacuteb ale tylko wtedy gdy nies ju potrzebne
JFace posiada rejestry globalne ale istniej roacutewnie rejestry bardziej szczegoacute owe u ywaneprzez IDE na przyk ad do przechowywania list ikon folderoacutew i plikoacutew W rejestrze tego typukorzysta si z deskryptoroacutew do okre lania konkretnych zasoboacutew wi c po przekazaniu de-skryptora otrzymuje si odpowiadaj c mu instancj zasobu Zwroacuteconym zasobem zarz dzarejestr wi c kod ktoacutery go otrzyma nie powinien go zwalnia
1 W TimeZoneLabelProvider dodaj metod getImage() w ktoacuterej u ywa si rejestruobrazoacutew ImageRegistry by pobra ikon folderu Oto kod metody
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
89
public Image getImage(Object element) if(element instanceof MapEntry) returnPlatformUIgetWorkbench()getSharedImages()getImage(ISharedImagesIMG_OBJ_FOLDER) else return supergetImage(element)
2 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowych Oboktekstu z nazw regionu pojawi si ikona folderu Instancji Image nie trzeba niszczysamodzielnie poniewa nale y do wtyczki PlatformUI (zasoacuteb obrazu zostaniezwolniony w momencie wy czania PlatformUI)
E4 W Eclipse 4 instancj ISharedImages mo na otrzyma poprzez wstrzykni cie
Injectprivate ISharedImages imagesimagesgetImage(ISharedImagesIMG_OBJ_FOLDER)
3 By otrzyma inny obraz u yj globalnych instancji ImageRegistry lub JFaceRegistrylub utwoacuterz w asn kopi Zastosowanie globalnej wersji oznacza e obraz Imagenigdy nie zostanie zniszczony poniewa JFaceRegistry istnieje przez ca y czasycia instancji Eclipse
Zamiast tego utwoacuterz obiekty LocalResourceManager i ImageRegistry powi zanez cyklem ycia kontrolki Gdy kontrolka nadrz dna b dzie usuwana automatycznieusuni te zostan roacutewnie obrazy Umie w metodzie CreatePartControl klasyTimeZoneTreeView poni szy kod
public void createPartControl(Composite parent) ResourceManager rm = JFaceResourcesgetResources() LocalResourceManager lrm = new LocalResourceManager(rmparent)
4 U ywaj c obiektu LocalResourceManger utwoacuterz instancj ImageRegistry i za pomocmetody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL
ImageRegistry ir = new ImageRegistry(lrm)URL sample = getClass()getResource(iconssamplegif)irput(sample ImageDescriptorcreateFromURL(sample))
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
88
Co si sta oDane do TreeViewer przekazali my przy u yciu metody setInput() Metoda prawie zawszeotrzymuje tablic obiektoacutew nawet je li jest to tylko jeden element
Aby zapewni rozpakowanie struktury danych interfejs ITreeContentProvider udost pniadwie kluczowe metody mdash hasChildren() i getChildren() Umo liwiaj one przechodzenieprzez struktur danych na danie gdy u ytkownik zwija lub rozwija ga zie drzewa Powodemistnienia dwoacutech metod jest fakt i obliczenia w metodzie getChildren() mog by bardzokosztowne Metoda hasChildren() s u y do sprawdzenia czy nale y wy wietli ikon rozwi-ni cia w z a Wywo anie metody getChildren() jest opoacute nione a do momentu faktycznegootwarcia w z a
W strukturach danych ktoacutere to zapewniaj warto roacutewnie zaimplementowa metod getParent()umo liwia ona dost p do obiektu Je li jest zaimplementowana wywo anie viewerreveal(Object)powoduje rozwini cie w z oacutew w hierarchii by ods oni wskazany obiekt
Do wy wietlenia etykiet na drzewie s u y klasa LabelProvider Dostarcza ona etykiet(i opcjonalny obrazek) dla ka dego elementu Dla ka dego typu obiektu mo na u y innejikony Z rozwi zania tego skorzystano w widoku Package z perspektywy Java ktoacutery wy wietlaikon klasy dla klas ikon pakietu dla pakietoacutew i tak dalej
Klasa LabelProvider mo e wy wietla komunikaty na roacute ne sposoby Nic nie stoi na prze-szkodzie by doda do etykiety informacj o przesuni ciu czasowym (roacute nic mi dzy konkretnstref czasow i czasem GMT)
Kroki do wykonania mdash JFace i obrazyKlasa TimeZoneLabelProvider mo e zwroacuteci obiekt Image b d cy standardowym widgetem SWTCho obraz (obiekt Image) mo na wczyta w sposoacuteb podobny jak w poprzednim rozdziale JFaceoferuje rejestry zasoboacutew s u ce do zarz dzania zestawami zasoboacutew aplikacji Rejestry obs u-guj klasy ImageRegistry FontRegistry i ColorRegistry Rejestr zasoboacutew ma za zadanie prze-chowywa list obiektoacutew Resource i zwalnia je we w a ciwy sposoacuteb ale tylko wtedy gdy nies ju potrzebne
JFace posiada rejestry globalne ale istniej roacutewnie rejestry bardziej szczegoacute owe u ywaneprzez IDE na przyk ad do przechowywania list ikon folderoacutew i plikoacutew W rejestrze tego typukorzysta si z deskryptoroacutew do okre lania konkretnych zasoboacutew wi c po przekazaniu de-skryptora otrzymuje si odpowiadaj c mu instancj zasobu Zwroacuteconym zasobem zarz dzarejestr wi c kod ktoacutery go otrzyma nie powinien go zwalnia
1 W TimeZoneLabelProvider dodaj metod getImage() w ktoacuterej u ywa si rejestruobrazoacutew ImageRegistry by pobra ikon folderu Oto kod metody
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
89
public Image getImage(Object element) if(element instanceof MapEntry) returnPlatformUIgetWorkbench()getSharedImages()getImage(ISharedImagesIMG_OBJ_FOLDER) else return supergetImage(element)
2 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowych Oboktekstu z nazw regionu pojawi si ikona folderu Instancji Image nie trzeba niszczysamodzielnie poniewa nale y do wtyczki PlatformUI (zasoacuteb obrazu zostaniezwolniony w momencie wy czania PlatformUI)
E4 W Eclipse 4 instancj ISharedImages mo na otrzyma poprzez wstrzykni cie
Injectprivate ISharedImages imagesimagesgetImage(ISharedImagesIMG_OBJ_FOLDER)
3 By otrzyma inny obraz u yj globalnych instancji ImageRegistry lub JFaceRegistrylub utwoacuterz w asn kopi Zastosowanie globalnej wersji oznacza e obraz Imagenigdy nie zostanie zniszczony poniewa JFaceRegistry istnieje przez ca y czasycia instancji Eclipse
Zamiast tego utwoacuterz obiekty LocalResourceManager i ImageRegistry powi zanez cyklem ycia kontrolki Gdy kontrolka nadrz dna b dzie usuwana automatycznieusuni te zostan roacutewnie obrazy Umie w metodzie CreatePartControl klasyTimeZoneTreeView poni szy kod
public void createPartControl(Composite parent) ResourceManager rm = JFaceResourcesgetResources() LocalResourceManager lrm = new LocalResourceManager(rmparent)
4 U ywaj c obiektu LocalResourceManger utwoacuterz instancj ImageRegistry i za pomocmetody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL
ImageRegistry ir = new ImageRegistry(lrm)URL sample = getClass()getResource(iconssamplegif)irput(sample ImageDescriptorcreateFromURL(sample))
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
89
public Image getImage(Object element) if(element instanceof MapEntry) returnPlatformUIgetWorkbench()getSharedImages()getImage(ISharedImagesIMG_OBJ_FOLDER) else return supergetImage(element)
2 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowych Oboktekstu z nazw regionu pojawi si ikona folderu Instancji Image nie trzeba niszczysamodzielnie poniewa nale y do wtyczki PlatformUI (zasoacuteb obrazu zostaniezwolniony w momencie wy czania PlatformUI)
E4 W Eclipse 4 instancj ISharedImages mo na otrzyma poprzez wstrzykni cie
Injectprivate ISharedImages imagesimagesgetImage(ISharedImagesIMG_OBJ_FOLDER)
3 By otrzyma inny obraz u yj globalnych instancji ImageRegistry lub JFaceRegistrylub utwoacuterz w asn kopi Zastosowanie globalnej wersji oznacza e obraz Imagenigdy nie zostanie zniszczony poniewa JFaceRegistry istnieje przez ca y czasycia instancji Eclipse
Zamiast tego utwoacuterz obiekty LocalResourceManager i ImageRegistry powi zanez cyklem ycia kontrolki Gdy kontrolka nadrz dna b dzie usuwana automatycznieusuni te zostan roacutewnie obrazy Umie w metodzie CreatePartControl klasyTimeZoneTreeView poni szy kod
public void createPartControl(Composite parent) ResourceManager rm = JFaceResourcesgetResources() LocalResourceManager lrm = new LocalResourceManager(rmparent)
4 U ywaj c obiektu LocalResourceManger utwoacuterz instancj ImageRegistry i za pomocmetody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL
ImageRegistry ir = new ImageRegistry(lrm)URL sample = getClass()getResource(iconssamplegif)irput(sample ImageDescriptorcreateFromURL(sample))
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
90
5 Po wype nieniu obiektu ImageRegistry trzeba go powi za z obiektem LabelProviderby ten moacuteg u y w a ciwego obrazu je li b dzie trzeba Przeka rejestr obrazoacutewdo konstruktora klasy TimeZoneLabelProvider
treeViewersetLabelProvider(new TimeZoneLabelProvider())treeViewersetLabelProvider(new TimeZoneLabelProvider(ir))
6 Zaimplementuj w TimeZoneLabelProvider konstruktor ktoacutery zapami ta obiektImageRegistry Nast pnie u yj go do pobrania obrazu w wywo aniu getImage()
private final ImageRegistry irpublic TimeZoneLabelProvider(ImageRegistry ir) thisir = irpublic Image getImage(Object element) if(element instanceof MapEntry) return irget(sample) else if(element instanceof TimeZone) return irget(sample) else return supergetImage(element)
7 Ponownie uruchom testow wersj Eclipse W drzewie pojawi si przyk adowaikona wtyczki
Co si sta oPocz tkowo u yli my standardowych obrazoacutew znajduj cych si w obiekcie PlatformUI Predefi-niowane deskryptory pochodzi y z interfejsu ISharedImages Nazwy deskryptoroacutew zaczynaj siod IMG zastosowano w nich nast puj cy wzorzec
etool lub dtool mdash w czone lub wy czone ikony paska narz dziowego elcl lub dlcl mdash w czone lub wy czone ikony lokalnego paska narz dziowego dec mdash dekorator obj i objs mdash obiekty (pliki foldery i tym podobne)
Inne wtyczki zawieraj w asne zestawy obrazoacutew na przyk ad interfejs JDT dodaje ikonyzwi zane z pakietami klasami metodami i polami
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
91
W celu u ycia w asnych obrazoacutew utworzyli my obiekt ImageRegistry obs ugiwany przezobiekt LocalResourceManager Je li do konstruktora trafi obiekt Control klasa rejestruje w nimobiekt DisposeListener W ten sposoacuteb gdy kontrola b dzie niszczona podobnie stanie si z po-wi zanymi z ni obrazami Dzi ki temu ca y kod jest bardziej przejrzysty gdy ImageRegistrymo na bez wi kszych problemoacutew przekaza do klasy TimeZoneContentProvider
Obiekt ImageRegistry inicjalizujemy zestawem obiektoacutew ImageDescriptor mdash w tym przypad-ku plikiem iconssamplegif pochodz cym z kreatora wtyczek Ten sam klucz s u y do inicja-lizacji i dost pu do obrazu Niektoacutere projekty Eclipse trzymaj si konwencji z interfejsemISharedImages z zestawem sta ych
Kroki do wykonania mdash style w dostawcy etykietInterfejs IStyledLabelProvider s u y do zmiany domy lnego stylu w widoku drzewa U yto gow widoku tre ci klas ktoacutery wy wietla typ zwracany przez metody lub te w dekoratorze ze-spo oacutew ktoacutery wy wietla informacj o zmianach
1 Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwoacuterz metodgetStyledText() Je li zaznaczonym elementem jest MapEntry zawieraj cyTimeZone w nawiasach wska przesuni cie czasowe
public class TimeZoneLabelProvider extends LabelProvider implementsIStyledLabelProvider public StyledString getStyledText(Object element) String text = getText(element) StyledString ss = new StyledString(text) if (element instanceof TimeZone) int offset = -((TimeZone) element)getOffset(0) ssappend( ( + offset 3600000 + h) StyledStringDECORATIONS_ STYLER) return ss
2 By u y dostawcy etykiet ze zmienionym stylem trzeba go otoczy klasDelegatingStyledCellLabelProvider Zmodyfikuj konstruktor wywo ywanyw metodzie createPartControl() metody TimeZoneTreeView
treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))
3 Uruchom testow wersj Eclipse i otwoacuterz widok by zobaczy przesuni ciaczasowe zapisane innym kolorem
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
92
4 By zmieni czcionk u ywan w widoku klasa TimeZoneLabelProvider musiimplementowa interfejs IFontProvider Klasa FontRegistry z JFace umo liwiapobranie domy lnej czcionki z w czon kursyw Dodaj parametr FontRegistrydo konstruktora TimeZoneLabelProvider i zaimplementuj metod getFont()
public class TimeZoneLabelProvider extends LabelProviderimplementsIStyledLabelProvider IFontProvider
private final FontRegistry fr public TimeZoneLabelProvider(ImageRegistry ir FontRegistry fr) thisir = ir thisfr = fr public Font getFont(Object element) Font italic = frgetItalic(JFaceResourcesDEFAULT_FONT) return italic
5 Zmodyfikuj klas TimeZoneTreeView by utworzy i przekaza globalny obiektFontRegistry pobrany z klasy JFaceResources
FontRegistry fr = JFaceResourcesgetFontRegistry()treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir)))treeViewersetLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir fr)))
6 Ponownie uruchom testow wersj Eclipse by przekona si e strefy czasowe steraz pisane kursyw
Co si sta oImplementuj c interfejs IStyledLabelProvider i otaczaj c go klas DelegatingStyledCellLabelProvidermo na zmienia styl poszczegoacutelnych elementoacutew drzewa w cznie ze zmianami czcionki i koloruKlasa StyledText umo liwia wy wietlanie tekstu roacute nymi stylami
Cho w przyk adzie pojawi a si klasa DecorationsStyler dodatkowe style mo na tak e zdefi-niowa przy u yciu wywo ania StyledStringcreateColorRegistryStyler(czcionka t o)gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
93
Cho kolory mo na zmienia dla poszczegoacutelnych znakoacutew czcionka (obiekt Font) jest jednadla ca ego tekstu Wynika to z faktu i wyliczenia rozmiaru etykiety zak adaj e ca y tekstjest pisany identyczn czcionk
Jako dobr praktyk uwa a si u ywanie przez dostawcoacutew tre ci i etykiet mened eroacutew zaso-boacutew przekazywanych do konstruktoroacutew Dzi ki temu kod atwo sprawdzi za pomoc testoacutewautomatycznych i pozorowanych zasoboacutew Niezale nie od tego czy stosuje si model pro-gramistyczny Eclipse 3x czy Eclipse 4x oddzielenie u ycia zasoboacutew od miejsca ich tworzeniato klucz do wygodnego testowania
Quiz mdash podstawy JFaceP1 Jakie metody zawiera LabelProvider
P2 Jaka jest roacute nica mi dzy metodami hasChildren() i getChildren() z ContentProvider
P3 Do czego s u y klasa ImageRegistry
P4 W jaki sposoacuteb zmieni styl elementoacutew widoku drzewa
Sprawd si mdash dodanie obrazoacutew dla regionoacutewPo poznaniu podstaw postaraj si rozszerzy przyk ad o kilka elementoacutew
Popraw klas TimeZoneLabelProvider by podawa a przesuni cie w godzinachi minutach wzgl dem GMT
Uaktualnij wtyczk dodaj c ikony flag i tworz c wpisy w rejestrze obrazoacutew(nazwa strefy czasowej mo e by kluczem co u atwi ca obs ug )
Wy wietl nazw regionu kursyw ale same nazwy stref czasowych pogrubionczcionk
Sortowanie i filtracjaJedn z cech JFace jest to e za sortowanie danych mo e odpowiada widok co odci astruktur danych od odpowiedzialno ci za w a ciwe przetwarzanie materia oacutew W ten sposoacutebbardzo atwo utworzy widoki z filtracj w ktoacuterych u ytkownik szuka okre lonej frazy lub tesortuje wyniki zgodnie ze swym zapotrzebowaniem Filtry s powszechnie u ywane w IDEEclipse Przyk adem s chocia by opcje Hide libraries from external lub Hide closed projectsznajduj ce si w opcjach wielu widokoacutew
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
94
Kroki do wykonania mdash sortowanie elementoacutew w widokuWidok drzewa wy wietla obecnie dane w sposoacuteb posortowany ale za sortowanie nie odpowiadawidok Poniewa dane znajduj si w obiekcie TreeMap wykonuje on automatyczne sortowanieelementoacutew na podstawie warto ci zwracanych przez metod toString() By u y innego spo-sobu sortowania (na przyk ad bazuj cego na przesuni ciu czasu) mo na albo zmodyfikowaobiekt TreeMap dodaj c nowy komparator i sortuj c dane przy ich tworzeniu albo sortowana poziomie widoku drzewa Pierwszy wyboacuter jest dobry tylko w sytuacji gdy z danych korzystajeden widok lub gdy dane pochodz z du ego zewn trznego magazynu danych ktoacutery prze-prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk ad relacyjnabaza danych) W mniejszych zbiorach danych sortowaniem mo e zaj si widok
1 Widoki strukturyzowane JFace umo liwiaj sortowanie przy u yciu klasyViewerComparator Utwoacuterz now klas mdash TimeZoneViewerComparator mdash w pakieciecompacktpube4clockuiinternal i zaimplementuj metod compare()
public class TimeZoneViewerComparator extends ViewerComparator public int compare(Viewer viewer Object o1 Object o2) int compare if (o1 instanceof TimeZone ampamp o2 instanceof TimeZone) long time= SystemcurrentTimeMillis() compare=((TimeZone)o2)getOffset(time) - ((TimeZone)o1)getOffset(time) else compare = o1toString()compareTo(o2toString()) return compare
2 Podepnij now klas poroacutewnywania do widoku
treeViewersetComparator(new TimeZoneViewerComparator())
3 Uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychStrefy czasowe powinny by posortowane najpierw po przesuni ciu czasua nast pnie alfabetycznie
4 Aby doda sortowanie specyficzne dla widoku zmodyfikuj metod compare()z TimeZoneViewerComparator by otrzyma klucz REVERSE z danych widokuU yj go do odwroacutecenia sortowania wynikoacutew
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
95
return compareboolean reverse =BooleanparseBoolean(StringvalueOf(viewergetData(REVERSE)))return reverse -compare compare
5 Aby zobaczy efekt dzia ania nowego sortowania ustaw klucz REVERSE tuprzed wywo aniem setComparator() na ko cu metody createPartControl()z TimeZoneTreeView
treeViewersetData(REVERSEBooleanTRUE)treeViewersetComparator(new TimeZoneViewerComparator())
6 Ponownie uruchom testow wersj Eclipse by przekona si e wynikiposortowane s odwrotnie ni poprzednio
Co si sta oDodaj c obiekt ViewerComparator do obiektu Viewer mo emy okre li sposoacuteb sortowania da-nych w konkretnym widoku Oczywi cie najcz ciej b dzie to powi zane z wyborem odpo-wiedniej opcji w widoku mdash mo e to by opcja odwracaj ca sortowanie lub te zmieniaj casortowanie mi dzy nazw i przesuni ciem czasu
Implementuj c obiekt komparatora warto upewni si e metoda b dzie obs ugiwa a roacute ne typyobiektoacutew (w czaj c te ktoacuterych si nie oczekuje) Dane w widoku mog si zmienia lub byinne w trakcie dzia ania aplikacji Korzystaj z instanceof by upewni si e typ jest w a ciwy
Aby zapami ta w a ciwo ci specyficzne dla widoku u yj metod setData() i getData() z wi-doku Dzi ki temu mo na u y ogoacutelnego komparatora w wielu roacute nych widokach przy jedno-czesnym respektowaniu ustawie filtracji i sortowania dla konkretnego widoku
Przedstawiony przyk ad zawiera dane sortowania ustawione na sta e co wymaga ponownegouruchomienia Eclipse by zobaczy efekt zmian Po zmianie w a ciwo ci widoku ktoacutere wp y-waj na sortowanie lub filtracj wywo aj metod refresh() widoku by zaktualizowa wy wie-tlane dane zgodnie z nowymi ustawieniami
Kroki do wykonania mdash filtrowanie elementoacutew w widokuInn cz sto wykorzystywan w widokach funkcj jest filtracja S u y ona do r cznego wyszu-kiwania konkretnego elementu lub te poszukiwania konkretnych elementoacutew widoku Bardzocz sto filtracj wi e si z menu widoku czyli menu rozwijanym po klikni ciu troacutejk ta w prawymgoacuternym rogu widoku Najcz ciej stosuje si nazw Filters (filtry) Klasa ViewerFilter zawierametod dotycz c filtracji nazywan select() (Istniej metody filter() ale s u one do fil-tracji ca ej tablicy metoda select() u ywana jest do okre lenia czy nale y wy wietli kon-kretny element czy te go pomin )
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
96
1 Utwoacuterz klas TimeZoneViewerFilter w pakiecie compacktpube4clockuiinternalktoacutera dziedziczy po klasie ViewerFilter Konstruktor powinien przyjmowa wzorzectypu String Metoda select() musi zwraca true je li element jest typu TimeZonei zawiera w swej nazwie wzorzec
public class TimeZoneViewerFilter extends ViewerFilter private String pattern public TimeZoneViewerFilter(String pattern) thispattern = pattern public boolean select(Viewer v Object parent Object element) if(element instanceof TimeZone) TimeZone zone = (TimeZone)element return zonegetDisplayName()contains(pattern) else return true
2 Filtr ustawia si na poziomie widoku Poniewa widoki mog mie kilka filtroacutewprzekazuje si je do widoku jako tablic W tym przypadku wzorzec filtruustawiamy w konstruktorze ale w rzeczywisto ci zosta by pobrany od u ytkownikaZmodyfikuj klas TimeZoneTreeView na ko cu metody createPartControl()
treeViewersetFilters(new ViewerFilter[] new TimeZoneViewerFilter(GMT))
3 Uruchom testow wersj Eclipse i otwoacuterz widok Wy wietlane s tylko strefyczasowe z regionu Etc
4 Aby usun ikony rozwijania w z oacutew przy pozosta ych elementach mo na w czyw widoku drzewa automatyczne wykonywanie testoacutew rozwini w z oacutew
treeViewersetExpandPreCheckFilters(true)
5 Ponownie uruchom testow wersj Eclipse i otwoacuterz Widok drzewa stref czasowychZauwa e puste grupy nadal s wy wietlane ale nie ma ju obok nich ikonrozwijania bo po filtracji nie maj ju elementoacutew potomnych
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
97
Co si sta oKlasa TimeZoneViewerFilter powsta a jako podklasa klasy ViewerFilter i jest przekazywanado klasy TreeViewer W trakcie wy wietlania i filtracji danych filtr jest wywo ywany dla ka -dego elementu drzewa (w cznie z korzeniem)
Domy lnie gdy metoda hasChildren() zwroacuteci warto true pojawi si ikona rozwini cia ga ziPo klikni ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj filtracjiJe eli oka e si e po filtracji nie pozosta ani jeden element algorytm usunie ikon rozwini cia
W czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje e widok ju na samympocz tku sprawdzi czy po filtracji w ga zi pozostanie cho jeden potomek Opcja nie ma adnychnegatywnych konsekwencji je li w ogoacutele nie ustawiono w niej filtroacutew Je li filtry s ustawionea danych w zbiorze jest du o wykonanie operacji sprawdzenia mo e zaj sporo czasu
Aby domy lnie wy wietli wszystkie elementy drzewa lub te zwin je do pojedynczegoelementu u yj metod expandAll() i collapseAll() Najcz ciej metody te wywo uje si z po-ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz dziowym widoku (patrz wi-doki Synchronize i Package Explorer)
Je li dane maj struktur drzewiast ktoacutera domy lnie powinna wy wietli tylko cz poziomoacutewwarto zastosowa metody expandToLevel() i collapseToLevel() przyjmuj ce warto ca kowiti obiekt (u yj getRoot() dla korzenia je li obiekt nie jest jawnie okre lony) Spowoduj onerozwini cie lub zwini cie wszystkich elementoacutew do zadanego poziomu Metoda expandAll()to skroacutet wywo uj cy metod expandToLevel(getRoot() ALL_LEVELS)
W odpowiedzi na zdarzenie wyboru ktoacutere zawiera ukryty obiekt warto wykona wcze niejoperacj reveal() by konkretny element sta si widoczny Pami taj e reveal() dzia a tylkowtedy gdy metoda getParent() jest poprawnie zaimplementowana co w prezentowanymprzyk adzie nie ma miejsca
Quiz mdash sortowanie i filtracjaP1 Jak posortowa elementy drzewa w sposoacuteb inny ni domy lny
P2 Jaka metoda s u y do filtracji elementoacutew
P3 W jaki sposoacuteb po czy kilka filtroacutew
Sprawd si mdash rozwijanie ga zi i filtracjaPo poznaniu zasad dotycz cych sortowania i filtracji rozbuduj przyk ad o kilka nowych elementoacutew
Dodaj drugi filtr ktoacutery usuwa wszystkie strefy czasowe z ujemnym przesuni ciem czasu Po otwarciu widoku wykonaj operacj expandAll()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
98
Zastosuj sortowanie w ktoacuterym regiony s u o one w odwrotnej kolejno cialfabetycznej ale strefy czasowe mdash w porz dku alfabetycznym
Dodaj okno dialogowe pozwalaj ce na zmian wzorca filtru Dodatkowo u yjpustego ci gu znakoacutew jako warto ci stosowanej do usuni cia filtracji
Interakcje i w a ciwo ciMo liwo wy wietlenia danych to jedna rzecz ale w wi kszo ci widokoacutew najwa niejsza jestinteraktywno Niezale nie od tego czy dotyczy to funkcjonalno ci sortowania i filtracjiz wcze niejszej cz ci rozdzia u czy wyboru konkretnych elementoacutew widoki musz by ele-mentami interaktywnymi by mo na ich u y nie tylko do przegl dania danych ale roacutewniedo ich edycji
Kroki do wykonaniamdash dodanie procedury obs ugi podwoacutejnego klikni ciaWidok drzewa najcz ciej s u y do wy wietlania tre ci w sposoacuteb hierarchiczny Niestety drzewonie jest odpowiedni struktur by wy wietli wszystkie szczegoacute y obiektu Po podwoacutejnym klik-ni ciu konkretnego elementu warto wy wietli jego szczegoacute y
1 Na ko cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimowklas wewn trzn implementuj c interfejs IDoubleClickListener i dodaj j metodaddDoubleClickListener() do obiektu treeViewer Podobnie jak w rozdziale 1otwoacuterz okno dialogowe by sprawdzi czy wszystko zadzia a o prawid owo
treeVieweraddDoubleClickListener(new IDoubleClickListener() public void doubleClick(DoubleClickEvent event) Viewer viewer = eventgetViewer() Shell shell = viewergetControl()getShell() MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejne klikni cie) )
2 Uruchom testow wersj Eclipse i otwoacuterz widok Podwoacutejnie kliknij drzewoa pojawi si komunikat Wykryto podwoacutejne klikni cie Okno jest typu modalnegoco zapobiega wybraniu innych elementoacutew interfejsu a do momentu zamkni cia okna
3 By znale wybrane obiekty Eclipse udost pnia interfejs ISelection (ktoacutery zapewniajedynie metod isEmpty()) oraz interfejs IStructuredSelection (zapewnia iteratori inne metody dost powe) Istnieje roacutewnie kilka wyspecjalizowanych podtypoacutewna przyk ad ITreeSelection ktoacutery potrafi prze ledzi cie k prowadz c do aktualniewybranego elementu drzewa W metodzie dotycz cej podwoacutejnego klikni ciaznajduj cej si w metodzie createPartControl() klasy TimeZoneTreeView zast pfragment MessageDialog poni szym kodem
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
99
MessageDialogopenInformation(shell Podwoacutejne klikni cie Wykryto podwoacutejneklikni cie)
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone)selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZonetoString())
4 Uruchom Eclipse i otwoacuterz widok Dwukrotnie kliknij element drzewa a pojawi siokno informacyjne z tekstem zawieraj cym nazw strefy czasowej
5 Aby wy wietli wi cej informacji na temat obiektu TimeZone utwoacuterz podklasklasy MessageDialog o nazwie w TimeZoneDialog i umie j w pakieciecompacktpube4clockuiinternal Implementacja ma nast puj c posta
public class TimeZoneDialog extends MessageDialog private TimeZone timeZone public TimeZoneDialog(Shell parentShell TimeZone timeZone) super(parentShell timeZonegetID() null Strefa czasowa + timeZone getID() INFORMATION new String[] IDialogConstantsOK_LABEL 0) thistimeZone = timeZone
6 Tre okna zapewnia metoda CustomArea() u ywana do budowania zawarto ci widokuDodaj do klasy TimeZoneDialog metod createCustomArea()
protected Control createCustomArea(Composite parent) ClockWidget clock = new ClockWidget(parentSWTNONE new RGB(1282550)) clocksetOffset((TimeZonegetDefault()getOffset(SystemcurrentTimeMillis()) - timeZonegetOffset(SystemcurrentTimeMillis()))3600000) return parent
7 Na ko cu zmodyfikuj wywo anie MessageDialogopen() z klasy TimeZoneTreeViewby korzysta o z nowej implementacji
if (selectedValue instanceof TimeZone) TimeZone timeZone = (TimeZone) selectedValue MessageDialogopenInformation(shell timeZonegetID() timeZone toString()) new TimeZoneDialog(shell timeZone)open()
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
100
8 Uruchom testow wersj Eclipse i dwukrotnie kliknij stref czasow by zobaczyokno dialogowe
Co si sta oDodali my procedur obs ugi podwoacutejnego klikni cia i zarejestrowali my j za pomoc meto-dy addDoubleClickListener() Pocz tkowo wy wietlali my standardowe okno informacyjneale poacute niej utworzyli my w asn podklas MessageDialog ktoacutera korzysta z klasy ClockWidgetBy otrzyma odpowiedni stref czasow (obiekt TimeZone) pobrali my aktualnie zaznaczonyobiekt z TreeViewer
Za zaznaczanie odpowiada interfejs ISelection Metoda getSelection() powinna zawszezwroacuteci warto inn ni null ale czasem uzyskana warto spowoduje zwroacutecenie true pou yciu jej w metodzie isEmpty() Istniej jednak dwa interesuj ce interfejsy pochodne mdashIStructuredSelection i ITreeSelection
Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficznedla drzew Umo liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele-mentach nadrz dnych (w strukturze drzewa)
Interfejs IStructuredSelection jest chyba najcz ciej stosowanym interfejsem gdy chodzio systemy wyboru Je li wyboacuter nie jest pusty praktycznie zawsze jest instancj implementuj cIStructuredSelection Z tego powodu bardzo cz sto mo na zobaczy poni szy fragment kodu
ISelection sel = viewergetSelection()Object selectedValueif ((sel instanceof IStructuredSelection) || selisEmpty()) selectedValue = null else selectedValue = ((IStructuredSelection)sel)getFirstElement()
Fragment pobiera zaznaczenie z widoku Je li wynik nie jest instancj IStructuredSelectionlub jest pusty przypisuje zmiennej selectedValue warto null W pozosta ych sytuacjach rzu-tuje otrzymany obiekt na interfejs IStructuredSelection i wywo uje metod getFirstElement()by pobra pojedyncz warto zaznaczenia
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
101
Zaznaczeniu mog o ulec wi cej elementoacutew co oznacza e metoda getFirstElement() zwracajedynie pierwszy z nich Klasa implementuj ca IStructuredSelection musi zapewni iteratorumo liwiaj cy pobranie wszystkich zaznaczonych obiektoacutew
E4 W Eclipse 4 zaznaczony obiekt mo na wstrzykn do metody za pomoc adnotacji
Inject Optionalvoid setTZ(Named(IServiceConstantsACTIVE_SELECTION) TimeZone timeZone)
Kroki do wykonania mdash wy wietlanie w a ciwo ciIDE Eclipse zamiast wymusza tworzenie coraz to nowych okien dialogowych dla ka degoobiektu udost pnia ogoacutelny widok w a ciwo ci (znajduj cy si we wtyczce orgeclipseuiviews)ktoacutery s u y do wy wietlania informacji o aktualnie zaznaczonym obiekcie W a ciwo ci s od-krywane w sposoacuteb uogoacutelniony a dost p do nich zapewnia interfejs IPropertySource Dzi kitemu obiekt mo e wprowadzi abstrakcj w kwestii wyliczania warto ci poacutel pokazywanychw oknie w a ciwo ci
Najprostszym sposobem utworzenia roacuted a w a ciwo ci jest zapewnienie by obiekt sam za-implementowa interfejs IPropertySource Oczywi cie jest to mo liwe tylko w sytuacji gdy kodroacuted owy mo na zmieni ale w wielu sytuacjach (na przyk ad w przypadku obiektu TimeZone lubMapEntry zawieraj cego klucz typu String i obiekt TimeZone) kod roacuted owy nie jest dost pny
1 Otwoacuterz plik MANIFESTMETA-INFMF i dodaj orgeclipseuiviewsjako zale no w zak adce Dependencies lub jako paczk w Require-BundleW przeciwnym razie IPropertySource nie b dzie odnajdywane
2 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZonePropertySourceimplementuj c interfejs IPropertySource W konstruktorze przyjmij pojedynczinstancj TimeZone
public class TimeZonePropertySource implements IPropertySource private TimeZone timeZone public TimeZonePropertySource(TimeZone timeZone) thistimeZone = timeZone
3 Jedynymi metodami ktoacutere trzeba zaimplementowa s getPropertyValue()i getPropertyDescriptors() (Pozosta e metody takie jak getEditableValue()i isPropertySet() mo na zignorowa bo u ywa si ich tylko w operacjach edycjiPowinny pozosta puste lub zwraca null albo false Metody getPropertyValue()i isPropertySet() wywo uje si z identyfikatorem Pozosta e metody zwracaj tabliceobiektoacutew PropertyDescriptors cz ce identyfikator i nazw w a ciwo ci do wy wietleniaw interfejsie graficznym Dodaj poni szy kod do klasy TimeZonePropertySource
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
102
private static final Object ID = new Object()private static final Object DAYLIGHT = new Object()private static final Object NAME = new Object()public IPropertyDescriptor[] getPropertyDescriptors() return new IPropertyDescriptor[] new PropertyDescriptor(ID Strefa czasowa) new PropertyDescriptor(DAYLIGHT Czas letni) new PropertyDescriptor(NAME Nazwa) public Object getPropertyValue(Object id) if (IDequals(id)) return timeZonegetID() else if(DAYLIGHTequals(id)) return timeZoneinDaylightTime(new Date()) else if (NAMEequals(id)) return timeZonegetDisplayName() else return null
4 Powi zanie roacuted a w a ciwo ci z oknem w a ciwo ci wymaga u ycia adapteraMo na go wskaza za pomoc interfejsu IAdaptable ktoacutery umo liwia klasie wirtualnimplementacj interfejsu Poniewa TimeZone nie mo e zaimplementowa IAdaptablew sposoacuteb bezpo redni potrzebujemy IAdapterFactory
5 Utwoacuterz w pakiecie compacktpube4clockuiinternal klasTimeZoneAdapterFactory implementuj c interfejs IAdapterFactory
public class TimeZoneAdapterFactory implements IAdapterFactory public Class[] getAdapterList() return new Class[] IPropertySourceclass public Object getAdapter(Object o Class type) if(type == IPropertySourceclass ampamp o instanceof TimeZone) return new TimeZonePropertySource((TimeZone)o) else return null
6 Aby zarejestrowa fabryk adapteroacutew w Eclipse dodaj odpowiedni wpis w plikupluginxml
ltextension point=orgeclipsecoreruntimeadaptersgt ltfactory adaptableType=javautilTimeZone class=compacktpube4clockuiinternalTimeZoneAdapterFactorygt ltadapter type=orgeclipseuiviewspropertiesIPropertySourcegt ltfactorygtltextensiongt
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
103
7 Uruchom testow wersj Eclipse wybierz stref czasow w widoku drzewa i otwoacuterzokno w a ciwo ci poleceniem WindowShow ViewOtherGeneralProperties z menuNie pojawi si adne informacje By mie pewno e adapter jest podpi typrawid owo dodaj na ko cu metody createPartControl() z TimeZoneTreeViewnast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
8 Uruchom testow wersj Eclipse otwoacuterz Widok drzewa stref czasowych i sprawdwidok Console g oacutewnego Eclipse Konsola powinna zawiera wpis podobny doponi szego
Adapterem jest compacktpube4clockuiinternalTimeZonePropertySource7f8a6fb0
9 Czego wi c brakuje Okazuje si e okno Properties nie otrzymuje informacjio zmianie zaznaczenia By rozwi za problem dodaj w metodzie createPartControl()z TimeZoneTreeView nast puj cy wpis
Systemoutprintln(Adapterem jest + PlatformgetAdapterManager()getAdapter(TimeZonegetDefault()IPropertySourceclass))
getSite()setSelectionProvider(treeViewer)
10 Teraz zmiany zaznaczenia b d przekazywane do IDE by inne widoki mog yzaktualizowa swoje dane Po wybraniu strefy czasowej okno Properties b dzieaktualizowa o si automatycznie Uruchom testow wersj Eclipse otwoacuterzWidok drzewa stref czasowych wybierz stref czasow i otwoacuterz widok Properties
E4 W celu powi zania widoku z dostawc zaznaczania nale y u y kodu podobnego do poni szego
InjectESelectionService selectionServiceISelectionChangedListener selectionListenerPostConstructpublic void postConstruct() selectionListener = new ISelectionChangedListener() public void selectionChanged(SelectionChangedEvent e) if (selectionService = null) selectionServicesetSelection(egetSelection()) treeVieweraddSelectionChangedListener(selectionListener)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
104
PreDestroypublic void preDestroy() if(selectionListener = null) treeViewerremoveSelectionChangedListener(selectionListener) selectionListener = null
Co si sta oAby zaktualizowa stan zaznaczenia IDE musieli my powi za dostawc zaznaczenia widokuz tym ktoacutery dotyczy IDE (metoda getSite()) Gdy zmieni si zaznaczenie elementu w widokuwidok wy le komunikat do wszystkich nas uchuj cych obiektoacutew by te mog y odpowiedniozaktualizowa swoje dane
E4 Procedur obs ugi zaznaczenia trzeba zarejestrowa (i wyrejestrowa ) r cznie by zapewniw a ciwe powi zanie mi dzy widokiem i us ug zaznaczenia Zamiast ISelectionService u ywa siESelectionService Interfejs jest nieco inny poniewa ISelectionService jest powi zany z klasIWorkbenchPart a ESelectionService nie posiada podobnego powi zania
W celu zapewnienia informacji dla widoku Properties utworzyli my dla TimeZone klas bazuj cna interfejsie IPropertySource i powi zali my j z IAdapterManager obiektu Platform poprzezdeklaracj w pliku pluginxml
Powi zania znacznie wygodniej tworzy w sposoacuteb deklaratywny w pliku pluginxml bo nietrzeba stosowa metod aktywacyjnych start() i stop() Wynika to z faktu i metoda startowaz Activator nie mo e zosta wywo ana a do momentu wczytania pierwszej klasy z paczkiw przypadku adaptera rejestracja deklaratywna zapewnia odpowiedni informacj niezale nieod kolejno ci wczytywania
Fabryka adapteroacutew zapewnia metod getAdapter() ktoacutera odpowiada za otoczenie lub kon-wersj przekazanego obiektu na obiekt po danego typu Je li obiekt jest ju instancj doce-lowego typu zostanie po prostu zwroacutecony mdash w przeciwnym razie metoda zwraca POJO po-rednika lub otoczk implementuj c po dany interfejs Cz sto zdarza si e posiadamy
klas (na przyk ad TimeZonePropertySupport) ktoacuterej jedynym zadaniem jest implementacjapo danego interfejsu Klasa tego typu stanowi otoczk dla obiektu (TimeZone) w celu zapew-nienia wymaganej funkcjonalno ci
Interfejs IPropertySupport zapewnia podstawowe metody do pobierania w a ciwo ci obiektuDo identyfikacji w a ciwo ci u ywa identyfikatoroacutew Identyfikator mo e by obiektem do-wolnego typu W prezentowanym przyk adzie by y to instancje new Object Cho mo na u yobiektoacutew typu String (co mo na zobaczy w wielu przyk adach) nie jest to podej cie zalecaneponiewa warto obiektu String nie ma znaczenia ale zajmuje miejsce w przestrzeni PermGenpami ci maszyny wirtualnej Co wi cej obiekt Object umo liwia poroacutewnywanie instancji za
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
105
pomoc operacji == bez nara ania si na ostrze enia automatycznych testoacutew stylu lub pytaniaprzy ocenie kodu (Inne przyk ady stosuj metod equals() by zach ci do jej u ycia gdy nies stosowane obiekty Object ale dobry JIT i tak wykona optymalizacj szczegoacutelnie wtedygdy kod wysy a wiadomo do instancji typu static final)
Quiz mdash dzia anie w a ciwo ciP1 Jak instancje TableViewer mog reagowa na klikni cie
P2 Dlaczego tworzy si podklasy klasy Dialog
P3 Czym s deskryptory w a ciwo ci
P4 Jak wy wietli w a ciwo ci w widoku Properties
Dane tabelaryczneWidok drzewa pojawia si w Eclipse bardzo cz sto ale czasem trzeba wy wietli dodatkoweinformacje zwi zane z pojedynczym elementem JFace zapewnia klas TableViewer podobndo TreeViewer ale zamiast pojedynczych etykiet mo na wy wietla wiele kolumn z danymiIstnieje roacutewnie klasa TableTreeViewer ktoacutera czy funkcjonalno obu klas
Kroki do wykonaniamdash przegl danie stref czasowych w tabeliAby wy wietla strefy czasowe w postaci tabelarycznej utworzymy nowy widok o nazwieWidok tabeli stref czasowych
1 Kliknij prawym przyciskiem myszy projekt compacktpube4clockui i wybierzpolecenie Plug-in ToolsOpen Manifest Otwoacuterz zak adk Extensions kliknijprawym przyciskiem myszy orgeclipseuiviews i wybierz NewView Wype nijpola w nast puj cy sposoacuteb
W polu ID wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Name wpisz Widok tabeli stref czasowych W polu Class wpisz compacktpube4clockuiviewsTimeZoneTableView W polu Category wpisz compacktpube4clockui W polu Icon wpisz iconssamplegif
2 Plik pluginxml powinien po tej operacji zawiera nast puj cy fragment
ltview category=compacktpube4clockui class=compacktpube4clockuiviewsTimeZoneTableView
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
106
icon=iconssamplegif id=compacktpube4clockuiviewsTimeZoneTableView name=Widok tabeli stref czasowych restorable=truegtltviewgt
3 Utwoacuterz now klas TimeZoneTableView rozszerzaj c ViewPart na podstawie skroacutetuz edytora lub skorzystaj z nowego kreatora klas Po utworzeniu widoku dodaj pustyobiekt TableViewer i u yj klasy ArrayContentProvider z list dost pnych stref czasowych
public class TimeZoneTableView extends ViewPart private TableViewer tableViewer public void createPartControl(Composite parent) tableViewer=new TableViewer(parentSWTH_SCROLL|SWTV_SCROLL) tableViewergetTable()setHeaderVisible(true) tableViewersetContentProvider(ArrayContentProvidergetInstance()) tableViewersetInput(TimeZonegetAvailableIDs()) public void setFocus() tableViewergetControl()setFocus()
E4 Tworz c cz aplikacji dla Eclipse 4 trzeba pami ta o dodaniu adnotacji Inject dla kon-struktora i adnotacji Focus dla metody setFocus()
4 Uruchom testow wersj Eclipse a w widoku o nazwie Widok listy stref czasowychpojawi si jednowymiarowa lista wszystkich stref czasowych
5 Skonwertuj tablic obiektoacutew String na tablic obiektoacutew TimeZone i ustaw j jakodane wej ciowe
tableViewersetInput(TimeZonegetAvailableIDs())String[] ids = TimeZonegetAvailableIDs()TimeZone[] timeZones = new TimeZone[idslength]for(int i=0iltidslengthi++) timeZones[i] = TimeZonegetTimeZone(ids[i])tableViewersetInput(timeZones)getSite()setSelectionProvider(tableViewer)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
107
6 Dostawca zaznaczenia zosta wskazany w ten sam sposoacuteb jak w przyk adzie z klasTimeZoneTreeView Zaznacz element tabeli i sprawd zawarto widoku Properties
7 Tabela zawiera list obiektoacutew ZoneInfo Wynika to z faktu i brakuje obiektuLabelProvider wi c do wy wietlania elementoacutew widok u ywa warto ci zwroacuteconejprzez toString() Poniewa tabela ma wiele kolumn obiekt TableViewer wykorzystujewiele instancji TableViewerColumn Ka da z nich reprezentuje kolumn tabeli i posiadaw asny rozmiar tytu i dostawc opisoacutew Tworzenie nowej kolumny oznaczanajcz ciej ustalenie standardowego wygl du (na przyk ad szeroko ci) i wskazaniedanych do wy wietleniaBy u atwi wielokrotne u ycie kodu utwoacuterz abstrakcyjn podklas ColumnLabelProvidero nazwie TimeZoneColumn (w pakiecie compacktpube4clockuiinternal) z abstrakcyjnymimetodami getText() i getTitle() oraz konkretn metod getWidth()
public abstract class TimeZoneColumn extends ColumnLabelProvider public abstract String getText(Object element) public abstract String getTitle() public int getWidth() return 250
8 Dodaj do klasy TimeZoneColumn metod pomocnicz ktoacutera u atwi do czanie klasydo widoku
public TableViewerColumn addColumnTo(TableViewer viewer) TableViewerColumn tableViewerColumn = new TableViewerColumn(viewerSWTNONE) TableColumn column = tableViewerColumngetColumn() columnsetMoveable(true) columnsetResizable(true) columnsetText(getTitle()) columnsetWidth(getWidth()) tableViewerColumnsetLabelProvider(this) return tableViewerColumn
9 Utwoacuterz w tym samym pakiecie podklas TimeZoneIDColumn rozszerzaj cTimeZoneColumn i zwracaj c kolumn identyfikatora
public class TimeZoneIDColumn extends TimeZoneColumn public String getText(Object element) if (element instanceof TimeZone)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
108
return ((TimeZone) element)getID() else return public String getTitle() return ID
10 Zmodyfikuj klas TimeZoneTableView mdash na ko cu metody createPartControl()utwoacuterz obiekt kolumny i wywo aj metod addColumnTo() przed u yciem metodysetInput()
new TimeZoneIDColumn()addColumnTo(tableViewer)tableViewersetInput(timeZones)
Pami taj e kolumny trzeba utworzy przed wywo aniem metody setInput() W przeciwnym razienie wy wietl si poprawnie
11 Uruchom testow wersj Eclipse i otwoacuterz Widok tabeli stref czasowychKolumna ID powinna by jedyn wy wietlan kolumn
12 Aby doda kolejne kolumny skopiuj klas TimeZoneIDColumn a nast pnie zmietytu i zwracan w a ciwo obiektu TimeZone Przyk adowo utwoacuterz kopiTimeZoneIDColumn o nazwie TimeZoneDisplayNameColumn Zmodyfikuj tytui pobieran metod get
return ((TimeZone) element)getID()return ((TimeZone) element)getDisplayName()return IDreturn Wy wietlana nazwa
13 Opcjonalnie wykonaj te same zadania dla innych w a ciwo ci TimeZone na przyk adprzesuni cia czasu (metoda getOffset()) lub u ycia czasu letniego (useDaylightTime())Kolumny mo na nast pnie doda do tabeli
new TimeZoneOffsetColumn()addColumnTo(tableViewer)new TimeZoneDisplayNameColumn()addColumnTo(tableViewer)new TimeZoneSummerTimeColumn()addColumnTo(tableViewer)
14 Uruchom instancj Eclipse i przejd do widoku by zobaczy dodatkowe kolumny
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
109
Co si sta oUtworzyli my obiekt TableViewer a nast pnie dodali my do niego wiele obiektoacutew ColumnLa-belProvider by wy wietli poszczegoacutelne kolumny Tworzenie podklas ColumnLabelProviderzapobiega uciekaniu si do anonimowych klas wewn trznych i u atwia wykonanie metodypomocniczej Podklasy u atwiaj tworzenie i podpinanie kolumn (o okre lonym tytule i szero-ko ci) przy jednoczesnym pami taniu konkretnych podklas takich jak TimeZoneIDColumn W tensposoacuteb unika si ledzenia kolumn za pomoc identyfikatoroacutew
By dostosowa kolumny do w asnych potrzeb u ywamy klasy Column z SWT w czaj c takie w a-ciwo ci jak przesuwanie kolumn (setMovable(true)) lub zmian ich rozmiaru (setResizable(true))
Dopuszczalne s roacutewnie operacje zwi zane z tabel (klasa Table z SWT) takie jak wy wietlenienag oacutewka (setHeaderVisible(true))
Warto pami ta e kolumny widoku tabeli s obliczane w momencie wywo ania metody setInput()wi c kolumny dodane po tym wywo aniu mog nie wy wietla si prawid owo Najlepiej wywo ametod setInput() po zako czeniu innych prac zwi zanych z tabel
Nic nie stoi na przeszkodzie by przenie do widoku funkcjonalno ci zaimplementowanew widoku drzewa Przyk adowo podpi cie logiki wyboru umo liwia wy wietlanie w widokuProperties w a ciwo ci wybranej strefy czasowej
Kroki do wykonania mdash synchronizacja wyboruWidoki TimeZoneTableView i TimeZoneTreeView mog przekazywa wyboacuter widokowi PropertiesReakcja na wyboacuter zapewnia poczucie jednolito ci cho widoki s niezale nymi bytami
Mo liwe jest dodatkowe powi zanie widokoacutew by strefa czasowa (TimeZone) wybrana w jednymz nich automatycznie zosta a pod wietlona w drugim W tym celu trzeba doda nas uchiwaniezdarzenia wyboru i je li wybrany zostanie obiekt TimeZone wy wietli go w widoku (przy u yciumetod reveal() i setSelection())
1 Utwoacuterz w pakiecie compacktpube4clockuiinternal klas TimeZoneSelectionListenerimplementuj c interfejs ISelectionListener Konstruktor przyjmie widok i obiektcz ci IDE Trzeba te doda metod selectionChanged()
public class TimeZoneSelectionListener implements ISelectionListener private Viewer viewer private IWorkbenchPart part public TimeZoneSelectionListener(Viewer v IWorkbenchPart p) thisviewer = v thispart = p public void selectionChanged(IWorkbenchPart p ISelection sel)
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
110
2 Metoda selectionChanged() wykonuje kilka zada Oto one Ignorowanie zdarzenia je li zosta o wys ane przez t sam cz IDE Pobranie zaznaczonego obiektu ze zdarzenia i poroacutewnanie go z aktualnym
zaznaczeniem Uaktualnienie widoku je li obiekty s roacute ne i zaznaczonym obiektem jestTimeZone
3 Implementacja ma nast puj c posta
public void selectionChanged(IWorkbenchPart p ISelection sel) if (p = thispart) IStructuredSelection selected = ((IStructuredSelection)sel) getFirstElement() Object current = ((IStructuredSelection)viewergetSelection()) getFirstElement() if(selected = current ampamp selected instanceof TimeZone) viewersetSelection(sel) if(viewer instanceof StructuredViewer) ((StructuredViewer) viewer)reveal(selected)
4 Obiekt nas uchiwania wyboru trzeba zarejestrowa w widokach Otwoacuterz klasTimeZoneTableView i na dole metody createPartControl() dodaj nast puj cy kod
selectionListener = new TimeZoneSelectionListener(tableViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
5 Obiekt selectionListener trzeba doda jako pole poniewa niezb dne jest jegousuni cie z listy procedur nas uchiwania w momencie usuwania widoku
private TimeZoneSelectionListener selectionListenerpublic void dispose() if (selectionListener = null) getSite()getWorkbenchWindow()getSelectionService() removeSelectionListener(selectionListener) selectionListener = null superdispose()
6 Bardzo podobn zmian (inna jest tylko nazwa zmiennej widoku) wykonaj w klasieTimeZoneTreeView
selectionListener = new TimeZoneSelectionListener(treeViewergetSite()getPart())
getSite()getWorkbenchWindow()getSelectionService()addSelectionListener(selectionListener)
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Rozdzia 3 bull Tworzenie widokoacutew w JFace
111
7 Metoda dispose() w klasie TimeZoneTreeView powinna by taka sama jak w klasieTimeZoneTableView
8 Uruchom instancj Eclipse wybierz stref czasow w widoku o nazwie Widoktabeli stref czasowych a w widoku nazywanym Widok drzewa stref czasowychpojawi si ten sam wyboacuter Tym razem zmie zaznaczenie w widoku o nazwieWidok drzewa stref czasowych by zobaczy czy w widoku nazwanym Widok tabelistref czasowych pojawi si ten sam wpis
Co si sta oZdarzenia wyboru s w Eclipse zg aszane bardzo cz sto wi c warto zatroszczy si by kod nas u-chiwania wyboru dzia a wydajnie Filtruj c zdarzenia pochodz ce z tej samej cz ci lub nieistotnetypy uzyskujemy wi ksz wydajno W przedstawionym kodzie sprawdzamy czy zaznaczeniesk ada si z przynajmniej jednego elementu typu TimeZone zanim poprosimy o aktualizacj UI
Wyboacuter widoku mo na zsynchronizowa z wywo aniem setSelection() W ten sposoacuteb oszcz -dzamy na nowym obiekcie zaznaczenia i ustawiamy dane we w a ciwy sposoacuteb Samo ustawieniewyboru nie wystarcza mdash wywo anie metody reveal() jest niezb dne do w a ciwego pod wie-tlenia zaznaczonego elementu W sytuacji gdy zaznaczono wiele elementoacutew pod wietli tylkopierwszy z nich
Metoda reveal() dost pna jest jedynie dla StructuredViewers wi c trzeba rzutowa obiektwyboru na IStructuredSelection w przypadku obiektoacutew typu StructuredViewers
Na ko cu rejestrujemy procedury obs ugi zdarze w momencie tworzenia widoku i usuwamyje w momencie niszczenia widoku W tym celu pobieramy obiekt typu ISelectionServicez cz ci IDE i wywo ujemy metod addSelectionListener() by doda procedur obs ugilub metod removeSelectionListener() by j usun
E4 W Eclipse 4 zamiast ISelectionService stosuje si ESelectionService To podobnyale nie identyczny interfejs poniewa nie zapewnia przekazania obiektu WorkbenchPart Najcz ciejESelectionService wstrzykuje si do widoku a procedura obs ugi jest dodawana w PostConstructi usuwana w PreDestroy
Quiz mdash dzia anie tabelP1 W jaki sposoacuteb w czy obs ug kolumn w TableViewer
P2 Do czego s u y TableViewerColumn
P3 W jaki sposoacuteb synchronizowa wyboacuter elementu mi dzy dwoma widokami
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Eclipse 4 Programowanie wtyczek na przyk adach
112
PodsumowanieW tym rozdziale opisali my u ycie JFace do tworzenia widokoacutew dla ustrukturyzowanych da-nych Przedstawili my zaroacutewno widoki bazuj ce na drzewach (klasa TreeViewer) jak i widokibazuj ce na tabelach (klasa TableViewer) Przedstawili my roacutewnie kilka wbudowanych w JFacefunkcjonalno ci zwi zanych z czcionkami i obrazami
By synchronizowa dane mi dzy widokami Eclipse u yli my obiektoacutew ISelectionService(w Eclipse 4 u ywa si obiektoacutew ESelectionService) Umo liwienie widokom zg aszania i od-bierania zdarze wyboru zapewnia wizualn spoacutejno IDE nawet wtedy kiedy widoki znaj-duj si w roacute nych wtyczkach
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Skorowidz
Aadnotacja
PostConstruct 157PreDestroy 157Test 253JUnit BeforeClass 260
akcje 113ndash116aktualizacja kodu w debuggerze 34ndash35aplikacja Eclipse 241
a produkt Eclipse 248archiwa 282arkusz styloacutew 194automatyczne testy wtyczek 251ndash265
Bbudowanie
funkcjonalno ci za pomoc Tycho 275ndash276inkrementacyjne 172pe ne 172produktu za pomoc Tycho 278ndash282witryny aktualizacji za pomoc Tycho
276ndash278wtyczki za pomoc Tycho 270ndash273
Ccharakter projektu 175ndash178cz ci 190 193
Ddane tabelaryczne w JFace 105ndash111debugowanie
wtyczki 31ndash35z filtrami krokoacutew 35
dodanieelementoacutew do zasobnika w SWT 71ndash73logowania do dziennika zdarze w Eclipse 4
199ndash201menu kontekstowego 114ndash115polece do menu kontekstowego 124ndash126procedury obs ugi podwoacutejnego klikni cia
w JFace 98ndash101Drop to Frame 34
EEclipse 4 informacje ogoacutelne 183ndash184Eclipse Marketplace 292Eclipse informacje ogoacutelne 21ndash22edytor EMF 186element
Direct MenuItem 219locationURI 117
FFillLayout 60filtracja w JFace 93ndash97filtrowanie
elementoacutew w widoku w JFace 95ndash97krokoacutew 31ndash35
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Skorowidz
306
funkcjonalno ci 228ndash241a Tycho 275ndash276eksport 230ndash232instalacja w Eclipse 232ndash234tworzenie 228ndash230tworzenie oznacze 239ndash241zale no ci 237ndash239
GGridLayout 60grupowanie wtyczek 228ndash241grupy i zak adki w SWT 76ndash81
Iidentyfikator
funkcjonalno ci 230polecenia 116
IMementododanie IMemento do widoku stref
czasowych 156implementacja budowania inkrementacyjnego
172instalacja
Maven 268ndash269narz dzi Eclipse 4 184ndash186
instancjaFieldEditor 146IPreferenceStore 144
interakcjaz interfejsem u ytkownika w Eclipse 4
211ndash212z u ytkownikiem 113ndash142
w SWT 67ndash70interaktywno w JFace 98ndash105interfejs
EMenuService 222ESelectionService 104 111IContextFunction 207IEclipseContext 208IEclipsePreferences 154IMemento 155 157IPreferenceStore 154IProjectNature 175IPropertySupport 104ISelection 98IStructuredSelection 100IStyledLabelProvider 91ndash92
ITreeSelection 100MContext 202
iteracja przez zasoby 168ndash170
Jjarsigner 289JFace
a obrazy 88ndash91JFace informacje ogoacutelne 83ndash84JUnit 251ndash254
Kkategoryzacja witryny aktualizacji 234ndash237keytool 289klasa
Canvas 51ColorRegistry 88ComboFieldEditor 147ContributionManager 114DialogSettings 155 157ndash158Display 55FontRegistry 88ImageRegistry 88Job 127 129
ustawianie w a ciwo ci 135ndash137LabelProvider 88MenuManager 114MessageDialogWithToggle 158MinimarkNature 178MultiStatus 141Path 171Resource 62RowLayout 59StatusManager 140StatusReporter 141SubMonitor 134TableTreeViewer 105TableViewer 105UISynchronize 211ndash212ViewerComparator 94ViewerFilter 95
klawisz M1 118klawisze 118klucz
prywatny 288ndash289publiczny 288QualifiedName 137
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Skorowidz
307
konfiguracjarodowiska Eclipse SDK 22ndash25
uruchomieniowa 29ndash31kontekst 119ndash120
w Eclipse 4 204kreator tworzenia wtyczek 25ndash28
MM1 220M2 220M3 220M4 220magazyn kluczy 289maszyna wirtualna Hotspot 35Matcher 261Maven 267ndash269mened er
tematoacutew w Eclipse 4 199uk adu graficznego 60
menu 114ndash126metaznaki 220metoda
addSelectionListener() 70asyncExec() 55build() 166collapseAll() 97collapseToLevel() 97computeSize() 57convert() 134createPartControl() 51CustomArea() 99dispose() 62 66drawArc() 50exists() 171expandAll() 97expandToLevel() 97filter() 95finalize() 62getAdapter() 104getChildren() 88getData() 95getParent() 88getPreferenceStore() 144hasChildren() 88isCancelled() 131openError() 138 141paintControl() 52redraw() 54reveal() 97
select() 95selectionChanged() 110setData() 95setFocus() 68setInput() 88setWorkRemaining() 135syncExec() 55viewByTitle() 261
metody nas uchuj ce 73modele w Eclipse 4 201monitor post pu prac 130monitory i podmonitory typu null 133ndash135
Nnazewnictwo projektoacutew wtyczek Eclipse 26ndash27numeracja wersji Maven 287
Oobiekt
Action 115Color 63Composite 60Event 206IPath 170Platform 122Status 141TrayIcon 73
obiekty modalne w SWT 74ndash76obliczanie warto ci na danie w Eclipse 4
207ndash209obserwacja wyra e 43ndash44obs uga
usuni cia pliku 172ndash174widgetoacutew 52
obstylowanie interfejsu u ytkownikaza pomoc CSS w Eclipse 4 194ndash198
okna p ywaj ce 76opcja setExpandPreCheckFilters(true) 97operacje dzia aj ce w tle 127ndash129
PPDE 22plik
Applicatione4xmi 220artifactsjar 236ndash237buildproperties 27
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Skorowidz
308
plikcontentjar 236ndash237featurexml 237manifestu 49ndash50META-INFMANIFESTMF 27pluginproperties 155pluginxml 27 50pomxml 271ndash272
pliki wtyczki Eclipse 27ndash28Plug-in Development Environment (PDE) 22pobranie okna w Eclipse 4 201ndash202podklasa AbstractUIPlugin 144ndash145podpisywanie
witryn aktualizacji 288ndash292wtyczek 290ndash292
podzadania 131ndash133POJO 222ndash224polecenia 115ndash26
w Eclipse 4 215powi zanie
menu z poleceniem i procedur obs ugiw Eclipse 4 213ndash215
polece ze skroacutetami klawiaturowymi 117ndash118preferencja u ytkownika 143
dodanie siatki 149dodanie s oacutew kluczowych 153lokalizacja strony preferencji 150ndash151tworzenie komunikatoacutew ostrze e i b doacutew
146ndash147utworzenie strony preferencji 145ndash146u ycie innych edytoroacutew poacutel 151ndash152wyboacuter elementu z listy 147ndash149zapisywanie i wczytywanie 144ndash145
preferencje w Eclipse 4 209ndash211procedury obs ugi 115ndash126produkt a Tycho 278produkt Eclipse 241 245 248przekazywanie parametroacutew polecenia
w Eclipse 4 215ndash217przestrze nazw Eclipse 26ndash27przestrze robocza 161przypadki testowe 251pseudoselektor 196publikowanie witryny aktualizacji
na serwerze 292punkty rozszerze 50punkty wstrzymania
dla metod 37ndash38warunkowe 38ndash40wstrzymanie dzia ania po wyst pieniu
wyj tku 40ndash44
Rraportowanie post pu prac 129ndash130reakcja na akcje u ytkownika w SWT 73ndash74rejestr zasoboacutew 88rejestracja rodzaju znacznika 180ndash181repozytorium p2 282RowLayout 60Run 29ndash31RunStep into Selection 34rysowanie w asnego widoku w SWT 50ndash60
Sselektor styloacutew 194ndash196s owa kluczowe 153sortowanie w JFace 93ndash97sprawdzanie anulowania zadania 131Step Filtering 37Step Into 34Step Over 34Step Return 34 38styl FLAT 149style w dostawcy etykiet w JFace 91ndash93Suspend on caught exceptions 42Suspend on uncaught exceptions 42SWT a obs uga w tkoacutew 55SWT informacje ogoacutelne 47 52SWTNO_TRIM 76SWTON_TOP 76SWTBot 254ndash260
interakcja z interfejsem u ytkownika262ndash265
korzystanie z widokoacutew 260ndash262synchronizacja wyboru widoku w JFace 109systemy buduj ce 165szpieg CSS 185
ledzenie w SWT 64ndash65
Ttesty
automatyczne 283ndash286interfejsu graficznego 254ndash260wtyczek 251ndash265
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Skorowidz
309
t umaczenie na inne j zyki 155tworzenie
akcji 113ndash115aplikacji bez interfejsu u ytkownika 242ndash245bezpo redniego menu i skroacutetoacutew klawiszowych
w Eclipse 4 218ndash220charakteru projektu 175ndash178cz ci w Eclipse 4 190ndash193edytora 162ndash164funkcjonalno ci 228ndash230menu kontekstowego i menu widoku
w Eclipse 4 220ndash222obiektu TreeViewer w JFace 84ndash88parsera 164ndash165polece i procedur obs ugi 115ndash117produktu Eclipse 245ndash249projektu nadrz dnego 273ndash275przyk adowej aplikacji Eclipse 4 186ndash190systemu buduj cego 165ndash168us ugi w Eclipse 4 222ndash223widgetu wielokrotnego u ytku w SWT 56ndash58widokoacutew TreeViewer w JFace 84ndash93widoku w SWT 48ndash50w asnych klas do wstrzykiwania w Eclipse 4
222ndash224wtyczki za pomoc kreatora 25ndash28zasoboacutew 170ndash171
Tycho 268
UUIJob 127uk ad graficzny widoku w SWT 58ndash60ukrywanie ekranu powitalnego 258ndash259uruchomienie
w w tku interfejsu u ytkownika w SWT55ndash56
wtyczki 28ndash31us uga
OSGi 199OSGi EventAdmin 204 206
uzyskanie zaznaczenia w Eclipse 4 202ndash204
VVariables 43ndash44
Wwersjonowanie semantyczne 287widgety w SWT 47ndash82widok Variables 43ndash44widoki w SWT 47ndash82wielokrotne u ycie wyra e 123ndash124witryna aktualizacji 292
a Tycho 276ndash278kategoryzacja 234ndash237podpisywanie 288ndash292
w a ciwo ci styloacutew 197ndash198w czanie i wy czanie elementoacutew menu
121ndash122wstrzykiwanie podtypoacutew w Eclipse 4 223ndash224wtyczka zgodno ci 225wycieki zasoboacutew 63ndash67wy apywanie wyj tkoacutew 40ndash42wyra enie visibleWhen 121ndash122wy wietlanie w a ciwo ci w JFace 101ndash105wywo anie isDisposed() 62
Zzadania 54 127ndash138zakres kontekstu 119zarz dzanie zasobami w SWT 61ndash67zasobnik systemowy 71zasoby 161ndash182zatykanie wycieku 65ndash67zdarzenia
w Eclipse 4 204ndash207wyboru 111
zestawy testoacutew 251zg aszanie b doacutew 138ndash141zmiana
kontekstu 119ndash121numeru wersji 286ndash288
zmienna style 52zmienne w Workbench Core Expressions 122znaczniki 178ndash181znajdowanie wycieku 63ndash65
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę
Skorowidz
310
Kup książkę Poleć książkę