Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00486 007425 10473027 na godz. na dobę w sumie
Eclipse 4. Programowanie wtyczek na przykładach - książka
Eclipse 4. Programowanie wtyczek na przykładach - książka
Autor: Liczba stron: 312
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-8754-1 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> java - programowanie
Porównaj ceny (książka, ebook, audiobook).

Rozszerz możliwości środowiska Eclipse!

Eclipse to przede wszystkim darmowe i popularne środowisko programistyczne, używane głównie przez programistów języka Java. Dzięki swej elastyczności oraz możliwości tworzenia wtyczek Eclipse przydaje się także programistom wielu innych języków, między innymi C, C++, PHP. Platformę tę można wykorzystać również do tworzenia aplikacji. Dzięki tej książce przekonasz się, że to wcale nie musi być trudne!

Już w trakcie lektury początkowych rozdziałów wykonasz swoją pierwszą wtyczkę. Nauczysz się tworzyć widoki w SWT oraz JFace, pobierać dane od użytkownika oraz korzystać z zasobów. Ponadto dowiesz się, jak grupować wtyczki oraz je aktualizować. Z pewnością Twoją uwagę zwróci rozdział poświęcony automatycznym testom tworzonych rozszerzeń. Dzięki nim będziesz zawsze pewien, że rozszerzenia działają dokładnie tak, jak zaplanowałeś! Książka ta jest doskonałą lekturą dla wszystkich programistów chcących wykorzystać potencjał platformy Eclipse!

Dzięki tej książce:

Odkryj nieznane możliwości środowiska Eclipse!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Eclipse 4 Plug-in Development by Example: Beginner s Guide Tłumaczenie: Rafał Jońca ISBN: 978-83-246-8754-1 Copyright © Packt Publishing 2013. First published in the English language under the title „Eclipse 4 Plug-in Development by Example: Beginner s Guide”. Polish edition copyright © 2014 by Helion S.A. 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ą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/eclip4 Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis tre(cid:258)ci Przedmowa Rozdzia(cid:239) 1. Tworzenie pierwszej wtyczki Przygotowanie (cid:258)rodowiska Kroki do wykonania — konfiguracja (cid:258)rodowiska Eclipse SDK Tworzenie pierwszej wtyczki Kroki do wykonania — tworzenie wtyczki Quiz — przestrzenie nazw i wtyczki Eclipse Uruchomienie wtyczki Kroki do wykonania — uruchomienie Eclipse z poziomu Eclipse Quiz — uruchamianie Eclipse Sprawd(cid:283) si(cid:218) — modyfikacja wtyczki Debugowanie wtyczki Kroki do wykonania — debugowanie wtyczki Kroki do wykonania — aktualizacja kodu w debuggerze Debugowanie z filtrami kroków Kroki do wykonania — ustawienie filtru kroków Korzystanie z ró(cid:285)nych rodzajów punktów wstrzymania Kroki do wykonania — wstrzymanie przy wej(cid:258)ciu do metody lub wyj(cid:258)ciu z niej Warunkowe punkty wstrzymania Kroki do wykonania — ustawienie warunkowego punktu wstrzymania Wstrzymanie dzia(cid:239)ania po wyst(cid:200)pieniu wyj(cid:200)tku Kroki do wykonania — wy(cid:239)apywanie wyj(cid:200)tków Kroki do wykonania — obserwacja zmiennych i wyra(cid:285)e(cid:241) Quiz — debugowanie Sprawd(cid:283) si(cid:218) — korzystanie z punktów wstrzymania Podsumowanie Rozdzia(cid:239) 2. Tworzenie widoków w SWT Tworzenie widoków i widgetów Kroki do wykonania — tworzenie widoku Kroki do wykonania — rysowanie w(cid:239)asnego widoku Kroki do wykonania — rysowanie wskazówki sekund 15 21 21 22 25 25 28 28 28 31 31 31 31 34 35 35 37 37 38 39 40 40 43 45 45 46 47 48 48 50 53 Kup książkęPoleć książkę Spis tre(cid:286)ci Kroki do wykonania — animacja wskazówki sekund Kroki do wykonania — uruchomienie w w(cid:200)tku interfejsu u(cid:285)ytkownika Kroki do wykonania — tworzenie widgetu wielokrotnego u(cid:285)ytku Kroki do wykonania — korzystanie z uk(cid:239)adu graficznego widoku Quiz — dzia(cid:239)anie widoków Sprawd(cid:283) si(cid:218) — wskazówki minut i godzin Zarz(cid:200)dzanie zasobami Kroki do wykonania — wi(cid:218)cej kolorów Kroki do wykonania — znajdowanie wycieku Kroki do wykonania — zatykanie wycieku Quiz — dzia(cid:239)anie zasobów Sprawd(cid:283) si(cid:218) — rozbudowa widgetu zegara Interakcja z u(cid:285)ytkownikiem Kroki do wykonania — uzyskiwanie aktywno(cid:258)ci Kroki do wykonania — reakcja na dzia(cid:239)ania u(cid:285)ytkownika Quiz — dzia(cid:239)anie widgetów Sprawd(cid:283) si(cid:218) — aktualizacja widgetu zegara Korzystanie z innych widgetów SWT Kroki do wykonania — dodanie elementów do zasobnika Kroki do wykonania — reakcja na akcje u(cid:285)ytkownika Kroki do wykonania — obiekty modalne i inne efekty Kroki do wykonania — grupy i zak(cid:239)adki Quiz — korzystanie z SWT Sprawd(cid:283) si(cid:218) — rozbudowa widoku stref czasowych Podsumowanie Rozdzia(cid:239) 3. Tworzenie widoków w JFace Dlaczego JFace? Tworzenie widoków TreeViewer Kroki do wykonania — tworzenie obiektu TreeViewer Kroki do wykonania — JFace i obrazy Kroki do wykonania — style w dostawcy etykiet Quiz — podstawy JFace Sprawd(cid:283) si(cid:218) — dodanie obrazów dla regionów Sortowanie i filtracja Kroki do wykonania — sortowanie elementów w widoku Kroki do wykonania — filtrowanie elementów w widoku Quiz — sortowanie i filtracja Sprawd(cid:283) si(cid:218) — rozwijanie ga(cid:239)(cid:218)zi i filtracja Interakcje i w(cid:239)a(cid:258)ciwo(cid:258)ci Kroki do wykonania — dodanie procedury obs(cid:239)ugi podwójnego klikni(cid:218)cia Kroki do wykonania — wy(cid:258)wietlanie w(cid:239)a(cid:258)ciwo(cid:258)ci Quiz — dzia(cid:239)anie w(cid:239)a(cid:258)ciwo(cid:258)ci Dane tabelaryczne Kroki do wykonania — przegl(cid:200)danie stref czasowych w tabeli Kroki do wykonania — synchronizacja wyboru Quiz — dzia(cid:239)anie tabel Podsumowanie 4 54 55 56 58 61 61 61 62 63 65 67 67 67 67 69 70 70 71 71 73 74 76 82 82 82 83 83 84 84 88 91 93 93 93 94 95 97 97 98 98 101 105 105 105 109 111 112 Kup książkęPoleć książkę Spis tre(cid:286)ci Rozdzia(cid:239) 4. Interakcja z u(cid:285)ytkownikiem Tworzenie akcji, polece(cid:241) i procedur obs(cid:239)ugi Kroki do wykonania — dodanie menu kontekstowego Kroki do wykonania — tworzenie polece(cid:241) i procedur obs(cid:239)ugi Kroki do wykonania — powi(cid:200)zanie polece(cid:241) ze skrótami Kroki do wykonania — zmiana kontekstu Kroki do wykonania — w(cid:239)(cid:200)czanie i wy(cid:239)(cid:200)czanie elementów menu Kroki do wykonania — wielokrotne u(cid:285)ycie wyra(cid:285)e(cid:241) Kroki do wykonania — dodanie polece(cid:241) do menu kontekstowego Sprawd(cid:283) si(cid:218) — wykorzystanie menu i pasków narz(cid:218)dziowych Quiz — dzia(cid:239)anie menu Zadania i paski post(cid:218)pu Kroki do wykonania — uruchamianie operacji dzia(cid:239)aj(cid:200)cych w tle Sprawd(cid:283) si(cid:218) — u(cid:285)ycie zadania UIJob Kroki do wykonania — raportowanie post(cid:218)pu prac Kroki do wykonania — sprawdzanie anulowania zadania Kroki do wykonania — podzadania i ich monitorowanie Kroki do wykonania — u(cid:285)ycie monitorów i podmonitorów typu null Kroki do wykonania — ustawienie w(cid:239)a(cid:258)ciwo(cid:258)ci klasy Job Sprawd(cid:283) si(cid:218) — wy(cid:258)wietlanie zadania w pasku systemowym Quiz — korzystanie z zada(cid:241) Zg(cid:239)aszanie b(cid:239)(cid:218)dów Kroki do wykonania — wy(cid:258)wietlanie b(cid:239)(cid:218)dów Quiz — zg(cid:239)aszanie b(cid:239)(cid:218)dów Podsumowanie Rozdzia(cid:239) 5. Przechowywanie preferencji i ustawie(cid:241) Przechowywanie preferencji Kroki do wykonania — trwa(cid:239)o(cid:258)(cid:202) warto(cid:258)ci Kroki do wykonania — utworzenie strony preferencji Kroki do wykonania — tworzenie komunikatów ostrze(cid:285)e(cid:241) i b(cid:239)(cid:218)dów Kroki do wykonania — wybór elementu z listy Kroki do wykonania — dodanie siatki Kroki do wykonania — lokalizacja strony preferencji Kroki do wykonania — u(cid:285)ycie innych edytorów pól Kroki do wykonania — dodanie s(cid:239)ów kluczowych Kroki do wykonania — u(cid:285)ycie IEclipsePreferences Sprawd(cid:283) si(cid:218) — t(cid:239)umaczenie na inne j(cid:218)zyki U(cid:285)ycie IMemento i DialogSettings Kroki do wykonania — dodanie IMemento do widoku stref czasowych Kroki do wykonania — u(cid:285)ycie DialogSettings Quiz — dzia(cid:239)anie preferencji Podsumowanie 113 113 114 115 117 119 121 123 124 126 127 127 127 129 129 131 131 133 135 138 138 138 138 141 142 143 143 144 145 146 147 149 150 151 153 154 155 155 156 157 159 159 5 Kup książkęPoleć książkę Spis tre(cid:286)ci Rozdzia(cid:239) 6. Korzystanie z zasobów Korzystanie z przestrzeni roboczych i zasobów Kroki do wykonania — tworzenie edytora Kroki do wykonania — tworzenie parsera Kroki do wykonania — tworzenie systemu buduj(cid:200)cego Kroki do wykonania — iteracja przez zasoby Kroki do wykonania — tworzenie zasobów Kroki do wykonania — implementacja budowania inkrementacyjnego Kroki do wykonania — obs(cid:239)uga usuni(cid:218)cia Sprawd(cid:283) si(cid:218) — rozbudowa mechanizmu budowania U(cid:285)ycie charakterów projektu Kroki do wykonania — tworzenie charakteru projektu Sprawd(cid:283) si(cid:218) — ukrywanie charakteru U(cid:285)ycie znaczników Kroki do wykonania — znacznik b(cid:239)(cid:218)du, gdy plik jest pusty Kroki do wykonania — rejestracja rodzaju znacznika Sprawd(cid:283) si(cid:218) — prawid(cid:239)owe dzia(cid:239)anie, gdy plik jest naprawd(cid:218) pusty Quiz — obs(cid:239)uga zasobów, procesu budowania i znaczników Podsumowanie Rozdzia(cid:239) 7. Model Eclipse 4 Korzystanie z modelu Eclipse 4 Kroki do wykonania — instalacja narz(cid:218)dzi Eclipse 4 Kroki do wykonania — tworzenie aplikacji Eclipse 4 Kroki do wykonania — tworzenie cz(cid:218)(cid:258)ci Kroki do wykonania — obstylowanie interfejsu u(cid:285)ytkownika za pomoc(cid:200) CSS Sprawd(cid:283) si(cid:218) — u(cid:285)ycie mened(cid:285)era tematów Us(cid:239)ugi i konteksty Kroki do wykonania — dodanie logowania do dziennika zdarze(cid:241) Kroki do wykonania — pobranie okna Kroki do wykonania — uzyskanie zaznaczenia Kroki do wykonania — korzystanie ze zdarze(cid:241) Kroki do wykonania — obliczanie warto(cid:258)ci na (cid:285)(cid:200)danie Kroki do wykonania — u(cid:285)ycie preferencji Kroki do wykonania — interakcja z interfejsem u(cid:285)ytkownika Korzystanie z polece(cid:241), procedur obs(cid:239)ugi i elementów menu Kroki do wykonania — powi(cid:200)zanie menu z poleceniem i procedur(cid:200) obs(cid:239)ugi Kroki do wykonania — przekazywanie parametrów polecenia Kroki do wykonania — utworzenie bezpo(cid:258)redniego menu i skrótów klawiszowych Kroki do wykonania — utworzenie menu kontekstowego i menu widoku Tworzenie w(cid:239)asnych klas do wstrzykiwania Kroki do wykonania — tworzenie prostej us(cid:239)ugi Kroki do wykonania — wstrzykiwanie podtypów Sprawd(cid:283) si(cid:218) — u(cid:285)ycie mostka narz(cid:218)dziowego Quiz — dzia(cid:239)anie Eclipse 4 Podsumowanie 161 161 162 164 165 168 170 172 172 174 175 175 178 178 179 180 181 182 182 183 183 184 186 190 194 199 199 199 201 202 204 207 209 211 213 213 215 218 220 222 222 223 224 224 225 6 Kup książkęPoleć książkę Spis tre(cid:286)ci Rozdzia(cid:239) 8. Tworzenie funkcjonalno(cid:258)ci, witryn aktualizacji, aplikacji i produktów Grupowanie wtyczek jako funkcjonalno(cid:258)ci Kroki do wykonania — tworzenie funkcjonalno(cid:258)ci Kroki do wykonania — eksport funkcjonalno(cid:258)ci Kroki do wykonania — instalacja funkcjonalno(cid:258)ci Kroki do wykonania — kategoryzacja witryny aktualizacji Kroki do wykonania — zale(cid:285)no(cid:258)(cid:202) od innych funkcjonalno(cid:258)ci Kroki do wykonania — tworzenie oznacze(cid:241) funkcjonalno(cid:258)ci Sprawd(cid:283) si(cid:218) — zdalna publikacja zawarto(cid:258)ci Budowanie aplikacji i produktów Kroki do wykonania — wykonanie aplikacji bez interfejsu u(cid:285)ytkownika Kroki do wykonania — tworzenie produktu Sprawd(cid:283) si(cid:218) — tworzenie produktu bazuj(cid:200)cego na funkcjonalno(cid:258)ci Quiz — sposób dzia(cid:239)ania funkcjonalno(cid:258)ci, aplikacji i produktów Podsumowanie Rozdzia(cid:239) 9. Automatyczne testy wtyczek U(cid:285)ycie frameworku JUnit do testów zautomatyzowanych Kroki do wykonania — wykonanie prostego przypadku testowego JUnit Kroki do wykonania — wykonanie testu wtyczki Wykorzystanie SWTBot do testów interfejsu graficznego Kroki do wykonania — tworzenie testów SWTBot Kroki do wykonania — korzystanie z menu Sprawd(cid:283) si(cid:218) — korzystanie z zasobów Korzystanie z SWTBot Kroki do wykonania — ukrywanie ekranu powitalnego Kroki do wykonania — unikanie b(cid:239)(cid:218)dów wykonania z SWTBot Korzystanie z widoków Kroki do wykonania — wy(cid:258)wietlenie widoków Kroki do wykonania — przes(cid:239)uchiwanie widoków Interakcja z interfejsem u(cid:285)ytkownika Kroki do wykonania — pobranie warto(cid:258)ci z interfejsu u(cid:285)ytkownika Kroki do wykonania — oczekiwanie na warunek Sprawd(cid:283) si(cid:218) — sterowanie kreatorem nowej klasy Quiz — dzia(cid:239)anie SWTBot Podsumowanie Rozdzia(cid:239) 10. Automatyczne budowanie przy u(cid:285)yciu Tycho Wykorzystanie Maven i Tycho do budowania wtyczek Eclipse Kroki do wykonania — instalacja Maven Kroki do wykonania — budowanie za pomoc(cid:200) Tycho Sprawd(cid:283) si(cid:218) — korzystanie z platform docelowych Budowanie funkcjonalno(cid:258)ci i witryn aktualizacji za pomoc(cid:200) Tycho Kroki do wykonania — tworzenie projektu nadrz(cid:218)dnego Kroki do wykonania — budowanie funkcjonalno(cid:258)ci Kroki do wykonania — budowanie witryny aktualizacji 227 228 228 230 232 234 237 239 241 241 242 245 249 249 249 251 251 252 253 254 254 256 258 258 258 259 260 260 261 262 262 263 265 265 265 267 267 268 270 272 273 273 275 276 7 Kup książkęPoleć książkę Spis tre(cid:286)ci Kroki do wykonania — budowanie produktu Sprawd(cid:283) si(cid:218) — zale(cid:285)no(cid:258)(cid:202) od komponentów Maven Testy i publikacja Kroki do wykonania — uruchomienie testów automatycznych Kroki do wykonania — zmiana numeru wersji Sprawd(cid:283) si(cid:218) — w(cid:239)(cid:200)czenie budowania dla pozosta(cid:239)ych wtyczek Podpisywanie witryn aktualizacji Kroki do wykonania — tworzenie certyfikatu podpisanego przez samego siebie Kroki do wykonania — podpisywanie wtyczek Kroki do wykonania — serwer z witryn(cid:200) aktualizacji Quiz — automatyczne budowanie i witryny aktualizacji Podsumowanie Dodatek A Odpowiedzi do quizów Rozdzia(cid:239) 1. Tworzenie pierwszej wtyczki Rozdzia(cid:239) 2. Tworzenie widoków w SWT Rozdzia(cid:239) 3. Tworzenie widoków w JFace Rozdzia(cid:239) 4. Interakcja z u(cid:285)ytkownikiem Rozdzia(cid:239) 5. Przechowywanie preferencji i ustawie(cid:241) Rozdzia(cid:239) 6. Korzystanie z zasobów Rozdzia(cid:239) 7. Model Eclipse 4 Rozdzia(cid:239) 8. Tworzenie funkcjonalno(cid:258)ci, witryn aktualizacji, aplikacji i produktów Rozdzia(cid:239) 9. Automatyczne testy wtyczek Rozdzia(cid:239) 10. Automatyczne budowanie przy u(cid:285)yciu Tycho Skorowidz 278 282 283 283 286 288 288 288 290 292 293 293 295 295 296 298 299 300 301 301 303 303 304 305 8 Kup książkęPoleć książkę 3 Tworzenie widoków w JFace W poprzednim rozdziale przyjrzeli(cid:258)my si(cid:218) podstawowym elementom SWT, które stanowi(cid:200) pomost mi(cid:218)dzy elementami systemu operacyjnego a Jav(cid:200). W tym rozdziale poznamy JFace, który korzysta z SWT w celu zapewnienia architektury MVC, a tak(cid:285)e dostarczenia wielu typowych widgetów u(cid:285)ywanych przez Eclipse. W tym rozdziale: (cid:81) utworzymy widok do przedstawiania hierarchicznych danych, (cid:81) u(cid:285)yjemy zasobów obrazu, czcionki lub koloru, (cid:81) wygenerujemy stylizowany tekst, (cid:81) posortujemy i przefiltrujemy wpisy w widokach, (cid:81) dodamy akcje dla podwójnych klikni(cid:218)(cid:202), (cid:81) zaznaczymy i obs(cid:239)u(cid:285)ymy w(cid:239)a(cid:258)ciwo(cid:258)ci, (cid:81) utworzymy widok dla danych tabelarycznych. Dlaczego JFace? Cho(cid:202) SWT zapewnia podstawow(cid:200) implementacj(cid:218) prostych widgetów (na przyk(cid:239)ad drzew, przycisków i etykiet), wszystko dzia(cid:239)a na bardzo podstawowym poziomie, bo wykorzystywane s(cid:200) teksty i indeksy zaznacze(cid:241). Aby (cid:239)atwiej wy(cid:258)wietla(cid:202) strukturyzowane dane, JFace udost(cid:218)p- nia kilka zaawansowanych widoków, które stanowi(cid:200) po(cid:239)(cid:200)czenie widgetów SWT i mened(cid:285)erów zdarze(cid:241), co zapewnia wygodn(cid:200) obs(cid:239)ug(cid:218) interfejsu u(cid:285)ytkownika dla strukturyzowanych tre(cid:258)ci. Kup książkęPoleć książkę Eclipse 4. Programowanie wtyczek na przyk(cid:225)adach Istnieje wiele rodzajów zaawansowanych widoków nazywanych viewer (wszystkie dziedzicz(cid:200) po klasie Viewer), ale najcz(cid:218)(cid:258)ciej stosowanymi s(cid:200) te, które nale(cid:285)(cid:200) do ContentViewer, na przyk(cid:239)ad TreeViewer i TableViewer. Istniej(cid:200) równie(cid:285) wersje bazuj(cid:200)ce na tek(cid:258)cie (TextViewer ma podklasy dla SourceViewer), a tak(cid:285)e widoki operacyjne (ConsoleViewer dla widoku Console lub Detailed- ProgressViewer dla widoku Progress). W tym rozdziale wykonamy widoki bazuj(cid:200)ce na klasach TreeViewer i TableViewer. Poniewa(cid:285) JFace bazuje na SWT, wiedza na temat szczegó(cid:239)ów dzia(cid:239)ania SWT jest niezb(cid:218)dna do prawid(cid:239)owego u(cid:285)ytkowania JFace. Tworzenie widoków TreeViewer Wiele widgetów w Eclipse bazuje na widoku przypominaj(cid:200)cym drzewo — jest to zarówno nawigator plików, jak i okno wy(cid:258)wietlania zawarto(cid:258)ci klas. Framework JFace udost(cid:218)pnia klas(cid:218) TreeViewer realizuj(cid:200)c(cid:200) wszystkie niezb(cid:218)dne funkcjonalno(cid:258)ci. U(cid:285)yjemy jej do wykonania widoku TimeZoneTreeView. Kroki do wykonania — tworzenie obiektu TreeViewer Podobnie jak mia(cid:239)o to miejsce w poprzednim rozdziale, nowy widok TimeZoneTreeView utwo- rzymy przy u(cid:285)yciu edytora plugin.xml. Widok wy(cid:258)wietli strefy czasowe u(cid:239)o(cid:285)one hierarchicznie wzgl(cid:218)dem regionów. 1. Kliknij prawym przyciskiem myszy projekt com.packtpub.e4.clock.ui i wybierz polecenie Plug-in Tools/Open Manifest, by otworzy(cid:202) plik plugin.xml, je(cid:258)li jeszcze nie jest otwarty. 2. Otwórz zak(cid:239)adk(cid:218) Extensions i znajd(cid:283) element org.eclipse.ui.views. Kliknij go prawym przyciskiem myszy i z menu wybierz polecenie New/View. Wype(cid:239)nij pola w sposób opisany poni(cid:285)ej. (cid:81) W polu ID wpisz com.packtpub.e4.clock.ui.views.TimeZoneTreeView. (cid:81) W polu Name wpisz Widok drzewa stref czasowych. (cid:81) W polu Class wpisz com.packtpub.e4.clock.ui.views.TimeZoneTreeView. (cid:81) W polu Category wpisz com.packtpub.e4.clock.ui. (cid:81) W polu Icon wpisz icons/sample.gif. 3. Zapisz plik. Konfigurator umie(cid:258)ci(cid:239) w pliku plugin.xml nast(cid:218)puj(cid:200)cy wpis. view category= com.packtpub.e4.clock.ui class= com.packtpub.e4.clock.ui.views.TimeZoneTreeView icon= icons/sample.gif id= com.packtpub.e4.clock.ui.views.TimeZoneTreeView name= Widok drzewa stref czasowych restorable= true /view 84 Kup książkęPoleć książkę Rozdzia(cid:225) 3. • Tworzenie widoków w JFace 4. Podobnie jak wcze(cid:258)niej, utwórz klas(cid:218) TimeZoneTreeView, która rozszerza klas(cid:218) ViewPart. 5. W metodzie createPartControl() utwórz instancj(cid:218) TreeViewer z opcjami V_SCROLL, H_SCROLL i MULTI. Zapami(cid:218)taj obiekt w polu klasy. Zaimplementuj metod(cid:218) setFocus(), by ustawia(cid:239)a widok drzewa jako aktywny element. public class TimeZoneTreeView extends ViewPart { private TreeViewer treeViewer; public void createPartControl(Composite parent) { treeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | (cid:180)SWT.V_SCROLL ); } public void setFocus() { treeViewer.getControl().setFocus(); } } (cid:41)E4: Cho(cid:202) Eclipse 4 zostanie szczegó(cid:239)owo omówione w rozdziale 7., warto wspomnie(cid:202), (cid:285)e w Eclipse 4 nad metod(cid:200) createPartControl() niezb(cid:218)dna jest adnotacja @Inject (by zapewni(cid:202) przekazanie obiektu Composite), a nad metod(cid:200) setFocus() — adnotacja @Focus. 6. Uruchom testow(cid:200) wersj(cid:218) Eclipse i przejd(cid:283) do widoku, wybieraj(cid:200)c polecenie Window/ShowView/Other/(cid:165)ledzenie czasu/Widok drzewa stref czasowych. 7. W odró(cid:285)nieniu od Swing, gdzie oczekuje si(cid:218) otrzymywania danych w klasie bazuj(cid:200)cej na konkretnym interfejsie, JFace nie wymaga (cid:285)adnej konkretnej klasy. W zamian oczekuje obiektu warto(cid:258)ci do wy(cid:258)wietlenia (wej(cid:258)cie), interfejsu, który czyta dane (dostawca tre(cid:258)ci), i interfejsu do wy(cid:258)wietlania danych (dostawca etykiet). 8. Utwórz now(cid:200) klas(cid:218) o nazwie TimeZoneLabelProvider dziedzicz(cid:200)ca po LabelProvider (z pakietu org.eclipse.jface.viewers). B(cid:218)dzie zawiera(cid:239)a metod(cid:218) o nazwie getText(), która otrzymuje obiekt i zamienia go na reprezentacj(cid:218) tekstow(cid:200). Zamiast wywo(cid:239)ywa(cid:202) toString(), zwró(cid:202) odpowiedni(cid:200) warto(cid:258)(cid:202) zwi(cid:200)zan(cid:200) z Map.Entry lub TimeZone. public class TimeZoneLabelProvider extends LabelProvider { public String getText(Object element) { if (element instanceof Map) { return Strefy czasowe ; 85 Kup książkęPoleć książkę Eclipse 4. Programowanie wtyczek na przyk(cid:225)adach } else if (element instanceof Map.Entry) { return ((Map.Entry) element).getKey().toString(); } else if (element instanceof TimeZone) { return ((TimeZone) element).getID().split( / )[1]; } else { return Nieznany typ: + element.getClass(); } } } Poniewa(cid:285) obiekt TreeViewer mo(cid:285)e mie(cid:202) wiele korzeni, test instanceof Map s(cid:239)u(cid:285)y do sprawdzenia, czy to wierzcho(cid:239)ek drzewa, który powinien mie(cid:202) nazw(cid:218) Strefy czasowe. 9. Warto zapewni(cid:202) warto(cid:258)(cid:202) domy(cid:258)ln(cid:200) — nawet je(cid:258)li jest to pusty tekst — bo otrzymanie nieznanego typu mo(cid:285)na (cid:239)atwo wy(cid:258)ledzi(cid:202) i naprawi(cid:202). 10. Utwórz now(cid:200) klas(cid:218) TimeZoneContentProvider implementuj(cid:200)c(cid:200) interfejs ITreeContentProvider. Interfejs wymaga implementacji trzech metod z sze(cid:258)ciu (pozosta(cid:239)e mog(cid:200) pozosta(cid:202) puste). Oto one. (cid:81) hasChildren() — zwraca true, je(cid:258)li w(cid:218)ze(cid:239) ma potomków. (cid:81) getChildren() — zwraca potomków konkretnego w(cid:218)z(cid:239)a. (cid:81) getElements() — zapewnia g(cid:239)ówne korzenie. 11. Metoda hasChildren() zwróci warto(cid:258)(cid:202) true, je(cid:258)li zostanie do niej przekazany obiekt typu Map lub Collection, który nie b(cid:218)dzie pusty. Przekazanie Map.Entry spowoduje wywo(cid:239)anie rekurencyjne. Dla drzew bazuj(cid:200)cych na zagnie(cid:285)d(cid:285)onych Map lub Collection metoda hasChildren() b(cid:218)dzie wygl(cid:200)da(cid:239)a identycznie. public boolean hasChildren(Object element) { if (element instanceof Map) { return !((Map) element).isEmpty(); } else if (element instanceof Map.Entry) { return hasChildren(((Map.Entry)element).getValue()); } else if (element instanceof Collection) { return !((Collection) element).isEmpty(); } else { return false; } } 12. Implementacja getChildren() rekurencyjnie wchodzi do obiektów typu Map, Collection lub Map.Entry, stosuj(cid:200)c przy tym opisany wcze(cid:258)niej wzorzec. Poniewa(cid:285) metoda wymaga zwrócenia typu Object[], kod u(cid:285)ywa funkcjonalno(cid:258)ci wbudowanej w klas(cid:218) Map, by zamieni(cid:202) zawarto(cid:258)(cid:202) entrySet() na tablic(cid:218). public Object[] getChildren(Object parentElement) { if (parentElement instanceof Map) { return ((Map) parentElement).entrySet().toArray(); 86 Kup książkęPoleć książkę Rozdzia(cid:225) 3. • Tworzenie widoków w JFace } else if (parentElement instanceof Map.Entry) { return getChildren(((Map.Entry)parentElement).getValue()); } else if (parentElement instanceof Collection) { return ((Collection) parentElement).toArray(); } else { return new Object[0]; } } 13. Kluczem przy implementacji ITreeContentProvider jest zapewnienie sta(cid:239)ej synchronizacji kodu metod getChildren() i hasChildren(). Jednym ze sposobów zapewnienia takiej sytuacji jest u(cid:285)ycie w metodzie hasChildren() metody getChildren() i sprawdzanie, czy tablica jest pusta, ale wydajno(cid:258)(cid:202) takiej operacji nie b(cid:218)dzie najlepsza, je(cid:258)li getChildren() to operacja bardzo z(cid:239)o(cid:285)ona obliczeniowo. 14. Poniewa(cid:285) TreeViewer mo(cid:285)e mie(cid:202) wiele korzeni, istnieje metoda pobieraj(cid:200)ca tablic(cid:218) korzeni z elementu wej(cid:258)ciowego. B(cid:239)(cid:200)d we frameworku JFace uniemo(cid:285)liwia argumentowi getElements() posiadanie w(cid:239)asnej warto(cid:258)ci. Z tego powodu przyj(cid:218)(cid:239)o si(cid:218), (cid:285)e najlepiej przekaza(cid:202) tablic(cid:218) (zawieraj(cid:200)c(cid:200) tylko jeden element) i nast(cid:218)pnie j(cid:200) zwróci(cid:202). Metoda przedstawiona poni(cid:285)ej b(cid:218)dzie najprawdopodobniej wygl(cid:200)da(cid:239)a tak samo dla ka(cid:285)dej klasy TreeContentProvider, któr(cid:200) kiedykolwiek napiszesz. public Object[] getElements(Object inputElement) { if (inputElement instanceof Object[]) { return (Object[]) inputElement; } else { return new Object[0]; } } 15. Po zako(cid:241)czeniu tworzenia odpowiednich klas dostawców danych przejd(cid:283) do metody createPartControl() klasy TimeZoneTreeView, by po(cid:239)(cid:200)czy(cid:202) dostawców z obiektem widoku i ustali(cid:202) obiekt b(cid:218)d(cid:200)cy (cid:283)ród(cid:239)em danych. treeViewer.setLabelProvider(new TimeZoneLabelProvider()); treeViewer.setContentProvider(new TimeZoneContentProvider()); treeViewer.setInput(new Object[]{TimeZoneComparator.getTimeZones()}); 16. Uruchom testow(cid:200) wersj(cid:218) Eclipse i otwórz widok poleceniem Window/ShowView/ Other/(cid:165)ledzenie czasu/Widok drzewa stref czasowych, by zobaczy(cid:202) efekt ko(cid:241)cowy. 87 Kup książkęPoleć książkę Eclipse 4. Programowanie wtyczek na przyk(cid:225)adach Co si(cid:218) sta(cid:239)o? Dane do TreeViewer przekazali(cid:258)my przy u(cid:285)yciu metody setInput(). Metoda prawie zawsze otrzymuje tablic(cid:218) obiektów, nawet je(cid:258)li jest to tylko jeden element. Aby zapewni(cid:202) rozpakowanie struktury danych, interfejs ITreeContentProvider udost(cid:218)pnia dwie kluczowe metody — hasChildren() i getChildren(). Umo(cid:285)liwiaj(cid:200) one przechodzenie przez struktur(cid:218) danych na (cid:285)(cid:200)danie, gdy u(cid:285)ytkownik zwija lub rozwija ga(cid:239)(cid:218)zie drzewa. Powodem istnienia dwóch metod jest fakt, i(cid:285) obliczenia w metodzie getChildren() mog(cid:200) by(cid:202) bardzo kosztowne. Metoda hasChildren() s(cid:239)u(cid:285)y do sprawdzenia, czy nale(cid:285)y wy(cid:258)wietli(cid:202) ikon(cid:218) rozwi- ni(cid:218)cia w(cid:218)z(cid:239)a. Wywo(cid:239)anie metody getChildren() jest opó(cid:283)nione a(cid:285) do momentu faktycznego otwarcia w(cid:218)z(cid:239)a. W strukturach danych, które to zapewniaj(cid:200), warto równie(cid:285) zaimplementowa(cid:202) metod(cid:218) getParent(); umo(cid:285)liwia ona dost(cid:218)p do obiektu. Je(cid:258)li jest zaimplementowana, wywo(cid:239)anie viewer.reveal(Object) powoduje rozwini(cid:218)cie w(cid:218)z(cid:239)ów w hierarchii, by ods(cid:239)oni(cid:202) wskazany obiekt. Do wy(cid:258)wietlenia etykiet na drzewie s(cid:239)u(cid:285)y klasa LabelProvider. Dostarcza ona etykiet(cid:218) (i opcjonalny obrazek) dla ka(cid:285)dego elementu. Dla ka(cid:285)dego typu obiektu mo(cid:285)na u(cid:285)y(cid:202) innej ikony. Z rozwi(cid:200)zania tego skorzystano w widoku Package z perspektywy Java, który wy(cid:258)wietla ikon(cid:218) klasy dla klas, ikon(cid:218) pakietu dla pakietów i tak dalej. Klasa LabelProvider mo(cid:285)e wy(cid:258)wietla(cid:202) komunikaty na ró(cid:285)ne sposoby. Nic nie stoi na prze- szkodzie, by doda(cid:202) do etykiety informacj(cid:218) o przesuni(cid:218)ciu czasowym (ró(cid:285)nic(cid:218) mi(cid:218)dzy konkretn(cid:200) stref(cid:200) czasow(cid:200) i czasem GMT). Kroki do wykonania — JFace i obrazy Klasa TimeZoneLabelProvider mo(cid:285)e zwróci(cid:202) obiekt Image b(cid:218)d(cid:200)cy standardowym widgetem SWT. Cho(cid:202) obraz (obiekt Image) mo(cid:285)na wczyta(cid:202) w sposób podobny jak w poprzednim rozdziale, JFace oferuje rejestry zasobów s(cid:239)u(cid:285)(cid:200)ce do zarz(cid:200)dzania zestawami zasobów aplikacji. Rejestry obs(cid:239)u- guj(cid:200) klasy ImageRegistry, FontRegistry i ColorRegistry. Rejestr zasobów ma za zadanie prze- chowywa(cid:202) list(cid:218) obiektów Resource i zwalnia(cid:202) je we w(cid:239)a(cid:258)ciwy sposób, ale tylko wtedy, gdy nie s(cid:200) ju(cid:285) potrzebne. JFace posiada rejestry globalne, ale istniej(cid:200) równie(cid:285) rejestry bardziej szczegó(cid:239)owe u(cid:285)ywane przez IDE na przyk(cid:239)ad do przechowywania list ikon folderów i plików. W rejestrze tego typu korzysta si(cid:218) z deskryptorów do okre(cid:258)lania konkretnych zasobów, wi(cid:218)c po przekazaniu de- skryptora otrzymuje si(cid:218) odpowiadaj(cid:200)c(cid:200) mu instancj(cid:218) zasobu. Zwróconym zasobem zarz(cid:200)dza rejestr, wi(cid:218)c kod, który go otrzyma, nie powinien go zwalnia(cid:202). 1. W TimeZoneLabelProvider dodaj metod(cid:218) getImage(), w której u(cid:285)ywa si(cid:218) rejestru obrazów ImageRegistry, by pobra(cid:202) ikon(cid:218) folderu. Oto kod metody. 88 Kup książkęPoleć książkę Rozdzia(cid:225) 3. • Tworzenie widoków w JFace public Image getImage(Object element) { if(element instanceof Map.Entry) { return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER); } else { return super.getImage(element); } } 2. Uruchom testow(cid:200) wersj(cid:218) Eclipse i otwórz Widok drzewa stref czasowych. Obok tekstu z nazw(cid:200) regionu pojawi si(cid:218) ikona folderu. Instancji Image nie trzeba niszczy(cid:202) samodzielnie, poniewa(cid:285) nale(cid:285)y do wtyczki PlatformUI (zasób obrazu zostanie zwolniony w momencie wy(cid:239)(cid:200)czania PlatformUI). (cid:41)E4: W Eclipse 4 instancj(cid:218) ISharedImages mo(cid:285)na otrzyma(cid:202) poprzez wstrzykni(cid:218)cie. @Inject private ISharedImages images; images.getImage(ISharedImages.IMG_OBJ_FOLDER); 3. By otrzyma(cid:202) inny obraz, u(cid:285)yj globalnych instancji ImageRegistry lub JFaceRegistry lub utwórz w(cid:239)asn(cid:200) kopi(cid:218). Zastosowanie globalnej wersji oznacza, (cid:285)e obraz Image nigdy nie zostanie zniszczony, poniewa(cid:285) JFaceRegistry istnieje przez ca(cid:239)y czas (cid:285)ycia instancji Eclipse. Zamiast tego utwórz obiekty LocalResourceManager i ImageRegistry powi(cid:200)zane z cyklem (cid:285)ycia kontrolki. Gdy kontrolka nadrz(cid:218)dna b(cid:218)dzie usuwana, automatycznie usuni(cid:218)te zostan(cid:200) równie(cid:285) obrazy. Umie(cid:258)(cid:202) w metodzie CreatePartControl klasy TimeZoneTreeView poni(cid:285)szy kod. public void createPartControl(Composite parent) { ResourceManager rm = JFaceResources.getResources(); LocalResourceManager lrm = new LocalResourceManager(rm,parent); 4. U(cid:285)ywaj(cid:200)c obiektu LocalResourceManger, utwórz instancj(cid:218) ImageRegistry i za pomoc(cid:200) metody createFromURL() dodaj obiekt ImageDescriptor na podstawie adresu URL. ImageRegistry ir = new ImageRegistry(lrm); URL sample = getClass().getResource( /icons/sample.gif ); ir.put( sample , ImageDescriptor.createFromURL(sample)); 89 Kup książkęPoleć książkę Eclipse 4. Programowanie wtyczek na przyk(cid:225)adach 5. Po wype(cid:239)nieniu obiektu ImageRegistry trzeba go powi(cid:200)za(cid:202) z obiektem LabelProvider, by ten móg(cid:239) u(cid:285)y(cid:202) w(cid:239)a(cid:258)ciwego obrazu, je(cid:258)li b(cid:218)dzie trzeba. Przeka(cid:285) rejestr obrazów do konstruktora klasy TimeZoneLabelProvider. treeViewer.setLabelProvider(new TimeZoneLabelProvider()); treeViewer.setLabelProvider(new TimeZoneLabelProvider(ir)); 6. Zaimplementuj w TimeZoneLabelProvider konstruktor, który zapami(cid:218)ta obiekt ImageRegistry. Nast(cid:218)pnie u(cid:285)yj go do pobrania obrazu w wywo(cid:239)aniu getImage(). private final ImageRegistry ir; public TimeZoneLabelProvider(ImageRegistry ir) { this.ir = ir; } public Image getImage(Object element) { if(element instanceof Map.Entry) { return ir.get( sample ); } else if(element instanceof TimeZone) { return ir.get( sample ); } else { return super.getImage(element); } } 7. Ponownie uruchom testow(cid:200) wersj(cid:218) Eclipse. W drzewie pojawi si(cid:218) przyk(cid:239)adowa ikona wtyczki. Co si(cid:218) sta(cid:239)o? Pocz(cid:200)tkowo u(cid:285)yli(cid:258)my standardowych obrazów znajduj(cid:200)cych si(cid:218) w obiekcie PlatformUI. Predefi- niowane deskryptory pochodzi(cid:239)y z interfejsu ISharedImages. Nazwy deskryptorów zaczynaj(cid:200) si(cid:218) od IMG; zastosowano w nich nast(cid:218)puj(cid:200)cy wzorzec: (cid:81) etool lub dtool — w(cid:239)(cid:200)czone lub wy(cid:239)(cid:200)czone ikony paska narz(cid:218)dziowego, (cid:81) elcl lub dlcl — w(cid:239)(cid:200)czone lub wy(cid:239)(cid:200)czone ikony lokalnego paska narz(cid:218)dziowego, (cid:81) dec — dekorator, (cid:81) obj i objs — obiekty (pliki, foldery i tym podobne). Inne wtyczki zawieraj(cid:200) w(cid:239)asne zestawy obrazów, na przyk(cid:239)ad interfejs JDT dodaje ikony zwi(cid:200)zane z pakietami, klasami, metodami i polami. 90 Kup książkęPoleć książkę Rozdzia(cid:225) 3. • Tworzenie widoków w JFace W celu u(cid:285)ycia w(cid:239)asnych obrazów utworzyli(cid:258)my obiekt ImageRegistry obs(cid:239)ugiwany przez obiekt LocalResourceManager. Je(cid:258)li do konstruktora trafi obiekt Control, klasa rejestruje w nim obiekt DisposeListener. W ten sposób, gdy kontrola b(cid:218)dzie niszczona, podobnie stanie si(cid:218) z po- wi(cid:200)zanymi z ni(cid:200) obrazami. Dzi(cid:218)ki temu ca(cid:239)y kod jest bardziej przejrzysty, gdy(cid:285) ImageRegistry mo(cid:285)na bez wi(cid:218)kszych problemów przekaza(cid:202) do klasy TimeZoneContentProvider. Obiekt ImageRegistry inicjalizujemy zestawem obiektów ImageDescriptor — w tym przypad- ku plikiem icons/sample.gif pochodz(cid:200)cym z kreatora wtyczek. Ten sam klucz s(cid:239)u(cid:285)y do inicja- lizacji i dost(cid:218)pu do obrazu. Niektóre projekty Eclipse trzymaj(cid:200) si(cid:218) konwencji z interfejsem ISharedImages z zestawem sta(cid:239)ych. Kroki do wykonania — style w dostawcy etykiet Interfejs IStyledLabelProvider s(cid:239)u(cid:285)y do zmiany domy(cid:258)lnego stylu w widoku drzewa. U(cid:285)yto go w widoku tre(cid:258)ci klas, który wy(cid:258)wietla typ zwracany przez metody, lub te(cid:285) w dekoratorze ze- spo(cid:239)ów, który wy(cid:258)wietla informacj(cid:218) o zmianach. 1. Dodaj interfejs IStyledLabelProvider do TimeZoneLabelProvider i utwórz metod(cid:218) getStyledText(). Je(cid:258)li zaznaczonym elementem jest Map.Entry zawieraj(cid:200)cy TimeZone, w nawiasach wska(cid:285) przesuni(cid:218)cie czasowe. public class TimeZoneLabelProvider extends LabelProvider implements IStyledLabelProvider { public StyledString getStyledText(Object element) { String text = getText(element); StyledString ss = new StyledString(text); if (element instanceof TimeZone) { int offset = -((TimeZone) element).getOffset(0); ss.append( ( + offset / 3600000 + h) , StyledString.DECORATIONS_ (cid:180)STYLER); } return ss; } } 2. By u(cid:285)y(cid:202) dostawcy etykiet ze zmienionym stylem, trzeba go otoczy(cid:202) klas(cid:200) DelegatingStyledCellLabelProvider. Zmodyfikuj konstruktor wywo(cid:239)ywany w metodzie createPartControl() metody TimeZoneTreeView. treeViewer.setLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir))); 3. Uruchom testow(cid:200) wersj(cid:218) Eclipse i otwórz widok, by zobaczy(cid:202) przesuni(cid:218)cia czasowe zapisane innym kolorem. 91 Kup książkęPoleć książkę Eclipse 4. Programowanie wtyczek na przyk(cid:225)adach 4. By zmieni(cid:202) czcionk(cid:218) u(cid:285)ywan(cid:200) w widoku, klasa TimeZoneLabelProvider musi implementowa(cid:202) interfejs IFontProvider. Klasa FontRegistry z JFace umo(cid:285)liwia pobranie domy(cid:258)lnej czcionki z w(cid:239)(cid:200)czon(cid:200) kursyw(cid:200). Dodaj parametr FontRegistry do konstruktora TimeZoneLabelProvider i zaimplementuj metod(cid:218) getFont(). public class TimeZoneLabelProvider extends LabelProviderimplements (cid:180)IStyledLabelProvider, IFontProvider { private final FontRegistry fr; public TimeZoneLabelProvider(ImageRegistry ir, FontRegistry fr){ this.ir = ir; this.fr = fr; } public Font getFont(Object element) { Font italic = fr.getItalic(JFaceResources.DEFAULT_FONT); return italic; } } 5. Zmodyfikuj klas(cid:218) TimeZoneTreeView, by utworzy(cid:202) i przekaza(cid:202) globalny obiekt FontRegistry pobrany z klasy JFaceResources. FontRegistry fr = JFaceResources.getFontRegistry(); treeViewer.setLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir))); treeViewer.setLabelProvider( new DelegatingStyledCellLabelProvider( new TimeZoneLabelProvider(ir, fr))); 6. Ponownie uruchom testow(cid:200) wersj(cid:218) Eclipse, by przekona(cid:202) si(cid:218), (cid:285)e strefy czasowe s(cid:200) teraz pisane kursyw(cid:200). Co si(cid:218) sta(cid:239)o? Implementuj(cid:200)c interfejs IStyledLabelProvider i otaczaj(cid:200)c go klas(cid:200) DelegatingStyledCellLabelProvider, mo(cid:285)na zmienia(cid:202) styl poszczególnych elementów drzewa, w(cid:239)(cid:200)cznie ze zmianami czcionki i koloru. Klasa StyledText umo(cid:285)liwia wy(cid:258)wietlanie tekstu ró(cid:285)nymi stylami. Cho(cid:202) w przyk(cid:239)adzie pojawi(cid:239)a si(cid:218) klasa DecorationsStyler, dodatkowe style mo(cid:285)na tak(cid:285)e zdefi- niowa(cid:202) przy u(cid:285)yciu wywo(cid:239)ania StyledString.createColorRegistryStyler( czcionka , t(cid:239)o ), gdzie oba teksty to klucze w globalnym obiekcie ColorRegistry z JFace. 92 Kup książkęPoleć książkę Rozdzia(cid:225) 3. • Tworzenie widoków w JFace Cho(cid:202) kolory mo(cid:285)na zmienia(cid:202) dla poszczególnych znaków, czcionka (obiekt Font) jest jedna dla ca(cid:239)ego tekstu. Wynika to z faktu, i(cid:285) wyliczenia rozmiaru etykiety zak(cid:239)adaj(cid:200), (cid:285)e ca(cid:239)y tekst jest pisany identyczn(cid:200) czcionk(cid:200). Jako dobr(cid:200) praktyk(cid:218) uwa(cid:285)a si(cid:218) u(cid:285)ywanie przez dostawców tre(cid:258)ci i etykiet mened(cid:285)erów zaso- bów przekazywanych do konstruktorów. Dzi(cid:218)ki temu kod (cid:239)atwo sprawdzi(cid:202) za pomoc(cid:200) testów automatycznych i pozorowanych zasobów. Niezale(cid:285)nie od tego, czy stosuje si(cid:218) model pro- gramistyczny Eclipse 3.x, czy Eclipse 4.x, oddzielenie u(cid:285)ycia zasobów od miejsca ich tworzenia to klucz do wygodnego testowania. Quiz — podstawy JFace P1. Jakie metody zawiera LabelProvider? P2. Jaka jest ró(cid:285)nica mi(cid:218)dzy metodami hasChildren() i getChildren() z ContentProvider? P3. Do czego s(cid:239)u(cid:285)y klasa ImageRegistry? P4. W jaki sposób zmieni(cid:202) styl elementów widoku drzewa? Sprawd(cid:283) si(cid:218) — dodanie obrazów dla regionów Po poznaniu podstaw postaraj si(cid:218) rozszerzy(cid:202) przyk(cid:239)ad o kilka elementów. (cid:81) Popraw klas(cid:218) TimeZoneLabelProvider, by podawa(cid:239)a przesuni(cid:218)cie w godzinach i minutach wzgl(cid:218)dem GMT. (cid:81) Uaktualnij wtyczk(cid:218), dodaj(cid:200)c ikony flag i tworz(cid:200)c wpisy w rejestrze obrazów (nazwa strefy czasowej mo(cid:285)e by(cid:202) kluczem, co u(cid:239)atwi ca(cid:239)(cid:200) obs(cid:239)ug(cid:218)). (cid:81) Wy(cid:258)wietl nazw(cid:218) regionu kursyw(cid:200), ale same nazwy stref czasowych pogrubion(cid:200) czcionk(cid:200). Sortowanie i filtracja Jedn(cid:200) z cech JFace jest to, (cid:285)e za sortowanie danych mo(cid:285)e odpowiada(cid:202) widok, co odci(cid:200)(cid:285)a struktur(cid:218) danych od odpowiedzialno(cid:258)ci za w(cid:239)a(cid:258)ciwe przetwarzanie materia(cid:239)ów. W ten sposób bardzo (cid:239)atwo utworzy(cid:202) widoki z filtracj(cid:200), w których u(cid:285)ytkownik szuka okre(cid:258)lonej frazy lub te(cid:285) sortuje wyniki zgodnie ze swym zapotrzebowaniem. Filtry s(cid:200) powszechnie u(cid:285)ywane w IDE Eclipse. Przyk(cid:239)adem s(cid:200) chocia(cid:285)by opcje Hide libraries from external lub Hide closed projects znajduj(cid:200)ce si(cid:218) w opcjach wielu widoków. 93 Kup książkęPoleć książkę Eclipse 4. Programowanie wtyczek na przyk(cid:225)adach Kroki do wykonania — sortowanie elementów w widoku Widok drzewa wy(cid:258)wietla obecnie dane w sposób posortowany, ale za sortowanie nie odpowiada widok. Poniewa(cid:285) dane znajduj(cid:200) si(cid:218) w obiekcie TreeMap, wykonuje on automatyczne sortowanie elementów na podstawie warto(cid:258)ci zwracanych przez metod(cid:218) toString(). By u(cid:285)y(cid:202) innego spo- sobu sortowania (na przyk(cid:239)ad bazuj(cid:200)cego na przesuni(cid:218)ciu czasu), mo(cid:285)na albo zmodyfikowa(cid:202) obiekt TreeMap, dodaj(cid:200)c nowy komparator i sortuj(cid:200)c dane przy ich tworzeniu, albo sortowa(cid:202) na poziomie widoku drzewa. Pierwszy wybór jest dobry tylko w sytuacji, gdy z danych korzysta jeden widok lub gdy dane pochodz(cid:200) z du(cid:285)ego, zewn(cid:218)trznego magazynu danych, który prze- prowadzi sortowanie zdecydowanie bardziej efektywnie (takiego jak na przyk(cid:239)ad relacyjna baza danych). W mniejszych zbiorach danych sortowaniem mo(cid:285)e zaj(cid:200)(cid:202) si(cid:218) widok. 1. Widoki strukturyzowane JFace umo(cid:285)liwiaj(cid:200) sortowanie przy u(cid:285)yciu klasy ViewerComparator. Utwórz now(cid:200) klas(cid:218) — TimeZoneViewerComparator — w pakiecie com.packtpub.e4.clock.ui.internal i zaimplementuj metod(cid:218) compare(). public class TimeZoneViewerComparator extends ViewerComparator { public int compare(Viewer viewer, Object o1, Object o2) { int compare; if (o1 instanceof TimeZone o2 instanceof TimeZone) { long time= System.currentTimeMillis(); compare=((TimeZone)o2).getOffset(time) - ((TimeZone)o1).getOffset(time); } else { compare = o1.toString().compareTo(o2.toString()); } return compare; } } 2. Podepnij now(cid:200) klas(cid:218) porównywania do widoku. treeViewer.setComparator(new TimeZoneViewerComparator()); 3. Uruchom testow(cid:200) wersj(cid:218) Eclipse i otwórz Widok drzewa stref czasowych. Strefy czasowe powinny by(cid:202) posortowane najpierw po przesuni(cid:218)ciu czasu, a nast(cid:218)pnie alfabetycznie. 4. Aby doda(cid:202) sortowanie specyficzne dla widoku, zmodyfikuj metod(cid:218) compare() z TimeZoneViewerComparator, by otrzyma(cid:202) klucz REVERSE z danych widoku. U(cid:285)yj go do odwrócenia sortowania wyników. 94 Kup książkęPoleć książkę Rozdzia(cid:225) 3. • Tworzenie widoków w JFace return compare; boolean reverse = Boolean.parseBoolean(String.valueOf(viewer.getData( REVERSE ))); return reverse ? -compare : compare; 5. Aby zobaczy(cid:202) efekt dzia(cid:239)ania nowego sortowania, ustaw klucz REVERSE tu(cid:285) przed wywo(cid:239)aniem setComparator() na ko(cid:241)cu metody createPartControl() z TimeZoneTreeView. treeViewer.setData( REVERSE ,Boolean.TRUE); treeViewer.setComparator(new TimeZoneViewerComparator()); 6. Ponownie uruchom testow(cid:200) wersj(cid:218) Eclipse, by przekona(cid:202) si(cid:218), (cid:285)e wyniki posortowane s(cid:200) odwrotnie ni(cid:285) poprzednio. Co si(cid:218) sta(cid:239)o? Dodaj(cid:200)c obiekt ViewerComparator do obiektu Viewer, mo(cid:285)emy okre(cid:258)li(cid:202) sposób sortowania da- nych w konkretnym widoku. Oczywi(cid:258)cie, najcz(cid:218)(cid:258)ciej b(cid:218)dzie to powi(cid:200)zane z wyborem odpo- wiedniej opcji w widoku — mo(cid:285)e to by(cid:202) opcja odwracaj(cid:200)ca sortowanie lub te(cid:285) zmieniaj(cid:200)ca sortowanie mi(cid:218)dzy nazw(cid:200) i przesuni(cid:218)ciem czasu. Implementuj(cid:200)c obiekt komparatora, warto upewni(cid:202) si(cid:218), (cid:285)e metoda b(cid:218)dzie obs(cid:239)ugiwa(cid:239)a ró(cid:285)ne typy obiektów (w(cid:239)(cid:200)czaj(cid:200)c te, których si(cid:218) nie oczekuje). Dane w widoku mog(cid:200) si(cid:218) zmienia(cid:202) lub by(cid:202) inne w trakcie dzia(cid:239)ania aplikacji. Korzystaj z instanceof, by upewni(cid:202) si(cid:218), (cid:285)e typ jest w(cid:239)a(cid:258)ciwy. Aby zapami(cid:218)ta(cid:202) w(cid:239)a(cid:258)ciwo(cid:258)ci specyficzne dla widoku, u(cid:285)yj metod setData() i getData() z wi- doku. Dzi(cid:218)ki temu mo(cid:285)na u(cid:285)y(cid:202) ogólnego komparatora w wielu ró(cid:285)nych widokach przy jedno- czesnym respektowaniu ustawie(cid:241) filtracji i sortowania dla konkretnego widoku. Przedstawiony przyk(cid:239)ad zawiera dane sortowania ustawione na sta(cid:239)e, co wymaga ponownego uruchomienia Eclipse, by zobaczy(cid:202) efekt zmian. Po zmianie w(cid:239)a(cid:258)ciwo(cid:258)ci widoku, które wp(cid:239)y- waj(cid:200) na sortowanie lub filtracj(cid:218), wywo(cid:239)aj metod(cid:218) refresh() widoku, by zaktualizowa(cid:202) wy(cid:258)wie- tlane dane zgodnie z nowymi ustawieniami. Kroki do wykonania — filtrowanie elementów w widoku Inn(cid:200), cz(cid:218)sto wykorzystywan(cid:200) w widokach funkcj(cid:200) jest filtracja. S(cid:239)u(cid:285)y ona do r(cid:218)cznego wyszu- kiwania konkretnego elementu lub te(cid:285) poszukiwania konkretnych elementów widoku. Bardzo cz(cid:218)sto filtracj(cid:218) wi(cid:200)(cid:285)e si(cid:218) z menu widoku, czyli menu rozwijanym po klikni(cid:218)ciu trójk(cid:200)ta w prawym górnym rogu widoku. Najcz(cid:218)(cid:258)ciej stosuje si(cid:218) nazw(cid:218) Filters (filtry). Klasa ViewerFilter zawiera metod(cid:218) dotycz(cid:200)c(cid:200) filtracji nazywan(cid:200) select(). (Istniej(cid:200) metody filter(), ale s(cid:239)u(cid:285)(cid:200) one do fil- tracji ca(cid:239)ej tablicy; metoda select() u(cid:285)ywana jest do okre(cid:258)lenia, czy nale(cid:285)y wy(cid:258)wietli(cid:202) kon- kretny element, czy te(cid:285) go pomin(cid:200)(cid:202)). 95 Kup książkęPoleć książkę Eclipse 4. Programowanie wtyczek na przyk(cid:225)adach 1. Utwórz klas(cid:218) TimeZoneViewerFilter w pakiecie com.packtpub.e4.clock.ui.internal, która dziedziczy po klasie ViewerFilter. Konstruktor powinien przyjmowa(cid:202) wzorzec typu String. Metoda select() musi zwraca(cid:202) true, je(cid:258)li element jest typu TimeZone i zawiera w swej nazwie wzorzec. public class TimeZoneViewerFilter extends ViewerFilter { private String pattern; public TimeZoneViewerFilter(String pattern) { this.pattern = pattern; } public boolean select(Viewer v, Object parent, Object element) { if(element instanceof TimeZone) { TimeZone zone = (TimeZone)element; return zone.getDisplayName().contains(pattern); } else { return true; } } } 2. Filtr ustawia si(cid:218) na poziomie widoku. Poniewa(cid:285) widoki mog(cid:200) mie(cid:202) kilka filtrów, przekazuje si(cid:218) je do widoku jako tablic(cid:218). W tym przypadku wzorzec filtru ustawiamy w konstruktorze, ale w rzeczywisto(cid:258)ci zosta(cid:239)by pobrany od u(cid:285)ytkownika. Zmodyfikuj klas(cid:218) TimeZoneTreeView na ko(cid:241)cu metody createPartControl(). treeViewer.setFilters(new ViewerFilter[] { new TimeZoneViewerFilter( GMT )}); 3. Uruchom testow(cid:200) wersj(cid:218) Eclipse i otwórz widok. Wy(cid:258)wietlane s(cid:200) tylko strefy czasowe z regionu Etc. 4. Aby usun(cid:200)(cid:202) ikony rozwijania w(cid:218)z(cid:239)ów przy pozosta(cid:239)ych elementach, mo(cid:285)na w(cid:239)(cid:200)czy(cid:202) w widoku drzewa automatyczne wykonywanie testów rozwini(cid:218)(cid:202) w(cid:218)z(cid:239)ów. treeViewer.setExpandPreCheckFilters(true); 5. Ponownie uruchom testow(cid:200) wersj(cid:218) Eclipse i otwórz Widok drzewa stref czasowych. Zauwa(cid:285), (cid:285)e puste grupy nadal s(cid:200) wy(cid:258)wietlane, ale nie ma ju(cid:285) obok nich ikon rozwijania, bo po filtracji nie maj(cid:200) ju(cid:285) elementów potomnych. 96 Kup książkęPoleć książkę Rozdzia(cid:225) 3. • Tworzenie widoków w JFace Co si(cid:218) sta(cid:239)o? Klasa TimeZoneViewerFilter powsta(cid:239)a jako podklasa klasy ViewerFilter i jest przekazywana do klasy TreeViewer. W trakcie wy(cid:258)wietlania i filtracji danych filtr jest wywo(cid:239)ywany dla ka(cid:285)- dego elementu drzewa (w(cid:239)(cid:200)cznie z korzeniem). Domy(cid:258)lnie, gdy metoda hasChildren() zwróci warto(cid:258)(cid:202) true, pojawi si(cid:218) ikona rozwini(cid:218)cia ga(cid:239)(cid:218)zi. Po klikni(cid:218)ciu algorytm przejdzie przez wszystkie potomki i wykona dla nich operacj(cid:218) filtracji. Je(cid:285)eli oka(cid:285)e si(cid:218), (cid:285)e po filtracji nie pozosta(cid:239) ani jeden element, algorytm usunie ikon(cid:218) rozwini(cid:218)cia. W(cid:239)(cid:200)czenie opcji setExpandPreCheckFilters(true) dla widoku spowoduje, (cid:285)e widok ju(cid:285) na samym pocz(cid:200)tku sprawdzi, czy po filtracji w ga(cid:239)(cid:218)zi pozostanie cho(cid:202) jeden potomek. Opcja nie ma (cid:285)adnych negatywnych konsekwencji, je(cid:258)li w ogóle nie ustawiono w niej filtrów. Je(cid:258)li filtry s(cid:200) ustawione, a danych w zbiorze jest du(cid:285)o, wykonanie operacji sprawdzenia mo(cid:285)e zaj(cid:200)(cid:202) sporo czasu. Aby domy(cid:258)lnie wy(cid:258)wietli(cid:202) wszystkie elementy drzewa lub te(cid:285) zwin(cid:200)(cid:202) je do pojedynczego elementu, u(cid:285)yj metod expandAll() i collapseAll(). Najcz(cid:218)(cid:258)ciej metody te wywo(cid:239)uje si(cid:218) z po- ziomu ikon typu [+] i [-] umieszczonych w lokalnym pasku narz(cid:218)dziowym widoku (patrz wi- doki Synchronize i Package Explorer). Je(cid:258)li dane maj(cid:200) struktur(cid:218) drzewiast(cid:200), która domy(cid:258)lnie powinna wy(cid:258)wietli(cid:202) tylko cz(cid:218)(cid:258)(cid:202) poziomów, warto zastosowa(cid:202) metody expandToLevel() i collapseToLevel() przyjmuj(cid:200)ce warto(cid:258)(cid:202) ca(cid:239)kowit(cid:200) i obiekt (u(cid:285)yj getRoot() dla korzenia, je(cid:258)li obiekt nie jest jawnie okre(cid:258)lony). Spowoduj(cid:200) one rozwini(cid:218)cie lub zwini(cid:218)cie wszystkich elementów do zadanego poziomu. Metoda expandAll() to skrót wywo(cid:239)uj(cid:200)cy metod(cid:218) expandToLevel(getRoot(), ALL_LEVELS). W odpowiedzi na zdarzenie wyboru, które zawiera ukryty obiekt, warto wykona(cid:202) wcze(cid:258)niej operacj(cid:218) reveal(), by konkretny element sta(cid:239) si(cid:218) widoczny. Pami(cid:218)taj, (cid:285)e reveal() dzia(cid:239)a tylko wtedy, gdy metoda getParent() jest poprawnie zaimplementowana, co w prezentowanym przyk(cid:239)adzie nie ma miejsca. Quiz — sortowanie i filtracja P1. Jak posortowa(cid:202) elementy drzewa w sposób inny ni(cid:285) domy(cid:258)lny? P2. Jaka metoda s(cid:239)u(cid:285)y do filtracji elementów? P3. W jaki sposób po(cid:239)(cid:200)czy(cid:202) kilka filtrów? Sprawd(cid:283) si(cid:218) — rozwijanie ga(cid:239)(cid:218)zi i filtracja Po poznaniu zasad dotycz(cid:200)cych sortowania i filtracji rozbuduj przyk(cid:239)ad o kilka nowych elementów. (cid:81) Dodaj drugi filtr, który usuwa wszystkie strefy czasowe z ujemnym przesuni(cid:218)ciem czasu. (cid:81) Po otwarciu widoku wykonaj operacj(cid:218) expandAll(). 97 Kup książkęPoleć książkę Eclipse 4. Programowanie wtyczek na przyk(cid:225)adach (cid:81) Zastosuj sortowanie, w którym regiony s(cid:200) u(cid:239)o(cid:285)one w odwrotnej kolejno(cid:258)ci alfabetycznej, ale strefy czasowe — w porz(cid:200)dku alfabetycznym. (cid:81) Dodaj okno dialogowe pozwalaj(cid:200)ce na zmian(cid:218) wzorca filtru. Dodatkowo u(cid:285)yj pustego ci(cid:200)gu znaków jako warto(cid:258)ci stosowanej do usuni(cid:218)cia filtracji. Interakcje i w(cid:239)a(cid:258)ciwo(cid:258)ci Mo(cid:285)liwo(cid:258)(cid:202) wy(cid:258)wietlenia danych to jedna rzecz, ale w wi(cid:218)kszo(cid:258)ci widoków najwa(cid:285)niejsza jest interaktywno(cid:258)(cid:202). Niezale(cid:285)nie od tego, czy dotyczy to funkcjonalno(cid:258)ci sortowania i filtracji z wcze(cid:258)niejszej cz(cid:218)(cid:258)ci rozdzia(cid:239)u, czy wyboru konkretnych elementów, widoki musz(cid:200) by(cid:202) ele- mentami interaktywnymi, by mo(cid:285)na ich u(cid:285)y(cid:202) nie tylko do przegl(cid:200)dania danych, ale równie(cid:285) do ich edycji. Kroki do wykonania — dodanie procedury obs(cid:239)ugi podwójnego klikni(cid:218)cia Widok drzewa najcz(cid:218)(cid:258)ciej s(cid:239)u(cid:285)y do wy(cid:258)wietlania tre(cid:258)ci w sposób hierarchiczny. Niestety, drzewo nie jest odpowiedni(cid:200) struktur(cid:200), by wy(cid:258)wietli(cid:202) wszystkie szczegó(cid:239)y obiektu. Po podwójnym klik- ni(cid:218)ciu konkretnego elementu warto wy(cid:258)wietli(cid:202) jego szczegó(cid:239)y. 1. Na ko(cid:241)cu metody createPartControl() klasy TimeZoneTreeView zarejestruj anonimow(cid:200) klas(cid:218) wewn(cid:218)trzn(cid:200) implementuj(cid:200)c(cid:200) interfejs IDoubleClickListener i dodaj j(cid:200) metod(cid:200) addDoubleClickListener() do obiektu treeViewer. Podobnie jak w rozdziale 1., otwórz okno dialogowe, by sprawdzi(cid:202), czy wszystko zadzia(cid:239)a(cid:239)o prawid(cid:239)owo. treeViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { Viewer viewer = event.getViewer(); Shell shell = viewer.getControl().getShell(); MessageDialog.openInformation(shell, Podwójne klikni(cid:218)cie , Wykryto (cid:180)podwójne klikni(cid:218)cie ); } }); 2. Uruchom testow(cid:200) wersj(cid:218) Eclipse i otwórz widok. Podwójnie kliknij drzewo, a pojawi si(cid:218) komunikat Wykryto podwójne klikni(cid:218)cie. Okno jest typu modalnego, co zapobiega wybraniu innych elementów interfejsu a(cid:285) do momentu zamkni(cid:218)cia okna. 3. By znale(cid:283)(cid:202) wybrane obiekty, Eclipse udost(cid:218)pnia interfejs ISelection (który zapewnia jedynie metod(cid:218) isEmpty()) oraz interfejs IStructuredSelection (zapewnia iterator i inne metody dost(cid:218)powe). Istnieje równie(cid:285) kilka wyspecjalizowanych podtypów, na przyk(cid:239)ad ITreeSelection, który potrafi prze(cid:258)ledzi(cid:202) (cid:258)cie(cid:285)k(cid:218) prowadz(cid:200)c(cid:200) do aktualnie wybranego elementu drzewa. W metodzie dotycz(cid:200)cej podwójnego klikni(cid:218)cia znajduj(cid:200)cej si(cid:218) w metodzie createPartControl() klasy TimeZoneTreeView zast(cid:200)p fragment MessageDialog poni(cid:285)szym kodem. 98 Kup książkęPoleć książkę Rozdzia(cid:225) 3. • Tworzenie widoków w JFace MessageDialog.openInformation(shell, Podwójne klikni(cid:218)cie , Wykryto podwójne (cid:180)klikni(cid:218)cie ); ISelection sel = viewer.getSelection(); Object selectedValue; if (!(sel instanceof IStructuredSelection) || sel.isEmpty()) { selectedValue = null; } else { selectedValue = ((IStructuredSelection)sel).getFirstElement(); } if (selectedValue instanceof TimeZone) { TimeZone timeZone = (TimeZone)selectedValue; MessageDialog.openInformation(shell, timeZone.getID(), timeZone.toString()); } 4. Uruchom Eclipse i otwórz widok. Dwukrotnie kliknij element drzewa, a pojawi si(cid:218) okno informacyjne z tekstem zawieraj(cid:200)cym nazw(cid:218) strefy czasowej. 5. Aby wy(cid:258)wietli(cid:202) wi(cid:218)cej informacji na temat obiektu TimeZone, utwórz podklas(cid:218) klasy MessageDialog o nazwie w TimeZoneDialog i umie(cid:258)(cid:202) j(cid:200) w pakiecie com.packtpub.e4.clock.ui.internal. Implementacja ma nast(cid:218)puj(cid:200)c(cid:200) posta(cid:202). public class TimeZoneDialog extends MessageDialog { private TimeZone timeZone; public TimeZoneDialog(Shell parentShell, TimeZone timeZone) { super(parentShell, timeZone.getID(), null, Strefa czasowa + timeZone. (cid:180)getID(), INFORMATION, new String[] { IDialogConstants.OK_LABEL }, 0); this.timeZone = timeZone; } } 6. Tre(cid:258)(cid:202) okna zapewnia metoda CustomArea() u(cid:285)ywana do budowania zawarto(cid:258)ci widoku. Dodaj do klasy TimeZoneDialog metod(cid:218) createCustomArea(). protected Control createCustomArea(Composite parent) { ClockWidget clock = new ClockWidget(parent,SWT.NONE, new RGB(128,255,0)); clock.setOffset((TimeZone.getDefault().getOffset(System.currentTimeMillis()) (cid:180)- timeZone.getOffset(System.currentTimeMillis()))/3600000); return parent; } 7. Na ko(cid:241)cu zmodyfikuj wywo(cid:239)anie MessageDialog.open() z klasy TimeZoneTreeView, by korzysta(cid:239)o z nowej implementacji. if (selectedValue instanceof TimeZone) { TimeZone timeZone = (TimeZone) selectedValue; MessageDialog.openInformation(shell, timeZone.getID(), timeZone. (cid:180)toString()); new TimeZoneDialog(shell, timeZone).open(); } 99 Kup książkęPoleć książkę Eclipse 4. Programowanie wtyczek na przyk(cid:225)adach 8. Uruchom testow(cid:200) wersj(cid:218) Eclipse i dwukrotnie kliknij stref(cid:218) czasow(cid:200), by zobaczy(cid:202) okno dialogowe. Co si(cid:218) sta(cid:239)o? Dodali(cid:258)my procedur(cid:218) obs(cid:239)ugi podwójnego klikni(cid:218)cia i zarejestrowali(cid:258)my j(cid:200) za pomoc(cid:200) meto- dy addDoubleClickListener(). Pocz(cid:200)tkowo wy(cid:258)wietlali(cid:258)my standardowe okno informacyjne, ale pó(cid:283)niej utworzyli(cid:258)my w(cid:239)asn(cid:200) podklas(cid:218) MessageDialog, która korzysta z klasy ClockWidget. By otrzyma(cid:202) odpowiedni(cid:200) stref(cid:218) czasow(cid:200) (obiekt TimeZone), pobrali(cid:258)my aktualnie zaznaczony obiekt z TreeViewer. Za zaznaczanie odpowiada interfejs ISelection. Metoda getSelection() powinna zawsze zwróci(cid:202) warto(cid:258)(cid:202) inn(cid:200) ni(cid:285) null, ale czasem uzyskana warto(cid:258)(cid:202) spowoduje zwrócenie true po u(cid:285)yciu jej w metodzie isEmpty(). Istniej(cid:200) jednak dwa interesuj(cid:200)ce interfejsy pochodne — IStructuredSelection i ITreeSelection. Interfejs ITreeSelection jest podtypem IStructuredSelection i dodaje metody specyficzne dla drzew. Umo(cid:285)liwia otrzymanie informacji o aktualnie zaznaczonych elementach i ich ele- mentach nadrz(cid:218)dnych (w strukturze drzewa). Interfejs IStructuredSelection jest chyba najcz(cid:218)(cid:258)ciej stosowanym interfejsem, gdy chodzi o systemy wyboru. Je(cid:258)li wybór nie jest pusty, praktycznie zawsze jest instancj(cid:200) implementuj(cid:200)c(cid:200) IStructuredSelection. Z tego powodu bardzo cz(cid:218)sto mo(cid:285)na zobaczy(cid:202) poni(cid:285)szy fragment kodu. ISelection sel = viewer.getSelection(); Object selectedValue; if (!(sel instanceof IStructuredSelection) || sel.isEmpty()) { selectedValue = null; } else { selectedValue = ((IStructuredSelection)sel).getFirstElement(); } Fragment pobiera zaznaczenie z widoku. Je(cid:258)li wynik nie jest instancj(cid:200) IStructuredSelection lub jest pusty, przypisuje zmiennej selectedValue warto(cid:258)(cid:202) null. W pozosta(cid:239)ych sytuacjach rzu- tuje otrzymany obiekt na interfejs IStructuredSelection i wywo(cid:239)uje metod(cid:218) getFirstElement(), by pobra(cid:202) pojedyncz(cid:200) warto(cid:258)(cid:202) zaznaczenia. 100 Kup książkęPoleć książkę Rozdzia(cid:225) 3. • Tworzenie widoków w JFace Zaznaczeniu mog(cid:239)o ulec wi(cid:218)cej elementów, co oznacza, (cid:285)e metoda getFirstElement() zwraca jedynie pierwszy z nich. Klasa implementuj(cid:200)ca IStructuredSelection musi zapewni(cid:202) iterator umo(cid:285)liwiaj(cid:200)cy pobranie wszystkich zaznaczonych obiektów. (cid:41)E4: W Eclipse 4 zaznaczony obiekt mo(cid:285)na wstrzykn(cid:200)(cid:202) do metody za pomoc(cid:200) adnotacji. @Inject @Optional void setTZ(@Named(IServiceConstants.ACTIVE_SELECTION) TimeZone timeZone) { } Kroki do wykonania — wy(cid:258)wietlanie w(cid:239)a(cid:258)ciwo(cid:258)ci IDE Eclipse, zamiast wymusza(cid:202) tworzenie coraz to nowych okien dialogowych dla ka(cid:285)dego obiektu, udost(cid:218)pnia ogólny widok w(cid:239)a(cid:258)ciwo(cid:258)ci (znajduj(cid:200)cy si(cid:218) we wtyczce org.eclipse.ui.views), który s(cid:239)u(cid:285)y do wy(cid:258)wietlania informacji o aktualnie zaznaczonym obiekcie. W(cid:239)a(cid:258)ciwo(cid:258)ci s(cid:200) od- krywane w sposób uogólniony, a dost(cid:218)p do nich zapewnia interfejs IPropertySource. Dzi(cid:218)ki temu obiekt mo(cid:285)e wprowadzi(cid:202) abstrakcj(cid:218) w kwestii wyliczania warto(cid:258)ci pól pokazywanych w oknie w(cid:239)a(cid:258)ciwo(cid:258)ci. Najprostszym sposobem utworzenia (cid:283)ród(cid:239)a w(cid:239)a(cid:258)ciwo(cid:258)ci jest zapewnienie, by obiekt sam za- implementowa(cid:239) interfejs IPropertySource. Oczywi(cid:258)cie, jest to mo(cid:285)liwe tylko w sytuacji, gdy kod (cid:283)ród(cid:239)owy mo(cid:285)na zmieni(cid:202), ale w wielu sytuacjach (na przyk(cid:239)ad w przypadku obiektu TimeZone lub Map.Entry zawieraj(cid:200)cego klucz typu String i obiekt TimeZone) kod (cid:283)ród(cid:239)owy nie jest dost(cid:218)pny. 1. Otwórz plik MANIFEST/META-INF.MF i dodaj org.eclipse.ui.views jako zale(cid:285)no(cid:258)(cid:202) w zak(cid:239)adce Dependencies lub jako paczk(cid:218) w Require-Bundle. W przeciwnym razie IPropertySource nie b(cid:218)dzie odnajdywane. 2. Utwórz w pakiecie com.packtpub.e4.clock.ui.internal klas(cid:218) TimeZonePropertySource implementuj(cid:200)c(cid:200) interfejs IPropertySource. W konstruktorze przyjmij pojedyncz(cid:200) instancj(cid:218) TimeZone. public class TimeZonePropertySource implements IPropertySource { private TimeZone timeZone; public TimeZonePropertySource(TimeZone timeZone) { this.timeZone = timeZone; } } 3. Jedynymi metodami, które trzeba zaimplementowa(cid:202), s(cid:200) getPropertyValue() i getPropertyDescriptors(). (Pozosta(cid:239)e metody, takie jak getEditableValue() i isPropertySet(), mo(cid:285)na zignorowa(cid:202), bo u(cid:285)ywa si(cid:218) ich tylko w operacjach edycji. Powinny pozosta(cid:202) puste lub zwraca(cid:202) null albo false. Metody getPropertyValue() i isPropertySet() wywo(cid:239)uje si(cid:218) z identyfikatorem. Pozosta(cid:239)e metody zwracaj(cid:200) tablice obiektów PropertyDescriptors (cid:239)(cid:200)cz(cid:200)ce identyfikator i nazw(cid:218) w(cid:239)a(cid:258)ciwo(cid:258)ci do wy(cid:258)wietlenia w interfejsie graficznym. Dodaj poni(cid:285)szy kod do klasy TimeZonePropertySource. 101 Kup książkęPoleć książkę Eclipse 4. Programowanie wtyczek na przyk(cid:225)adach 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 (ID.equals(id)) { return timeZone.getID(); } else if(DAYLIGHT.equals(id)) { return timeZone.inDaylightTime(new Date()); } else if (NAME.equals(id)) { return timeZone.getDisplayName(); } else { return
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Eclipse 4. Programowanie wtyczek na przykładach
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: