nyílt fejlesztőrendszerek jface

86
Budapest University of Technology and Economics Fault-tolerant Systems Research Group Nyílt Fejlesztőrendszerek JFace

Upload: les

Post on 19-Jan-2016

32 views

Category:

Documents


0 download

DESCRIPTION

Nyílt Fejlesztőrendszerek JFace. SWT vs. JFace. SWT natív Alacsony szintű elemkészlet Jól kézben tartható működés Sok kódolás JFace Magas szintű komponensek (SWT-re épít) Jobban automatizált Strukturáltabb szerkezet Könnyebb újrafelhasználás Kevésbé kézben tartható. SWT Hello World. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Nyílt Fejlesztőrendszerek JFace

Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Nyílt FejlesztőrendszerekJFace

Page 2: Nyílt Fejlesztőrendszerek JFace

2Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

SWT vs. JFace

SWT− natív− Alacsony szintű elemkészlet− Jól kézben tartható működés− Sok kódolás

JFace− Magas szintű komponensek (SWT-re épít)− Jobban automatizált− Strukturáltabb szerkezet− Könnyebb újrafelhasználás− Kevésbé kézben tartható

Page 3: Nyílt Fejlesztőrendszerek JFace

3Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

SWT Hello World

1 import org.eclipse.swt.*; 2 import org.eclipse.swt.graphics.*;3 import org.eclipse.swt.widgets.*;4 public class HelloWorld{5 public static void main(String[] args) {6 Display display = new Display();7 Shell shell = new Shell(display);8 shell.setText("Hello, World!");9 shell.setSize(200, 100);10 shell.open ();11 while (!shell.isDisposed()) {12 if (!display.readAndDispatch()) 13 display.sleep ();14 }15 display.dispose ();16 }17}

Page 4: Nyílt Fejlesztőrendszerek JFace

4Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

JFace Hello World

public class MyApp extends ApplicationWindow {

public MyApp() {

super(null);

}

protected Control createContents(Composite parent) {

Text helloText = new Text(parent, SWT.CENTER);

helloText.setText("Hello JFace world!");

parent.pack();

return parent;

}

public static void main(String[] args){

MyApp p = new MyApp();

p.setBlockOnOpen(true);

p.open();

Display.getCurrent().dispose();

}

}

Page 5: Nyílt Fejlesztőrendszerek JFace

5Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

JFace Hello World

public class MyApp extends ApplicationWindow {

public MyApp() {

super(null);

}

protected Control createContents(Composite parent) {

Text helloText = new Text(parent, SWT.CENTER);

helloText.setText("Hello JFace world!");

parent.pack();

return parent;

}

public static void main(String[] args){

MyApp p = new MyApp();

p.setBlockOnOpen(true);

p.open();

Display.getCurrent().dispose();

}

}

ApplicationWindow

Alkalmazás-ablak objektumMenu, tooolbar, … kezelése

Page 6: Nyílt Fejlesztőrendszerek JFace

6Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

JFace Hello World

public class MyApp extends ApplicationWindow {

public MyApp() {

super(null);

}

protected Control createContents(Composite parent) {

Text helloText = new Text(parent, SWT.CENTER);

helloText.setText("Hello JFace world!");

parent.pack();

return parent;

}

public static void main(String[] args){

MyApp p = new MyApp();

p.setBlockOnOpen(true);

p.open();

Display.getCurrent().dispose();

}

}

Elemek létrehozása(override)

Page 7: Nyílt Fejlesztőrendszerek JFace

7Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

JFace Hello World

public class MyApp extends ApplicationWindow {

public MyApp() {

super(null);

}

protected Control createContents(Composite parent) {

Text helloText = new Text(parent, SWT.CENTER);

helloText.setText("Hello JFace world!");

parent.pack();

return parent;

}

public static void main(String[] args){

MyApp p = new MyApp();

p.setBlockOnOpen(true);

p.open();

Display.getCurrent().dispose();

}

}

Blokkoló open()

Page 8: Nyílt Fejlesztőrendszerek JFace

8Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

JFace Hello World

public class MyApp extends ApplicationWindow {

public MyApp() {

super(null);

}

protected Control createContents(Composite parent) {

Text helloText = new Text(parent, SWT.CENTER);

helloText.setText("Hello JFace world!");

parent.pack();

return parent;

}

public static void main(String[] args){

MyApp p = new MyApp();

p.setBlockOnOpen(true);

p.open();

Display.getCurrent().dispose();

}

}

Mindenki a Display gyereke, elég ezt törölni

Page 9: Nyílt Fejlesztőrendszerek JFace

9Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Eseménykezelés

Event-Listener modell helyett− Action-contribution modell− Absztraktabb modell− Több eseményforrás egységes, központi

feldolgozása (pl. ablak bezárása több helyről)− 3 alapvetés

● A felhasználói akciók gombokat, menüket, toolbarokat érintenek

● Minden komponenshez egy eseményt rendelünk● Minden eseményhez egy kezelő lesz

Page 10: Nyílt Fejlesztőrendszerek JFace

10Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Eseménykezelés

Event-Listener modell helyett− Action-contribution modell− Absztraktabb modell− Több eseményforrás egységes, központi

feldolgozása (pl. ablak bezárása több helyről)− 3 alapvetés

● A felhasználói akciók gombokat, menüket, toolbarokat érintenek

● Minden komponenshez egy eseményt rendelünk● Minden eseményhez egy kezelő lesz

Page 11: Nyílt Fejlesztőrendszerek JFace

11Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Akciók

Hasonló az event-ekhez A Display elkapja az OS eseményt, a window

Action-né alakítja A Contribution-hoz kerül, mely meghívja az

akció run() metódusát

Page 12: Nyílt Fejlesztőrendszerek JFace

12Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Contribution

ContributionItem− Akciót eredményező GUI elem− ActionContributionItem

● Nincs konkrét megjelenés, a fill() kitöltésétől függ● Ezt használjuk a leggyakrabban

Page 13: Nyílt Fejlesztőrendszerek JFace

13Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Contribution

ContributionManager− Item-eket fogadó konténer elem

● Menu menedzser● Toolbar menedzser

Page 14: Nyílt Fejlesztőrendszerek JFace

14Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Action

public class MyAction extends Action {

StatusLineManager smanager;

int trigger = 0;

public MyAction(StatusLineManager sm){

super("&Click",AS_PUSH_BUTTON);

smanager= sm;

setToolTipText("Klikk ide!");

}

public void run() {

trigger++;

smanager.setMessage(trigger+" alkalommal kattintottál.");

}

}

Page 15: Nyílt Fejlesztőrendszerek JFace

15Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Action

public class MyAction extends Action {

StatusLineManager smanager;

int trigger = 0;

public MyAction(StatusLineManager sm){

super("&Click",AS_PUSH_BUTTON);

smanager= sm;

setToolTipText("Klikk ide!");

}

public void run() {

trigger++;

smanager.setMessage(trigger+" alkalommal kattintottál.");

}

}

Az Action osztályból örököltetjük

Page 16: Nyílt Fejlesztőrendszerek JFace

16Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Action

public class MyAction extends Action {

StatusLineManager smanager;

int trigger = 0;

public MyAction(StatusLineManager sm){

super("&Click",AS_PUSH_BUTTON);

smanager= sm;

setToolTipText("Klikk ide!");

}

public void run() {

trigger++;

smanager.setMessage(trigger+" alkalommal kattintottál.");

}

}

Megadjuk a szöveget és a kontroll stílusát

Page 17: Nyílt Fejlesztőrendszerek JFace

17Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Action

public class MyAction extends Action {

StatusLineManager smanager;

int trigger = 0;

public MyAction(StatusLineManager sm){

super("&Click",AS_PUSH_BUTTON);

smanager= sm;

setToolTipText("Klikk ide!");

}

public void run() {

trigger++;

smanager.setMessage(trigger+" alkalommal kattintottál.");

}

}

Tooltip is megadható (mindenhol érv.)

Page 18: Nyílt Fejlesztőrendszerek JFace

18Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Action

public class MyAction extends Action {

StatusLineManager smanager;

int trigger = 0;

public MyAction(StatusLineManager sm){

super("&Click",AS_PUSH_BUTTON);

smanager= sm;

setToolTipText("Klikk ide!");

}

public void run() {

trigger++;

smanager.setMessage(trigger+" alkalommal kattintottál.");

}

}

Az akció végrehajtása

Page 19: Nyílt Fejlesztőrendszerek JFace

19Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Action felhasználása

public class MyApp extends ApplicationWindow {public MyApp(){

super(null);addStatusLine();addMenuBar();addToolBar(SWT.FLAT | SWT.WRAP);

}StatusLineManager sline = new StatusLineManager();MyAction act = new MyAction(sline);ActionContributionItem aci = new ActionContributionItem(act);protected Control createContents(Composite parent) {

getShell().setText("Action example");aci.fill(parent);parent.pack();return parent;}

Page 20: Nyílt Fejlesztőrendszerek JFace

20Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Action felhasználása

public class MyApp extends ApplicationWindow {public MyApp(){

super(null);addStatusLine();addMenuBar();addToolBar(SWT.FLAT | SWT.WRAP);

}StatusLineManager sline = new StatusLineManager();MyAction act = new MyAction(sline);ActionContributionItem aci = new ActionContributionItem(act);protected Control createContents(Composite parent) {

getShell().setText("Action example");aci.fill(parent);parent.pack();return parent;}

Létrehozunk egy Action példányt

Page 21: Nyílt Fejlesztőrendszerek JFace

21Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Action felhasználása

public class MyApp extends ApplicationWindow {public MyApp(){

super(null);addStatusLine();addMenuBar();addToolBar(SWT.FLAT | SWT.WRAP);

}StatusLineManager sline = new StatusLineManager();MyAction act = new MyAction(sline);ActionContributionItem aci = new ActionContributionItem(act);protected Control createContents(Composite parent) {

getShell().setText("Action example");aci.fill(parent);parent.pack();return parent;}

Az ablakra dobjuk az akciót

Page 22: Nyílt Fejlesztőrendszerek JFace

22Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Action felhasználása folyt.

protected MenuManager createMenuManager(){

MenuManager main_menu = new MenuManager(null);MenuManager action_menu = new MenuManager("Menu");main_menu.add(action_menu);action_menu.add(act);return main_menu;

}protected ToolBarManager createToolBarManager(int style){

ToolBarManager tool_bar_manager = new ToolBarManager(style);

tool_bar_manager.add(act);return tool_bar_manager;

}protected StatusLineManager createStatusLineManager(){

return sline;}

Page 23: Nyílt Fejlesztőrendszerek JFace

23Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Action felhasználása folyt.

protected MenuManager createMenuManager(){

MenuManager main_menu = new MenuManager(null);MenuManager action_menu = new MenuManager("Menu");main_menu.add(action_menu);action_menu.add(act);return main_menu;

}protected ToolBarManager createToolBarManager(int style){

ToolBarManager tool_bar_manager = new ToolBarManager(style);

tool_bar_manager.add(act);return tool_bar_manager;

}protected StatusLineManager createStatusLineManager(){

return sline;}

Egy menüt hozunk létre, amibe szintén beledobjuk az Action-t

Page 24: Nyílt Fejlesztőrendszerek JFace

24Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Action felhasználása folyt.

protected MenuManager createMenuManager(){

MenuManager main_menu = new MenuManager(null);MenuManager action_menu = new MenuManager("Menu");main_menu.add(action_menu);action_menu.add(act);return main_menu;

}protected ToolBarManager createToolBarManager(int style){

ToolBarManager tool_bar_manager = new ToolBarManager(style);

tool_bar_manager.add(act);return tool_bar_manager;

}protected StatusLineManager createStatusLineManager(){

return sline;}

Hozzáadjuk egy toolbar-hoz is

Page 25: Nyílt Fejlesztőrendszerek JFace

25Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Action-Contribution

Az akciók és contribution-ök összekötése− A contrib. Manager add() függvénye

● add(ActionContributionItem) – explicit item-ként való hozzáadás - csak egyszer!

● add(Action) – akció implicit hozzáadása – többször is lehet!

− Az Action fill() függvénye segíségével● fill(Composite) – dialógus elem lesz● fill(MenuManager, int) – menü elem lesz (adott

pozícióban● fill(ToolBarManager, int) – toolbar elem lesz (Adott

pozícióban)

Page 26: Nyílt Fejlesztőrendszerek JFace

26Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Action – további jellemzők

Alapvető függvények− setText(), setImage(), setTooltipText(),

setDescription(), setEnabled()…

Checkbox, radio esetén− setChecked(), isChecked()

Gyorsbilentyűk− setAccelerator(), getAccelerator(), …

Page 27: Nyílt Fejlesztőrendszerek JFace

27Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Szövegkezelés JFace-szel

IDocument− A szerkesztés alatt álló dokumentum tartalma− A tartalom változásról értesítés kérhető− Position – egy hely megjelölése

● Kezdőérték + hossz● Ha a szöveget szerkesztik, automatikusan „követi”

a jelölt részt

− Partition content-type● A szöveg egyes részei más-más típusúak lehetnek

Page 28: Nyílt Fejlesztőrendszerek JFace

28Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Szövegkezelés JFace-szel

IDocument− Keresés

● Irány● Kezdőpont● case sensitivity, …

Page 29: Nyílt Fejlesztőrendszerek JFace

29Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Szövegkezelés JFace-szel

ITextViewer− Dokumentum-alapú szöveg komponens− Események

● Tartalom változás● Viewport (látható régió) változás

− Plugin lehetőségek● IUndoManager – undo/redo kezelés● IDoubleClickStrategy – duplakatt kezelés● IAutoIdentStrategy – automatikus behúzás● ITextHover – ha az egér megáll a szövegen

Page 30: Nyílt Fejlesztőrendszerek JFace

30Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Szövegkezelés JFace-szel

ITextViewer kiegészítések− org.eclipse.jface.text.contentassist

● Automatikus szöveg-kiegészítés− org.eclipse.jface.text.formatter

● Automatikus formázás (syntax highlight)− org.eclipse.jface.text.presentation

● Változás esetén− org.eclipse.jface.text.source

● Vizuális markerek elhelyezése− …

Page 31: Nyílt Fejlesztőrendszerek JFace

31Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

ToolBarManager

JFace elem− Action-öket fogadhat− ToolBar és ToolItem segíségével működik− ControlContribution – új!

● Bármilyen kontrollt feltehetünk● Ebben az esetben Action helyett event/listener

modell van!

Page 32: Nyílt Fejlesztőrendszerek JFace

32Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

MenuManager

JFace elem− Action-öket fogadhat− Belül Menu és MenuItem példányok vannak− SWT MenuBar-ba is berakható (fill)− new MenuManager(„File)

● MenuManager.add(Action)● MenuManager.fill(Control)

Ha hozzáadtuk egy kontrollhoz, többet ne adjuk hozzá máshoz!

Page 33: Nyílt Fejlesztőrendszerek JFace

33Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Viewer framework

Többféle widget egységes kezeléseMVC pattern

− Model: ContentProvider, LabelProvider− View : Viewer− Controller: Listeners

Magasabb szintre emeli az SWT Table, Tree, List elemeit

Page 34: Nyílt Fejlesztőrendszerek JFace

34Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Viewer framework

Page 35: Nyílt Fejlesztőrendszerek JFace

35Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Viewer framework

Label provider− getText()− getImage()− isLabelProperty()

● Érinti-e a label-t az adott tulajdonság megváltozása?

− Alap megvalósítás● A benne lévő elemek toString() metódusával

működik

Page 36: Nyílt Fejlesztőrendszerek JFace

36Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Viewer framework

Content provider− A megjelenítendő elemeket adja meg− getElements()− Nem kötelező használni

● Az elemeket hozzáadhatjuk az add metódussal a viewerhez

− inputChanged(Viewe, Object, Object) a root objektum megváltozott

Page 37: Nyílt Fejlesztőrendszerek JFace

37Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Viewer framework

Listener-ek− Függ a viewer típusától− TreeView

● ItemSelection● Fa események

− StructuredViewer● doubleClick

Page 38: Nyílt Fejlesztőrendszerek JFace

38Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Viewer framework

Sorter-ek− Elemek rendezése megjelenítés előtt− category()

● Elemek kategóriákba sorolása− compare()

● Két elem összehasonlítása

Filter− Elemek leválogatása, szelektálása− select()

● Meg kell-e jeleníteni egy adott elemet

Page 39: Nyílt Fejlesztőrendszerek JFace

39Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Viewer framework

TreeViewer− ITreeContentProvider-alapú

● A megjelenítendő elemeket adja meg● getChildren() – adott elem gyerekeinek

megjelenítése● hasChildren() – vannak-e gyerekei?

Ha lassú kiszámolni, mindig legyen true

● getParent() – szülő visszaadása

Page 40: Nyílt Fejlesztőrendszerek JFace

40Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Viewer framework

ListViewer− Elemek listájának megjelenítésére− IStructuredContentProvider

● A megjelenítendő elemeket adja meg● getElements() – a lista elemeit adja vissza

− Minden egyéb elem használható● Sorter● Filter● Label provider

Page 41: Nyílt Fejlesztőrendszerek JFace

41Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Viewer framework

Kiválasztott elemek− IStructuredSelection

● Az elemeknek kötött sorrendje van● Biztosít egy iterator-t, hogy végig lépkedhessünk

rajtuk

Page 42: Nyílt Fejlesztőrendszerek JFace

42Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Viewer framework

TableViewer− Táblázat magasabb szinten− TableLayout – a tábla oszlopainak

elrendezése● addColumnData()

− A mögötte lévő Table elérhető● getTable()

− ITableLabelProvider● Adott sor és oszlop tartalmát adja meg

Page 43: Nyílt Fejlesztőrendszerek JFace

43Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Viewer framework

Táblázatok szerkesztése− CellEditor

● ICellModifier Érték elővétele az objektumból – getValue() A szerkeszthetőség eldöntése – canModify() Új érték beírása – modify()

● CellEditor Beépített: Checkbox, Combo box, pop-up dialog, text

Page 44: Nyílt Fejlesztőrendszerek JFace

44Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

JFace dialógusok

MessageDialog− Üzenetek megjelenítése

ErrorDialog− Hibaüzenetek megjelenítése− IStatus – a hiba súlyosságának megadása,

üzenet, exception megadásaInputDialog

− Egyszerű szöveg bevitelére− IInputValidator – a bevitt szöveg

érvényesítése

Page 45: Nyílt Fejlesztőrendszerek JFace

45Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

JFace dialógusok

ProgressDialog− Háttérben futó munka állapotának

megjelenítése

Page 46: Nyílt Fejlesztőrendszerek JFace

46Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Varázslók

3 szintű hierarchia− WizardContainer – varázslókat tartalmaz− Wizard – oldalakat tartalmaz

● canFinish()● performCancel(), performFinish()● createPageControls()

− WizardPage – elemeket tartalmaz● getName()● getNextPage(), getPreviousPage()● isPageComplete()● canFlipToNextpage()

Page 47: Nyílt Fejlesztőrendszerek JFace

47Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

DialogSettings

Dialógus beállításainak megőrzése− DialogSettings(String)− put(String, Object)− save(String)− load(String)− get(String)− get*(String)

Page 48: Nyílt Fejlesztőrendszerek JFace

48Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

JFace összefoglalás

Komplex komponensekSok automatizmusÖsszetett grafikus felületek tervezésére

− Akciók− View framework− Dialógusok− Varázslók− GUI állapot mentése

Page 49: Nyílt Fejlesztőrendszerek JFace

49Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Plug-in fejlesztés

Page 50: Nyílt Fejlesztőrendszerek JFace

50Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Plug-in fejlesztés

Contribution rule− „everything is a contribution”

Az Eclipse keretrendszer minden eleme egy plug-in

Nincsenek „bevasalt” elemek− Sok plug-in (kb. 60 nagyobb az alap SDK-

ban)− Még több lehetséges bővítés (pl. WSAD kb.

500 plug-in)

Page 51: Nyílt Fejlesztőrendszerek JFace

51Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Plug-in fejlesztés

Plug-in kezelés− Ha több ezer plug-int kell kezelni, kérdéses a

teljesítmény− Jó lenne csak az éppen használtakkal törődni

Eredmény: Lazy loading rule− „Contributions are only loaded when theyare

needed.”

Page 52: Nyílt Fejlesztőrendszerek JFace

52Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Plug-in kezelés

Dilemma− Nem akarjuk az összes plug-in-t betölteni,− De tudni akarjuk, hogy mely plug-in-ok

elérhetőek

Megoldás− Deklaráció/implementáció szétválasztása

● Csak a plug-inok jellemzőit olvassuk be● Ez alapján már tudjuk, hogy milyen szolgáltatások

érhetőek el

Page 53: Nyílt Fejlesztőrendszerek JFace

53Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Plug-in elemek

Alapelemek− Erőforrások

● Ikonok● Képek

− Java kód jar állományban● A plug-in megvalósítása

− plugin.xml● A manifesztum, a plug-in által megvalósított

elemek leírása− manifest.mf

● Új elem, OSGi leírás

Page 54: Nyílt Fejlesztőrendszerek JFace

54Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

plugin.xml

Plugin ID− A plug-in egyedi azonosítására szolgál

Plugin name− Beszédes név

Verzió− Szám.szám.szám alakban− Kötelező, mert a függőségek kezelésében is szerepet

kap

Provider− A plug-in készítőjének neve

Page 55: Nyílt Fejlesztőrendszerek JFace

55Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

plugin.xml

Függőségek− Mely plug-inok mely verziója szükséges a

működéshez

Extension-ök− plug-in által hozzáadott elemek− Hivatkozva egy már létező plug-in egy

extension point-jára

Page 56: Nyílt Fejlesztőrendszerek JFace

56Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Manifest.mf

Open Services Gateway Initiative (OSGi) szabvány szerint

A név, id, szerző adataiA függőségek leírásaKerül beleAmi benne van, azt nem kell megismételni

a plugin.xml-benCsak Eclipse 3.0-tól működik

Page 57: Nyílt Fejlesztőrendszerek JFace

57Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello action

<plugin> <extension point="org.eclipse.ui.actionSets"> <actionSet id="hu.bme.mit.eclipse.plugins.

helloworld.actionSet" label="Hello Action Set" visible="true"> <action id="hu.bme.mit.eclipse.plugins.

helloworld.actions.HelloAction" label="Hello Action" </actionSet> </extension></plugin>

Page 58: Nyílt Fejlesztőrendszerek JFace

58Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello action

<plugin> <extension point="org.eclipse.ui.actionSets"> <actionSet id="hu.bme.mit.eclipse.plugins.

helloworld.actionSet" label="Hello Action Set" visible="true"> <action id="hu.bme.mit.eclipse.plugins.

helloworld.actions.HelloAction" label="Hello Action" </actionSet> </extension></plugin>

A kiegészítendő pont

Page 59: Nyílt Fejlesztőrendszerek JFace

59Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello action

<plugin> <extension point="org.eclipse.ui.actionSets"> <actionSet id="hu.bme.mit.eclipse.plugins.

helloworld.actionSet" label="Hello Action Set" visible="true"> <action id="hu.bme.mit.eclipse.plugins.

helloworld.actions.HelloAction" label="Hello Action" </actionSet> </extension></plugin>

A kiegészítés saját id-je

Page 60: Nyílt Fejlesztőrendszerek JFace

60Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello action

<plugin> <extension point="org.eclipse.ui.actionSets"> <actionSet id="hu.bme.mit.eclipse.plugins.

helloworld.actionSet" label="Hello Action Set" visible="true"> <action id="hu.bme.mit.eclipse.plugins.

helloworld.actions.HelloAction" label="Hello Action" </actionSet> </extension></plugin>

A kiegészítés belső eleme

Page 61: Nyílt Fejlesztőrendszerek JFace

61Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Implementáció

Miután a deklaráció már adott, következhet az implementáció

Az extension point-ok általában adott interfészt implementáló elemet fogadnak

Az implementáló osztályt is paraméterként adjuk meg a plugin-xml-ben

Page 62: Nyílt Fejlesztőrendszerek JFace

62Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello action<plugin> <extension point="org.eclipse.ui.actionSets"> <actionSet id="hu.bme.mit.eclipse.plugins.helloworld.actionSet" label="Sample Action Set" visible="true"><action

class="hu.bme.mit.eclipse.plugins.helloworld.actions.SampleAction"

icon="icons/sample.gif"

id="hu.bme.mit.eclipse.plugins.helloworld.actions.HelloAction" label="Hello Action" toolbarPath="sampleGroup" tooltip="Hello, Eclipse world"/> </actionSet> </extension>

</plugin>

Page 63: Nyílt Fejlesztőrendszerek JFace

63Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello action<plugin> <extension point="org.eclipse.ui.actionSets"> <actionSet id="hu.bme.mit.eclipse.plugins.helloworld.actionSet" label="Sample Action Set" visible="true"><action

class="hu.bme.mit.eclipse.plugins.helloworld.actions.SampleAction"

icon="icons/sample.gif"

id="hu.bme.mit.eclipse.plugins.helloworld.actions.HelloAction" label="Hello Action" toolbarPath="sampleGroup" tooltip="Hello, Eclipse world"/> </actionSet> </extension>

</plugin>

Osztály megadása

Page 64: Nyílt Fejlesztőrendszerek JFace

64Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello action<plugin> <extension point="org.eclipse.ui.actionSets"> <actionSet id="hu.bme.mit.eclipse.plugins.helloworld.actionSet" label="Sample Action Set" visible="true"><action

class="hu.bme.mit.eclipse.plugins.helloworld.actions.SampleAction"

icon="icons/sample.gif"

id="hu.bme.mit.eclipse.plugins.helloworld.actions.HelloAction" label="Hello Action" toolbarPath="sampleGroup" tooltip="Hello, Eclipse world"/> </actionSet> </extension>

</plugin>

A toolbaron jelenjen meg az adott csoportban

Page 65: Nyílt Fejlesztőrendszerek JFace

65Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Fontos szabály

Sharing rule− „Add, don’t replace”

Amikor egy új elemet készítünk, az éljen együtt a már meglévő, mások által készített elemekkel

Ne akarjuk kizárni a többi plugint

Page 66: Nyílt Fejlesztőrendszerek JFace

66Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello actionpublic class SampleAction implements

IWorkbenchWindowActionDelegate {private IWorkbenchWindow window;public SampleAction() {}public void init(IWorkbenchWindow window) {

this.window = window;}public void run(IAction action) {

MessageDialog.openInformation(window.getShell(),"HelloWorldPlugin Plug-in","Hello, Eclipse world");

}

public void selectionChanged(IAction action, ISelection selection) {}public void dispose() {}

}

Page 67: Nyílt Fejlesztőrendszerek JFace

67Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello actionpublic class SampleAction implements

IWorkbenchWindowActionDelegate {private IWorkbenchWindow window;public SampleAction() {}public void init(IWorkbenchWindow window) {

this.window = window;}public void run(IAction action) {

MessageDialog.openInformation(window.getShell(),"HelloWorldPlugin Plug-in","Hello, Eclipse world");

}

public void selectionChanged(IAction action, ISelection selection) {}public void dispose() {}

}

Interfész, amit a workbench ablakba publikált akcióknak meg kell valósítani

Page 68: Nyílt Fejlesztőrendszerek JFace

68Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello actionpublic class SampleAction implements

IWorkbenchWindowActionDelegate {private IWorkbenchWindow window;public SampleAction() {}public void init(IWorkbenchWindow window) {

this.window = window;}public void run(IAction action) {

MessageDialog.openInformation(window.getShell(),"HelloWorldPlugin Plug-in","Hello, Eclipse world");

}

public void selectionChanged(IAction action, ISelection selection) {}public void dispose() {}

}

Inicializálás, megmondják melyik ablakhoz tartozunk

Page 69: Nyílt Fejlesztőrendszerek JFace

69Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello actionpublic class SampleAction implements

IWorkbenchWindowActionDelegate {private IWorkbenchWindow window;public SampleAction() {}public void init(IWorkbenchWindow window) {

this.window = window;}public void run(IAction action) {

MessageDialog.openInformation(window.getShell(),"HelloWorldPlugin Plug-in","Hello, Eclipse world");

}

public void selectionChanged(IAction action, ISelection selection) {}public void dispose() {}

}

Végrehajtjuk az akciót

Page 70: Nyílt Fejlesztőrendszerek JFace

70Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello actionpublic class SampleAction implements

IWorkbenchWindowActionDelegate {private IWorkbenchWindow window;public SampleAction() {}public void init(IWorkbenchWindow window) {

this.window = window;}public void run(IAction action) {

MessageDialog.openInformation(window.getShell(),"HelloWorldPlugin Plug-in","Hello, Eclipse world");

}

public void selectionChanged(IAction action, ISelection selection) {}public void dispose() {}

}

Egyéb metódusok…

Page 71: Nyílt Fejlesztőrendszerek JFace

71Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Implementáció

Az extension point-ok általában adott interfészt implementáló elemet fogadnak

Conformance rule− „Contributions must conform to expected

interfaces”

Különben baj lesz…Honnan tudjuk mit vár az extension point?

− Fejlesztői dokumentáció (Help)

Page 72: Nyílt Fejlesztőrendszerek JFace

72Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Implementáció

Plugin osztály− A plugin életciklusát kezeli (ha kell)− start()− stop()− getDefault()− Képek, egyéb erőforrások betöltése− A plug-in leállásakor a foglalt erőforrások

felszabadítása− Közös adatok kezelése (beállítások, dialógus

adatok)

Page 73: Nyílt Fejlesztőrendszerek JFace

73Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Hogy kezdjünk hozzá?

Monkey see/monkey do rule− „Always copy the structure of a similar plug-in”

A már bevált receptet kell alkalmazni− Egyszerű plug-inokhoz van template wizard

Relevance rule− „Contribute only when you can successfully

operate”− Csak olyankor jelenjen meg a hozzáadott

elem, ha használható

Page 74: Nyílt Fejlesztőrendszerek JFace

74Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Extension point-ok

Safe platform rule− „As the provider of an extension point, you

must protect yourself against misbehavior on the part of extenders”

A felkínált kiegészítési pontnak biztonságosnak kell lenni, még a kiegészítés hibája esetén is!

Invitation rule− „Whenever possible, let others contribute to

your contributions”

Page 75: Nyílt Fejlesztőrendszerek JFace

75Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Extension point-ok

Fair play rule− „All clients play by the same rules, even me.”− Ne legyen saját „hátsó bejárat”, rejtett

interfészExplicit Extension Rule

− „Declare explicitly where a platform can be extended”

− A deklaráció a plugin.xml-benDiversity Rule

− „Extension points accept multiple extensions”

Page 76: Nyílt Fejlesztőrendszerek JFace

76Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello action <extension-point id="nativefunction" name="Native Function

Extension Point" schema="schema/nativefunction.exsd"/>

Page 77: Nyílt Fejlesztőrendszerek JFace

77Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello action <extension-point id="nativefunction" name="Native Function

Extension Point" schema="schema/nativefunction.exsd"/>

Extension point definiálása a plugin.xml fájlban

Page 78: Nyílt Fejlesztőrendszerek JFace

78Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello action <extension-point id="nativefunction" name="Native Function

Extension Point" schema="schema/nativefunction.exsd"/>

Séma fájl (megengedett xml elemek)

Page 79: Nyílt Fejlesztőrendszerek JFace

79Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Extension point-ok

Hogyan kérdezhetjük le a ponthoz tartozó kiegészítéseket?− Platform.getExtensionRegistry()− IExtensionRegistry.getExtensionPoint(String)− IExtension[] IExtensionPoint.getExtensions()− IExtension.getConfigurationElements()

● Az adott elem attribútumait, gyerekeit tartalmazza● Validáció kérhető

Page 80: Nyílt Fejlesztőrendszerek JFace

80Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Extension point-ok

Hogyan példányosítjuk a megadott osztályt?− Csak egy osztálynév van− A mi classloader-ünk nem találhatja meg,

mert nincs a függő plugin-ok listáján− Nem is biztos, hogy kívülről látszik az osztály− Megoldás: kérjük meg az extension plug-in

saját classloader-ét, hogy végezze el a piszkos munkát!

● IConfigurationElement.createExecutableExtension(String)

Page 81: Nyílt Fejlesztőrendszerek JFace

81Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello actionpublic List<ASMNativeFunction> initNativeFunctionPlugins(){

IExtensionRegistry reg = Platform.getExtensionRegistry();IExtensionPoint poi =reg.getExtensionPoint(native_ext_id);ArrayList<ASMNativeFunction> ret=new

ArrayList<ASMNativeFunction>();

if (poi == null) return new Vector<ASMNativeFunction>();IExtension[] exts = poi.getExtensions();

for (int i=0;i<exts.length;i++) {IConfigurationElement[] el =

exts[i].getConfigurationElements();for (int j=0;j<el.length;j++) {try{

Object o =el[j].createExecutableExtension("class");if (o instanceof ASMNativeFunction){

ret.add((ASMNativeFunction) o);}

}catch (Exception e) {}}} return ret;}

Page 82: Nyílt Fejlesztőrendszerek JFace

82Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello actionpublic List<ASMNativeFunction> initNativeFunctionPlugins(){

IExtensionRegistry reg = Platform.getExtensionRegistry();IExtensionPoint poi =reg.getExtensionPoint(native_ext_id);ArrayList<ASMNativeFunction> ret=new

ArrayList<ASMNativeFunction>();

if (poi == null) return new Vector<ASMNativeFunction>();IExtension[] exts = poi.getExtensions();

for (int i=0;i<exts.length;i++) {IConfigurationElement[] el =

exts[i].getConfigurationElements();for (int j=0;j<el.length;j++) {try{

Object o =el[j].createExecutableExtension("class");if (o instanceof ASMNativeFunction){

ret.add((ASMNativeFunction) o);}

}catch (Exception e) {}}} return ret;}

Elkérjük a registry-t

Page 83: Nyílt Fejlesztőrendszerek JFace

83Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello actionpublic List<ASMNativeFunction> initNativeFunctionPlugins(){

IExtensionRegistry reg = Platform.getExtensionRegistry();IExtensionPoint poi =reg.getExtensionPoint(native_ext_id);ArrayList<ASMNativeFunction> ret=new

ArrayList<ASMNativeFunction>();

if (poi == null) return new Vector<ASMNativeFunction>();IExtension[] exts = poi.getExtensions();

for (int i=0;i<exts.length;i++) {IConfigurationElement[] el =

exts[i].getConfigurationElements();for (int j=0;j<el.length;j++) {try{

Object o =el[j].createExecutableExtension("class");if (o instanceof ASMNativeFunction){

ret.add((ASMNativeFunction) o);}

}catch (Exception e) {}}} return ret;}

Elkérjük a mi extension point-unkat

Page 84: Nyílt Fejlesztőrendszerek JFace

84Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello actionpublic List<ASMNativeFunction> initNativeFunctionPlugins(){

IExtensionRegistry reg = Platform.getExtensionRegistry();IExtensionPoint poi =reg.getExtensionPoint(native_ext_id);ArrayList<ASMNativeFunction> ret=new

ArrayList<ASMNativeFunction>();

if (poi == null) return new Vector<ASMNativeFunction>();IExtension[] exts = poi.getExtensions();

for (int i=0;i<exts.length;i++) {IConfigurationElement[] el =

exts[i].getConfigurationElements();for (int j=0;j<el.length;j++) {try{

Object o =el[j].createExecutableExtension("class");if (o instanceof ASMNativeFunction){

ret.add((ASMNativeFunction) o);}

}catch (Exception e) {}}} return ret;}

Elkérjük a ponthoz tartozó aktuális extension-öket

Page 85: Nyílt Fejlesztőrendszerek JFace

85Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello actionpublic List<ASMNativeFunction> initNativeFunctionPlugins(){

IExtensionRegistry reg = Platform.getExtensionRegistry();IExtensionPoint poi =reg.getExtensionPoint(native_ext_id);ArrayList<ASMNativeFunction> ret=new

ArrayList<ASMNativeFunction>();

if (poi == null) return new Vector<ASMNativeFunction>();IExtension[] exts = poi.getExtensions();

for (int i=0;i<exts.length;i++) {IConfigurationElement[] el =

exts[i].getConfigurationElements();for (int j=0;j<el.length;j++) {try{

Object o =el[j].createExecutableExtension("class");if (o instanceof ASMNativeFunction){

ret.add((ASMNativeFunction) o);}

}catch (Exception e) {}}} return ret;}

Példányosítunk egy osztályt

Page 86: Nyílt Fejlesztőrendszerek JFace

86Budapest University of Technology and Economics

Fault-tolerant Systems Research Group

Példa: Hello actionpublic List<ASMNativeFunction> initNativeFunctionPlugins(){

IExtensionRegistry reg = Platform.getExtensionRegistry();IExtensionPoint poi =reg.getExtensionPoint(native_ext_id);ArrayList<ASMNativeFunction> ret=new

ArrayList<ASMNativeFunction>();

if (poi == null) return new Vector<ASMNativeFunction>();IExtension[] exts = poi.getExtensions();

for (int i=0;i<exts.length;i++) {IConfigurationElement[] el =

exts[i].getConfigurationElements();for (int j=0;j<el.length;j++) {try{

Object o =el[j].createExecutableExtension("class");if (o instanceof ASMNativeFunction){

ret.add((ASMNativeFunction) o);}

}catch (Exception e) {}}} return ret;}

Ellenőrizzük a megfelelő interfész meglétét