nyílt fejlesztőrendszerek jface
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 PresentationTRANSCRIPT
Budapest University of Technology and Economics
Fault-tolerant Systems Research Group
Nyílt FejlesztőrendszerekJFace
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ó
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}
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();
}
}
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
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)
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()
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
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
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
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
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
13Budapest University of Technology and Economics
Fault-tolerant Systems Research Group
Contribution
ContributionManager− Item-eket fogadó konténer elem
● Menu menedzser● Toolbar menedzser
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.");
}
}
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
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
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.)
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
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;}
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
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
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;}
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
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
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)
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(), …
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
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, …
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
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− …
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!
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!
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
34Budapest University of Technology and Economics
Fault-tolerant Systems Research Group
Viewer framework
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
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
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
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
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
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
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
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
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
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
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
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()
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)
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
49Budapest University of Technology and Economics
Fault-tolerant Systems Research Group
Plug-in fejlesztés
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)
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.”
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
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
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
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
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
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>
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
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
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
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
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>
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
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
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
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() {}
}
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
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
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
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…
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)
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)
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ó
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”
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”
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"/>
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
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)
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ő
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)
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;}
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
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
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
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
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