Eclipse plug-ins, RCP Eclipse plug-ins, Rich Client Platform
Eclipse Mi az Eclipse? Java IDE, IDE Framework, tools framework, application framework, Open Source enabler, közösség, alapítvány, stb. Eclipse SDK: Platform (http://eclipse.org/platform), Java Development Tools (http://eclipse.org/jdt), Plug-in Development Environment (http://eclipse.org/pde) Eclipse Platform: önmagában is komponensek halmaza, de egy-egy részhalmaz felhasználásával tetszőleges alkalmazások fejleszthetőek. Egy ilyen részhalmaz pl. az Eclipse RCP (Rich Client Platform) Az Eclipse Platform nem csak fejlesztői környezetek kiépítésére alkalmazható, bármilyen alkalmazást ráépíthetünk (pénzügyi alkalmazások, automatizálás, egészségügy stb.). Az Eclipse RCP segítségével készített alkalmazások kiválóan együttműködnek különböző alkalmazás vagy adatbázis szerverekkel és más backend rendszerekkel. Az Eclipse Platform előnye: plug-in rendszer, integrációs pontok. A ráépített alkalmazások együttműködhetnek más Eclipse alapú alkalmazásokkal. Pl. Platform+JDT=Java IDE, Platform+CDT=C/C++ IDE
Eclipse Eclipse: komponensek halmaza IDE komponensek Rich Client Platform (RCP) Eclipse Rich Server Platform (RSP): Update, Equinox
Példa Eclipse modul telepítése Quantum DB http://quantum.sourceforge.net/update-site
Eclipse modulok telepítése http://quantum.sourceforge.net/update-site
Quantum DB http://quantum.sourceforge.net/update-site
Qunatum DB http://quantum.sourceforge.net/update-site
Qunatum DB http://quantum.sourceforge.net/update-site
Eclipse Plug-in Plug-in: az Eclipse platformon belüli legkisebb önállóan fejleszthető/kiadható egység Az egyszerű funkcionalitásokat egy plug-in implementálhatja, a bonyolultabb funkcionalitásokat több plug-in összessége Az Eclipse kernel-en (Platform Runtime) kívül gyakorlatilag mindenik funkcionalitást plug-inok implementálják Plug-inok összekapcsolása és együttműködése: plug-in manifest: mindenik plug-in kiterjesztési pontokat (extension point) deklarál. Más plug-inok ezeken a kiterjesztési pontokon keresztül kapcsolódhatnak (kiterjesztve az illető plug-int). Pl. workbench user preferences extension point) Plug-in manifest: manifest.mf (OSGi manifest a runtime függőségek deklarációja), plugin.xml (a kiterjesztési pontok és kiterjesztések XML alapú leírása)
OSGi Open Services Gateway initiative OSGi Alliance 1999-ben alapított nonprofit szervezet Szolgáltatás orientált, komponens alapú környezet fejlesztők számára, amely szoftverek életciklusának managementjére biztosít standardizált lehetőségeket (elsősorban Java fejlesztések alapjául szolgálhat) Komplex szoftverek jelenleg a fejlesztésben nagyobb hangsúly helyeződik létező modulok beépítésére, létező funkcionalitások integrálására szükséges a standardizálás OSGi technology dynamic module system for Java standard eljárás komplex applikációk fejlesztésére kisebb (újra felhasználható és az együttműködést támogató) modulok integrációjával OSGi Specifications Core: OSGi Framework standardizált környezet a bundle-nek (batyu) nevezett alkalmazások számára L0: Execution Environment (Java environment) L1: Modules (class loading policies) L2: Life Cycle Management (dinamikusan telepíthető, inditható, leállítható, uninstallálható batyuk) L3: Service Registry (dinamikus együttműködési model a bundle-ök részére)
OSGi Standard Services Framework services Permission admin batyuk jogainak adminisztrálása Package admin batyuk export-import függőségi listája Start level URL handler System services Log service a keretrendszer közös naplója Configuration admin service Device access service driverek azonosítása és az azokat implementáló batyuk letöltése User admin service felhasználói információkat tartalmazó adatbázis IO connector service Preferences service Component runtime Deployment admin Event admin Application admin Protocol services HTTP service szervlettek futtatásához UPnP (Universal Plug and Play) service DMT (Device Management Tree) service Miscellaneous services XML parser service Foreign Application Access
OSGi bundle Bundle (batyu) az OSGi alapegysége csomagolási formátumot definiál. A batyu Jáva kódot, statikus erőforrásokat (pl. képek) és leírófájlt (manifest) tartalmaz. Java kódot exportálhat és importálhat, ezt Java csomagonként (package) teszi (megvalósítja a megosztott könyvtár funkcionalitását) futási egységként funkcionálhat (ez nem kötelező). jogok köthetők hozzá életciklusának változásai eseményeket generálnak, amikre más batyuk feliratkozhatnak és követhetik őket. service-eket regisztrálhat. A service service-eket regisztrálhat. A service elválasztja egymástól az interfészt és az implementációt, pl. különböző XML elemzők regisztrálhatnak XML elemző service-eket és a service tulajdonságai alapján lehet kiválasztani a megfelelő service-t, majd a kiválasztás alapján meghívni a szolgáltatást.
OSGi bundle Aktivizáló osztály: public class HelloWorld_Activator implements org.osgi.framework.bundleactivator { public void start(bundlecontext bc) {... } public void stop( BundleContext bc ) {... } } A BundleContext metódusai: Manifest: Bundle-Name: Helloworld Bundle-Version: 1.1 Bundle-Description: Hello, world Bundle-Vendor: FreeWare A keretrendszer eseményeire lehet feliratkozni Service-eket lehet regisztrálni Service-ekhez lehet hozzáférni Új batyukat lehet installálni A már installált batyukat le lehet kérdezni ill. hozzájuk lehet férni Bundle-Copyright: 'Copyleft (c) 1999-2002.' Bundle-Activator: example.osg.helloworld.helloworld_activator Import-Package: org.osgi.service.cm Export-Package: example.osg.exported_package A batyu saját Bundle objektumát meg lehet szerezni. A Bundle objektumon keresztül a batyut el lehet indítani/le lehet állítani, az állapotát le lehet kérdezni, a verzióját frissíteni lehet vagy el lehet távolítani. Hozzá lehet férni a batyuhoz rendelt saját könyvtárhoz. Itt lehet a batyu által írt/olvasott fájlokat tárolni.
OSGi services Szolgáltatás alapú architektúra: a batyuk objektumokat regisztrálhatnak a szolgáltatáskatalógusban (service registry). A regisztrált objektum egy szolgáltatás interfészt kell implementáljon és az objektum ezen interfész nevén kell regisztrálva legyen. Példa: szolgáltatás interfész kódja: public interface ServiceIf { public String message(); public void setmessage( String message ); } A szolgáltatás objektum implementálja ezt az interfészt: public class ServiceObject implements ServiceIf { public String message() {... } public void setmessage( String message ) {... } }
OSGi services A batyu regisztrálja a szolgáltatást (tipikusan a start() metódusban) void start( BundleContext bc ) {... serviceobject = new ServiceObject(); servicedictionary = (Dictionary)new Hashtable(); myserviceregistration = bc.registerservice( } ServiceIf.class.getName(), // szolgáltatásinterfész neve (Object)serviceObject, // maga a szolgáltatásobjektum servicedictionary ); // a szolgáltatás tulajdonságai (most üres)... A szolgáltatást ki kell regisztrálni a katalógusból, ha már nem elérhető (tipikusan a stop() metódusban). myserviceregistration.unregister(); Ha valaki szolgáltatást akar használni, ismernie kell a szolgáltatásinterfész nevét. Ennek alapján a BundleContext két metódusával megszerezhető a szolgáltatás objektuma, amin aztán a szolgáltatás metódusai meghívhatók. BundleContext bc; // Elmenthetı pl. a start metódusban ServiceReference sr = bc.getservicereference( ServiceIf.class.getName() ); ServiceIf so = (ServiceIf)bc.getService( sr ); String s = so.message(); // Szolgáltatás hívása az interfészén keresztül
Equinox Az Eclipse OSGi R4 specifikáción alapuló komponens modellje Komponens == Bundle (batyu) == Plug-in Verzió számmal rendelkező (versioned) Deklaratívan definiált Dinamikus load/unload lehetőséget biztosít Dinamikus install/update lehetőséget biztosít Explicit módon definiál Függőségeket Runtime visibility Kölcsönhatások (kiterjesztési pontok, kiterjesztések) A komponensek interferenciák nélkül integrálhatóak, egymást nem akadályozzák, mivel az egymással nem összefüggő komponenseknek nincsen direkt hozzáférésük egymáshoz
Workbench Alapvető kiterjesztési pontok:
Példa plug-in készítése Hello world plug-in Hello World View az org.eclipse.ui.workbench plug-in definiálja a workbench API publikus interfészeit, ezek az org.eclipse.ui csomagban találhatóak Példánkban az IViewPart interfészt használjuk, és ennek default implementációját a ViewPart osztályt New project Plug-in project Templates Plug-in with a view View Features uncheck all of the boxes (no extra features needed)
HelloWorldView.java package com.example.helloworld; import org.eclipse.swt.widgets.composite; import org.eclipse.swt.widgets.label; import org.eclipse.swt.swt; import org.eclipse.ui.part.viewpart; public class HelloWorldView extends ViewPart { Label label; public HelloWorldView() { } public void createpartcontrol(composite parent) { label = new Label(parent, SWT.WRAP); label.settext("hello World"); } public void setfocus() { // set focus to my widget. //For a label, this doesn't make much sense, but for more complex //sets of widgets you would decide which one gets the focus. } }
HelloWorld manifest plugin.xml <?xml version="1.0" encoding="utf-8"?> <?eclipse version="3.0"?> <plugin> <extension point="org.eclipse.ui.views"> <category name="hello Category" id="com.example.helloworld"> </category> <view name="hello View" icon="icons/sample.gif" category="com.example.helloworld class="com.example.helloworld.helloworldview" id="com.example.helloworld.helloworldview"> </view> </extension> </plugin>
Rich Client A rich client egy alkalmazás ami az operációs rendszernek megfelelő GUI-t és ablakrendszert használja. Alapvető tulajdonságok: Nativ widgets (eszközök) Drag and drop Integration with the platform component model Stb. Standalone Rich Client: Rich user experience Platformfüggetlenség Komponens modell Integrált update mechanizmus Kiterjeszthetőség Two-tier (kétrészes) Rich Client közvetlen kapcsolat egy adatbázissal JDBC hozzáférés az adatbázishoz EMF (Ecipse Modelling Framework) hozzáférés XMI (XML Metadata Interchange) / XML (Extensible Markup Language) adatokhoz Stb.
Rich Client Three-tier Rich Client A business logika egy része távoli rendszeren tárolt Hozzáférés a távoli rendszerhez (web service vagy más mechanizmus) WSDL (Web Service Definition Language) alapú web szolgáltatások, IIOP (Internet Inter-Orb Protocoll), ECF (Eclipse Communication Framework) stb. Kombinált Rich Client Különböző adatforrások A távoli rendszeren tárolt adatok lokális cache-elése offline feldolgozásra
Rich Client or Thin Clients? Thin Client Alkalmi felhasználó, aki nem akar szoftvert installálni Online banking, auction browsing stb. Rich Client Tapasztalt felhasználó (power user), aki megbízható, sok funkcionalitással rendelkező (rich) alkalmazást, felhasználói felszínt szeretne Bank pénztáros, bank manager, stb. Eclipse alapú RC alkalmazás példa: Lotus Notes Hannover
Rich Client Platform A Rich Client Platform használatának előnyei: Általános szolgáltatások Native look and feel Window management Standardizált komponens modell (Equinox) Kiterjeszthetőség (kiterjesztési regiszter) Update manager Eszközök RC alkalmazások fejlesztéséhez A fejlesztő a core alkalmazásra koncentrálhat Nem kell feltalálni a kereket Könnyen megoldható teljesen független komponensek integrációja Különböző komponenseknek megfelelő view-ek megoszthatják a workspace-t A menüket több különböző komponens is feltöltheti Komponensek közötti drag and drop Stb. Az RCP alkalmazások a platformhoz kapcsolódó (plug-in) komponensekből állnak
Eclipse Platform Az Eclipse Platform UI a workbench köré épül, a workbench API alapja két eszköztár: SWT (Standard Widget Toolkit) a native ablakrendszerrel integrált grafikus widget (eszköz) halmaz, ami OS-független API-t biztosít JFace SWT-ben implementált UI eszköztár, ami egyszerűsíti az UI programozást
SWT Egy tipikus különálló (standalone) SWT alkalmazás struktúrája: Létrehoz egy Display objektumot (az SWT session) Létrehoz egy vagy több Shell objektumot (az alkalmazás központi ablaka(i)) A shell-en belül létrehozza a szükséges widget-eket Beállítja a widget-ek állapotát (méret stb.) és hozzájuk rendeli a szükséges esemény figyelőket Megnyitja a shell-t és elindítja az event figyelő ciklust, ami mindaddig fut, ameddig a shell-t be nem zárjuk, majd zárja a display-t public static void main (String [] args) { Display display = new Display (); Shell shell = new Shell (display); Label label = new Label (shell, SWT.CENTER); label.settext ("Hello_world"); label.setbounds (shell.getclientarea ()); shell.open (); while (!shell.isdisposed ()) { if (!display.readanddispatch ()) display.sleep (); } display.dispose (); } Composite widgets Style bits widget-ek tulajdonságai (ált. a konstruktor paraméterei), az SWT osztályban definiált konstansok (mindenik widget részére)
SWT - Controls Control widget, amit bárhol elhelyezhetünk a widget-ek parent/child hierarchiáján belül Az alapvető Control widget-ek az org.eclipse.swt.widgets csomag tartalmazza Widget Browser Button Canvas Caret Combo Composite CoolBar CoolItem ExpandBar ExpandItem Group Label Link List Purpose Control containing a native HTML renderer. Selectable control that issues notification when pressed and/or released. Composite control that provides a surface for drawing arbitrary graphics. Often used to implement custom controls. An i-beam that is typically used as the insertion point for text. Selectable control that allows the user to choose a string from a list of strings, or optionally type a new value into an editable text field. Control that is capable of containing other widgets. Composite control that allows users to dynamically reposition the cool items contained in the bar. Selectable user interface object that represents a dynamically positionable area of a cool bar. Composite control that groups pages that can be shown or hidden by the user with labeled headers. Selectable user interface object corresponding to a header for a page in an ExpandBar. Composite control that groups other widgets and surrounds them with an etched border and/or label. Non-selectable control that displays a string or an image. Selectable control that displays a text with links. Selectable control that allows the user to choose a string or strings from a list of strings.
SWT - Controls Widget Menu MenuItem ProgressBar Sash Scale ScrollBar Shell Slider Spinner TabFolder TabItem Table TableColumn TableItem Text ToolBar ToolItem Tree TreeColumn TreeItem Purpose User interface object that contains menu items. Selectable user interface object that represents an item in a menu. Non-selectable control that displays progress to the user, typically in the form of a bar graph. Used to allow users to resize child widgets by repositioning their dividing line. Selectable control that represents a range of numeric values. Used in a Composite that has V_SCROLL and/or H_SCROLL styles. Window that is managed by the OS window manager. Selectable control that represents a range of numeric values. Selectable control that allows the user to enter and modify numeric values. Composite control that groups pages that can be selected by the user using labeled tabs. Selectable user interface object corresponding to a tab for a page in a tab folder. Selectable control that displays a list of table items that can be selected by the user. Items are presented in rows that display multiple columns representing different aspects of the items. Selectable user interface object that represents a column in a table. Selectable user interface object that represents an item in a table. Editable control that allows the user to type text into it. Composite control that supports the layout of selectable tool bar items. Selectable user interface object that represents an item in a tool bar. Selectable control that displays a hierarchical list of tree items that can be selected by the user. Selectable user interface object that represents a column in a tree. Selectable user interface object that represents a hierarchy of tree items in a tree.
SWT - events Minden eseményhez tartozik egy osztály (XyzEvent) ami az illető eseményről tartalmaz információkat, egy megfelelő listener interface (XyzListener), és annak regisztrálásához szükséges metódus (addxyzlistener). Amennyiben a listener több metódust definiál egy adapter osztály (XyzAdapter) is hozzárendelődik. Az eseményekkel kapcsolatos interfészeket és osztályokat az org.eclipse.swt.events csomag tartalmazza Display display = new Display (); Shell shell = new Shell (display); Label label = new Label (shell, SWT.CENTER);... shell.addcontrollistener (new ControlAdapter () { public void controlresized (ControlEvent e) { label.setbounds (shell.getclientarea ()); } }); Untyped events: Shell shell = new Shell (); Listener listener = new Listener () { public void handleevent (Event e) { switch (e.type) { case SWT.Resize: System.out.println ("Resize received"); break; default: System.out.println ("Unknown event received"); } } }; shell.addlistener (SWT.Resize, listener);
SWT high level events Event Type Description Activate, Deactivate Generated when a Control is activated or deactivated. Arm A MenuItem is armed (highlighted and ready to be selected). Close A Shell is about to close as requested by the window manager. DefaultSelection The user selects an item by invoking a default selection action. (For ex Enter or double click) Dispose A widget is about to be disposed, either programmatically or by user. DragDetect The user has initiated a possible drag operation. EraseItem A TableItem or TreeItem is about to have its background drawn. Expand, Collapse An item in a Tree is expanded or collapsed. Help The user has requested help for a widget. Iconify, Deiconify A Shell has been minimized, maximized, or restored. MeasureItem The size of a custom drawn TableItem or TreeItem is being requested. MenuDetect The user has requested a context menu. Modify The widget's text has been modified. Move, Resize A control has changed position or has been resized, either programmatically or by user. PaintItem A TableItem or TreeItem is about to have its foreground drawn. Selection The user selects an item in the control. SetData Data needs to be set on a TableItem when using a virtual table. Settings An operating system property, such as a system font or color, has been changed. Show, Hide A control's visibility has changed. Traverse The user is trying to traverse out of the control using a keystroke. Verify A widget's text is about to be modified.
SWT low level events Event Type FocusIn, FocusOut KeyDown, KeyUp MouseDown, MouseUp, MouseDoubleClick MouseMove MouseEnter, MouseExit, MouseHover MouseWheel Paint A control has gained or lost focus. Description The user has pressed or released a keyboard key when the control has keyboard focus. The user has pressed, released, or double clicked the mouse over the control. The user has moved the mouse above the control. The mouse has entered, exited, or hovered over the control. The mouse wheel has been rotated. The control has been damaged and requires repainting.
SWT custom widgets Új speciális widge-ek létrehozása: Native implementáció Létező widget-ek kombinálása (a Composite widget felhasználásával) Tetszőleges kirajzolás (a Canvas vagy Composite widget-ek felhasználásával dispose event, paintlistener, redraw metódus) SWT grafika grafikus kontextus: GC (+ Font, FontData, Color, Image, ImageData, ImageLoader, PaletteData stb.) Az SWT kiterjesztések projekt Az SWT már hoz magával custom widget-eket, ezeket az org.eclipse.swt.custom csomag tartalmazza. CBanner CCombo Control Purpose CBanner is used in the workbench to layout the toolbar area and perspective switching toolbar. Similar to Combo, but is vertically resizable allowing it to fit inside table cells. CLabel CTabFolder CTabItem SashForm ScrolledComposite StyledText ViewForm Similar to Label, but supports shortening of text with an ellipsis. Similar to TabFolder, but supports additional configuration of the visual appearance of tabs Selectable user interface object corresponding to a tab for a page in a CTabFolder. Composite control that lays out its children in a row or column arrangement Composite control that scrolls its contents Editable control that allows the user to type text. ViewForm is used in the workbench to position and size a view's label/toolbar/menu local bar.
SWT - layouts Display display = new Display (); Shell shell = new Shell (display); Label label = new Label (shell, SWT.CENTER); shell.addcontrollistener (new ControlAdapter () { public void controlresized (ControlEvent e) { label.setbounds (shell.getclientarea ()); } }); Display display = new Display (); Shell shell = new Shell (display); Label label = new Label (shell, SWT.CENTER); shell.setlayout (new FillLayout ()); Standard SWT layout-ok: Layout FillLayout FormLayout GridLayout RowLayout Purpose Lays out controls in a single row or column, forcing them to be the same size. Using FormAttachments to optionally configure the left, top, right and bottom edges of each child. Positions the children by rows and columns. Places the children either in horizontal rows or vertical columns. Tetszőleges/speciális (custom) layout-ok implementálása: a computesize() és layout() metódusok implementálása
JFace Az SWT-re épülő UI eszköztár, ami komplexebb UI komponenseket és eszközöket tartalmaz, megkönnyítve az UI programozást: Viewers widget-ek feltöltése, rendezés, szűrés, update Actions and contributions user action definiálása Image and font registries UI erőforrások kezelés Dialogs and wizards - komplex felhasználói műveletek kezelése Field assist a felhasználó segítése a formok kitöltésénél (varázslók és dialog ablakok esetében) A workbench által deklarált kiterjesztési pontok nagy része a org.eclipse.jface csomag osztályait felhasználva implementált (de a workbench a JFace-től független)
JFace - Viewers Mindenikhez tartozik egy-egy megfelelő SWT widget gyakorlatilag a vieweek adapterek, amelyek implementálják a widget-ekkel kapcsolatos standard műveleteket ListViewer (SWT List), TreeViewer (SWT Tree), TableViewer (SWT Table, CellEditor, TextCellEditor, CheckboxCellEditor) és text viewer-ek (SWT StyledText) Lista orientált viewer-ek (list, table, tree): az elemeket egy ILabelProvider biztosítja, a felhasználó értesül az elemekkel kapcsolatos eseményekről (kijelölés, változás, stb.), szűrési (ViewerFilter) és rendezési (ViewerSorter) lehetőségek biztosítottak Viewer architektúra Bemeneti (input) elemek A tartalmat ContentProvider-ek szolgáltatják (IContentProvider, ILabelProvider) IColorProvider, IFontProvider, ILabelDecorator, stb. Workbench és viewer-ek: WorkbenchContentProvider, WorkbenchLabelProvider, IWorkbenchAdapter, IProject
JFace Actions and contributions: Az action osztályok lehetővé teszik felhasználói parancsok UI-tól független definiálását, a contribution osztályok feladata a parancsnak (action) megfelelő UI item-ek managelése Egy action (IAction) egy felhasználói parancsnak felel meg, implementálása az Action osztályból történő származtatással történhet (nem az interface közvetlen implementálásával) A felhasználói parancs megjelenésének pillanatában a megfelelő Action run() metódusa hívódik meg About action: public void run() { new AboutDialog(workbenchWindow.getShell()).open(); } Egy contribution (IContribution) egy Action UI rész Long running operations (org.eclipse.jface.operations) Workbench, Platform runtime: Platform runtime: IProgressService, IProgressMonitor JFace: IRunnableWithProgress, IProgressMonitor, IRunnableContext, stb. Field assist Decorated fields Content proposals... autoactivationcharacters = new char[] { '#', '(' }; keystroke = KeyStroke.getInstance("Ctrl+Space"); // assume that mytextcontrol has already been created in some way ContentProposalAdapter adapter = new ContentProposalAdapter( mytextcontrol, new TextContentAdapter(), new SimpleContentProposalProvider( new String [] {"ProposalOne", "ProposalTwo", "ProposalThree"}), keystroke, autoactivationcharacters);