Aus Linux-Magazin 10/2005

Eclipse Rich Client Platform als Basis für eigene Anwendungen - Teil 2

Teil 1 dieses Tutorials in Ausgabe 08/05 des Linux-Magazins hat die Entwicklung einer Anwendung mit der Eclipse Rich Client Platform demonstriert. Diese Folge fügt dem bis dato funktionslosen Programm Menüs und Views hinzu. Eclipse macht manuelle Programmierarbeit dabei zur Nebensache.

Menüs und Anwendungsfenster bilden zentrale Elemente praktisch jedes grafischen Programms. Eclipse nimmt dem Entwickler in der Rich Client Platform mit Hilfe von Wizards die Hauptarbeit ab. Etwas Handarbeit erfordert lediglich die Integration der automatisch generierten Views. Bei Views handelt es sich – wie bei Applications und Perspectives – um Extensions, die die Datei »plugin.xml« definiert.

Neben dieser eher administrativen Definition implementiert die View selbst eine eigene Klasse, die den gesamten Lebenszyklus einer View unterstützen muss: Instantiierung, Initialisierung, Erstellen der Controls der View und am Ende des Zyklus die Freigabe von Ressourcen (dispose). Dafür gibt es neben dem Interface »IViewPart« die Klasse »ViewPart«, die das Standardverhalten implementiert. Für einen schnellen Start stellt Eclipse außerdem einen Code-Wizard bereit, der das Gerüst einer View liefert.

View per Mausklick

Den Wizard startet der Button »Add…« im Reiter »Extensions« des »plugin.xml«-Editors, der alle bereits definierten Extensions aufführt (siehe Abbildung 1). Im folgenden Dialogfenster stehen im Tab »Extension Wizards« unter »Extension Templates« zahlreiche Assistenten zur Wahl.

Der Eintrag »Sample View« eignet sich gut, um zunächst die Mechanismen zu verstehen, auch wenn das darüber generierte Template mit der hier vorgestellten Beispielanwendung wenig zu tun hat. Der nächste Dialog im Wizard erfragt die Namen des Java-Package, der Klasse und der View (Abbildung 2). Diese Informationen reichen dem Wizard für das Gerüst. Er legt die neue Erweiterung in der Datei »plugin.xml« sowie eine Klasse des angegebenen Namens an. Im Beispiel aus Abbildung 2 heißt sie »SampleView.java«.

Notwendige Ergänzungen

Der neue Abschnitt »extension« in der Datei »plugin.xml« enthält die im Wizard festgelegten Namen (siehe Listing 1). Auf die Anwendung hat er alleine allerdings keine Auswirkung, denn sie verwendet die neu erzeugte View noch nicht.

Die im ersten Teil des Tutorials generierte Klasse »Perspective.java« enthält eine bislang leere Methode »createInitialLayout()«. Der Code aus Listing 2 bindet darin die neue View ein. Er schaltet in Zeile 9 zunächst den Editorbereich ab, sonst erschiene ein leeres Editorfeld in der Anwendung. Anschließend fügen die Zeilen 10 bis 14 die View zur Perspective hinzu.

Listing 2 verwendet in Zeile 11 eine feststehende Zeichenkette (»de.bablokb.epm.SampleView«) als View-ID, in einer realen Anwendung definiert der Programmierer zu diesem Zweck gewöhnlich eine Konstante in der View-Klasse. Abschließend fixiert Zeile 15 die View, um zu verhindern, dass der Anwender sie frei bewegt. In Listing 1 ist diese Option auskommentiert, sodass der Benutzer die View frei auf dem Desktop positionieren kann. Welche der beiden Varianten sinnvoll ist, hängt von der Art der jeweiligen Anwendung ab.

Menüs in View und Anwendung

Die Menüs der Rich-Client Anwendung lassen sich deklarativ oder programmtechnisch umsetzen. Der programmtechnische Ansatz erzeugt die Menüstruktur über Programmcode. Das hat den Vorteil, dass einige Standardmenüs zur Verfügung stehen, beispielsweise zum Schließen der Anwendung. Der Entwickler verknüpft die Menüpunkte mit Aktionen, die den eigentlichen Code enthalten. Aktionen erzeugt die im RCP-Framework verfügbare Action Factory.

Der im Teil 1 des Tutorials erzeugte Code der Klasse »ApplicationActionBarAdvisor.java« enthält schon die Stubs, die wie in Listing 3 auszufüllen sind. Dazu initialisiert und registriert die Methode »makeActions()« die Aktionen (Zeilen 30 bis 42), im Beispiel drei Standardanwendungsfälle: Öffnen eines neuen Anwendungsfensters, ein About-Dialog und die Quit-Aktion.

Die Methode »fillMenuBar()« erzeugt in den Zeilen 44 bis 61 die eigentliche Menüstruktur. Der »GroupMarker« in Zeile 49 verschafft anderen Plugins dabei einen Anknüpfungspunkt für eigene Menü-Erweiterungen.

Listing 1:
»plugin.xml«

01: <?xml version="1.0" encoding="UTF-8"?>
02: <?eclipse version="3.0"?>
03: <plugin
04:    ...
36:    <extension
37:          point="org.eclipse.ui.views">
38:       <category
39:             id="EPM"
40:             name="Sample Category"/>
41:       <view
42:             category="EPM"
43:             class="de.bablokb.epm.SampleView"
44:             icon="icons/sample.gif"
45:             id="de.bablokb.epm.SampleView"
46:             name="Sample View"/>
47:    </extension>
48:    ...
62: </plugin>

Listing 2:
»Perspective.createInitialLayout()«

01: package de.bablokb.epm;
02:
03: import org.eclipse.ui.IPageLayout;
04: import org.eclipse.ui.IPerspectiveFactory;
05:
06: public class Perspective implements IPerspectiveFactory {
07:
08:    public void createInitialLayout(IPageLayout layout) {
09:       layout.setEditorAreaVisible(false);
10:       layout.addView(
11:             "de.bablokb.epm.SampleView",
12:             IPageLayout.TOP,
13:             IPageLayout.RATIO_MAX,
14:             IPageLayout.ID_EDITOR_AREA);
15:       // layout.setFixed(true);
16:    }
17: }

Listing 3:
»ApplicationActionBarAdvisor.java«

01: package de.bablokb.epm;
02:
03: import org.eclipse.jface.action.GroupMarker;
04: ...
18:
19: public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
20:
21:    private IWorkbenchAction iExitAction;
22:    private IWorkbenchAction iAboutAction;
23:    private IWorkbenchAction iNewWindowAction;
24:    // private OpenArchiveAction iOpenArchiveAction;
25:
26:     public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
27:       super(configurer);
28:     }
29:
30:     protected void makeActions(IWorkbenchWindow window) {
31:       iExitAction = ActionFactory.QUIT.create(window);
32:       register(iExitAction);
33:
34:       iAboutAction = ActionFactory.ABOUT.create(window);
35:       register(iAboutAction);
36:
37:       iNewWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(window);
38:       register(iNewWindowAction);
39:
40:       // iOpenArchiveAction = new OpenArchiveAction(window, "Open Another Archive View", ArchiveView.ID);
41:       // register(iOpenArchiveAction);
42:     }
43:
44:     protected void fillMenuBar(IMenuManager menuBar) {
45:       MenuManager archiveMenu = new MenuManager("&Archive", IWorkbenchActionConstants.M_FILE);
46:       MenuManager helpMenu = new MenuManager("&Help", IWorkbenchActionConstants.M_HELP);
47:
48:       menuBar.add(archiveMenu);
49:       menuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
50:       menuBar.add(helpMenu);
51:
52:       // Archive
53:       archiveMenu.add(iNewWindowAction);
54:       archiveMenu.add(new Separator());
55:       // archiveMenu.add(iOpenArchiveAction);
56:       archiveMenu.add(new Separator());
57:       archiveMenu.add(iExitAction);
58:
59:       // Help
60:       helpMenu.add(iAboutAction);
61:     }
62:
63:     protected void fillCoolBar(ICoolBarManager coolBar) {
64:       IToolBarManager toolbar = new ToolBarManager(SWT.FLAT | SWT.RIGHT);
65:       coolBar.add(new ToolBarContributionItem(toolbar, "main"));
66:       toolbar.add(iExitAction);
67:       // toolbar.add(iOpenArchiveAction);
68:     }
69: }

Menüs ohne Programmierarbeit

Die Rich Client Platform erspart Entwicklern den langweiligen manuellen Aufbau und deklariert auch die Menüs über die Datei »plugin.xml«. Der Extension-Wizard generiert das notwendige Template ebenfalls automatisch (siehe Abbildung 2). Nach der Auswahl des Eintrags »”Hello, World” Action Set« erfragt der Assistent die gewünschten Namen des Java-Package und der Aktionsklasse sowie den Inhalt einer Message-Box, die ein späterer Aufruf der Klasse mit dem hier eingetragenen Text auf den Bildschirm bringt.

