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 • • • •
•
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 • • •
•
Permission admin – batyuk jogainak adminisztrálása Package admin – batyuk export-import függőségi listája Start level URL handler
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 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 ) { ... } • Manifest: }
• A BundleContext metódusai:
Bundle-Name: Helloworld Bundle-Version: 1.1 Bundle-Description: Hello, world Bundle-Vendor: FreeWare 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 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 • 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
<extension point="org.eclipse.ui.views">
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
Purpose
Browser
Control containing a native HTML renderer.
Button
Selectable control that issues notification when pressed and/or released.
Canvas
Composite control that provides a surface for drawing arbitrary graphics. Often used to implement custom controls.
Caret
An i-beam that is typically used as the insertion point for text.
Combo
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.
Composite
Control that is capable of containing other widgets.
CoolBar
Composite control that allows users to dynamically reposition the cool items contained in the bar.
CoolItem
Selectable user interface object that represents a dynamically positionable area of a cool bar.
ExpandBar
Composite control that groups pages that can be shown or hidden by the user with labeled headers.
ExpandItem
Selectable user interface object corresponding to a header for a page in an ExpandBar.
Group
Composite control that groups other widgets and surrounds them with an etched border and/or label.
Label
Non-selectable control that displays a string or an image.
Link
Selectable control that displays a text with links.
List
Selectable control that allows the user to choose a string or strings from a list of strings.
SWT - Controls Widget
Purpose
Menu
User interface object that contains menu items.
MenuItem
Selectable user interface object that represents an item in a menu.
ProgressBar
Non-selectable control that displays progress to the user, typically in the form of a bar graph.
Sash
Used to allow users to resize child widgets by repositioning their dividing line.
Scale
Selectable control that represents a range of numeric values.
ScrollBar
Used in a Composite that has V_SCROLL and/or H_SCROLL styles.
Shell
Window that is managed by the OS window manager.
Slider
Selectable control that represents a range of numeric values.
Spinner
Selectable control that allows the user to enter and modify numeric values.
TabFolder
Composite control that groups pages that can be selected by the user using labeled tabs.
TabItem
Selectable user interface object corresponding to a tab for a page in a tab folder.
Table
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.
TableColumn
Selectable user interface object that represents a column in a table.
TableItem
Selectable user interface object that represents an item in a table.
Text
Editable control that allows the user to type text into it.
ToolBar
Composite control that supports the layout of selectable tool bar items.
ToolItem
Selectable user interface object that represents an item in a tool bar.
Tree
Selectable control that displays a hierarchical list of tree items that can be selected by the user.
TreeColumn
Selectable user interface object that represents a column in a tree.
TreeItem
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
Description
FocusIn, FocusOut
A control has gained or lost focus.
KeyDown, KeyUp
The user has pressed or released a keyboard key when the control has keyboard focus.
MouseDown, MouseUp, MouseDoubleClick
The user has pressed, released, or double clicked the mouse over the control.
MouseMove
The user has moved the mouse above the control.
MouseEnter, MouseExit, MouseHover
The mouse has entered, exited, or hovered over the control.
MouseWheel
The mouse wheel has been rotated.
Paint
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. Control
Purpose
CBanner
CBanner is used in the workbench to layout the toolbar area and perspective switching toolbar.
CCombo
Similar to Combo, but is vertically resizable allowing it to fit inside table cells.
CLabel
Similar to Label, but supports shortening of text with an ellipsis.
CTabFolder
Similar to TabFolder, but supports additional configuration of the visual appearance of tabs
CTabItem
Selectable user interface object corresponding to a tab for a page in a CTabFolder.
SashForm
Composite control that lays out its children in a row or column arrangement
ScrolledComposite
Composite control that scrolls its contents
StyledText
Editable control that allows the user to type text.
ViewForm
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
•
Purpose
FillLayout
Lays out controls in a single row or column, forcing them to be the same size.
FormLayout
Using FormAttachments to optionally configure the left, top, right and bottom edges of each child.
GridLayout
Positions the children by rows and columns.
RowLayout
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(); }
•
•
Long running operations (org.eclipse.jface.operations) • •
•
Egy contribution (IContribution) egy Action UI rész 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);