tytuł oryginału: eclipse 4 plug-in development by example ...pdf.helion.pl/eclip4/eclip4.pdfu ycie...

46

Upload: others

Post on 27-May-2020

16 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 2: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 3: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 4: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 5: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 6: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 7: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 8: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 9: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 10: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 11: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 12: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 13: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 14: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 15: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 16: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 17: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 18: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 19: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 20: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 21: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 22: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 23: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 24: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 25: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 26: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 27: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 28: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 29: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 30: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 31: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 32: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 33: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 34: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 35: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 36: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 37: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 38: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 39: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 40: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 41: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 42: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

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ę

Page 43: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku

Skorowidz

310

Kup książkę Poleć książkę

Page 44: Tytuł oryginału: Eclipse 4 Plug-in Development by Example ...pdf.helion.pl/eclip4/eclip4.pdfU ycie IMemento i DialogSettings 155 Kroki do wykonania — dodanie IMemento do widoku