Der Extensions-Assistent erstellt im vorliegenden Beispiel die Datei »RotateAction.java« (Listing 4) und die für die Integration ins Programm notwendigen Einträge in der »plugin.xml« (Listing 5). Die Java-Klasse bleibt vorerst unbearbeitet, die manuellen Anpassungen erfolgen wiederum in der Datei »plugin.xml«.

Abbildung 1: Im »plugin.xml«-Editor übernehmen Wizards einen Großteil der Arbeit.

Abbildung 1: Im »plugin.xml«-Editor übernehmen Wizards einen Großteil der Arbeit.

Abbildung 2: Der Extension-Wizard generiert das Gerüst neuer Klassen und erweitert die Datei »plugin.xml« automatisch.

Abbildung 2: Der Extension-Wizard generiert das Gerüst neuer Klassen und erweitert die Datei »plugin.xml« automatisch.

Lebenszyklus füllen

Die ebenfalls vom Wizard erzeugte Java-Klasse »RotateAction.java« enthält leere Methoden für den Life-Cycle (»init« und »dispose«) sowie die »run()«-Methode.Sie enthält den über das Menü ausgelösten Code (Zeilen 31 bis 36 in Listing 4). Die Minimalimplementation zeigt eine Textbox mit dem im Wizard eingegebenen Text an. Die Definition des Action-Sets in der »plugin.xml« ist für weitere Menüs per Copy&Paste erweiterbar.

Abbildung 3: Die Beispielanwendung enthält erste Interaktionsmöglichkeiten über das Menü - das Gerüst hat Eclipse automatisch erzeugt.

Abbildung 3: Die Beispielanwendung enthält erste Interaktionsmöglichkeiten über das Menü – das Gerüst hat Eclipse automatisch erzeugt.

finally{}

Mit der View und dem Menü bietet die Anwendung dem Benutzer die erste Interaktionsmöglichkeit (Abbildung 3). Der eigene Programmieraufwand dazu bleibt minimal, für das Anwendungsgerüst haben die Wizards gesorgt. Im Gegensatz zu vielen anderen RAD-Tools beschränkt sich die Eclipse-Workbench auf das Wesentliche und versucht nicht alle Aspekte über grafische Oberflächen abzudecken – denn ist das Template generiert, bevorzugen viele Programmierer wieder einen einfachen Texteditor.

Die nächsten Folgen des Tutorials werden eine Intro-Seite sowie eine Hilfe einbinden und sich der eigentlichen View-Programmierung widmen. Wer schon etwas experimentieren will, findet den Eclipse-Workspace sowie alle vorgestellten Listings vollständig auf dem Server des Linux-Magazins unter: [https://www.linux-magazin.de/Service/Listings/2005/10/Coffeeshop] (csc)

Listing 4:
»RotateAction.java«

01: package de.bablokb.epm.actions;
02:
03: ...
04:
17: public class RotateAction implements IWorkbenchWindowActionDelegate {
30:    ...
31:    public void run(IAction action) {
32:       MessageDialog.openInformation(
33:          window.getShell(),
34:          "EPM - Eclipse Photo Management",
35:          "Rotate not implemented yet!");
36:    }
37:    ...
64: }

Listing 5: Action-Sets in der
»plugin.xml«

01: <?xml version="1.0" encoding="UTF-8"?>
02: <?eclipse version="3.0"?>
03: <plugin
04:    ...
51:    <extension
52:          point="org.eclipse.ui.actionSets">
53:       <actionSet
54:             id="EPM.photoActionSet"
55:             label="Photo Action Set"
56:             visible="true">
57:          <menu
58:                id="photoMenu"
59:                label="&Photo">
60:             <separator name="photoGroup"/>
61:          </menu>
62:          <action
63:                class="de.bablokb.epm.actions.RotateAction"
64:                icon="icons/rotate.gif"
65:                id="de.bablokb.epm.actions.RotateAction"
66:                label="&Rotate"
67:                menubarPath="photoMenu/photoGroup"
68:                toolbarPath="photoGroup"
69:                tooltip="Rotate photo"/>
70:       </actionSet>
71:    </extension>
76: </plugin>

Der Autor

Bernhard Bablok arbeitet bei der AGIS mbH als Anwendungsentwickler. Wenn er nicht Musik hört, mit dem Radl oder zu Fuß unterwegs ist, beschäftigt er sich mit Themen rund um Objektorientierung. Er ist unter [coffee-shop@bablokb.de] zu erreichen.

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben