‘commands’ in Eclipse (Teil 1)

Einführung

Mit Eclipse 3.3 wurde das commands framework als legitimer Nachfolger der actions dem Entwickler angeboten. Es bietet gegenüber den etablierten Aktionen einige Vorteile, die von einer besseren Entkopplung des UI vom Code, bis zu weniger redundanten Sourcen reichen. Die Details kann man auf den Portalseiten von Eclipse und in einigen Artikeln nachlesen. Entsprechende Links habe ich am Ende eingefügt.
Im ersten Teil werde ich den Einsatz in der Menüleiste demonstrieren.

Vorschau

So wird die Anwendung am Ende unseres ersten Exkurses aussehen.

Anwendung mit Menüs

Anwendung mit Menüs

Grundlagen

Mit dem ‘command’ Framework wurde die Entkopplung von UI und der Anwendungslogik weiter vorangetrieben. Jedes ‘command’ Objekt kann mit einem Handler verknüpft werden, der die eigentliche Logik ausführt. Ebenfalls zentral erfolgt die Zuweisung eines Icons. Um zu spezifizieren, wo die Anzeige erfolgen soll, wird deklarativ eine Location-URI eingesetzt. Die Bezeichnung vor dem Doppelpunkt definiert das Zielobjekt. Es folgt die ID des eigentlichen Ziels. Nachfolgend sind die gültigen URI-Bezeichner aufgelistet:

Umsetzung

Anlegen des Projekts

Ich lege ein ganz normales Plugin-Projekt mit dem Namen ‘de.emcon.example.commands’ an.

RCP Plugin Projekt

RCP Plugin Projekt

Es handelt sich um ein RCP Projekt dem wir den Namen ‘Commands Test’ geben.Damit wir später die Möglichkeiten eines Kontextmenüs zeigen können, wählen wir als Template eine RCP Anwendung mit einer View aus.

RCP Anwendung

RCP Anwendung


Wenn wir die Anwendung nun starten sehen wir sofort eine View mit einer Liste. Weiterhin wurde auch bereits ein Exit-Button zur Verfügung gestellt, der uns aber stört, weil er mit Actions realisiert wurde. Dazu löschen wir aus der Klasse ApplicationActionBarAdvisor alles heraus, was mit Actions zu tun hat. Die Klasse sollte danach so aussehen:

public class ApplicationActionBarAdvisor extends ActionBarAdvisor
{
  public ApplicationActionBarAdvisor(IActionBarConfigurer configurer)
  {
    super(configurer);
  }

  @Override
  protected void makeActions(final IWorkbenchWindow window) {}

  @Override
  protected void fillMenuBar(IMenuManager menuBar){}
}

So sieht die Anwendung aus, bevor wir mit der Implementierung der ersten commands beginnen.

Anwendung ohne Menü

Anwendung ohne Menü

Exit command anlegen

Um ein Kommando einsetzen zu können müssen wir die Extension org.eclipse.ui.commands benutzen, die wir der Anwendung über den Reiter Extensions hinzufügen. Es ist ganz praktisch, hier mit Wildcards zu arbeiten und einfach *commands einzugeben.

Extension für commands

Extension für commands

Für das weitere Vorgehen werde ich die relevanten Ausschnitte aus dem plugin.xml File anzeigen, da die Screenshots der äquivalenten View zu umfangreich würden. Über das Kontextmenü des Extensionpoints fügen wir ein command hinzu und legen folgende Werte fest:

   <extension
         point="org.eclipse.ui.commands">
      <command
            defaultHandler="de.emcon.example.commands.handler.ExitHandler"
            id="de.emcon.example.commands.exitcmd"
            name="Exit">
      </command>
   </extension>

Der Handler bezeichnet dabei die Klasse, die das eigentliche Kommando umsetzt. Erzeugt werden kann die Klasse ganz einfach, indem man auf den Hyperlink vor dem Definitionsfeld klickt. Man muss hier nur etwas aufpassen, weil für die Klassen zuweilen mehrer Interfaces möglich wären, aber nur eines als Default gesetzt wird. In der Methode execute platzieren wir den Befehl zum Schließen der Anwendung. Damit haben wir eine, bis dato, frei schwebende Anweisung geschaffen, die nun in das Menü eingebunden werden kann.

public class ExitHandler extends AbstractHandler implements IHandler
{
  @Override
  public Object execute(ExecutionEvent event) throws ExecutionException
  {
    HandlerUtil.getActiveWorkbenchWindow(event).close();
    return null;
  }
}

Menü anlegen

Wir fügen den Extension Point org.eclipse.ui.menus im Reiter Extensions hinzu. Hier bauen wir nun die Menüstruktur auf.

Extension Point für das Menü

Extension Point für das Menü

Im Kontextmenü der Extension wählen wir nun eine menuContribution aus und setzen den Parameter der llocationURI auf folgenden Wert: “menu:org.eclipse.ui.main.menu”. Damit fügen greifen wir auf das Hauptmenü der Anwendung zu. Aus dem Kontextmenü der ‘menuContribution’ selektieren wir nun den Eintrag menu, setzen das Label auf File und die ID auf de.emcon.example.commands.menu.main.file. Damit ist ein erster Eintrag in der Menüleiste mit dem Namen ‘File’ gesetzt. Jetzt müssen wir noch unserem Menü einen Eintrag hinzufügen, der mit dem erstellten ‘command’ verknüpft wird. Das tun wir wieder über das Kontextmenü und suchen uns nun command heraus. Als commandId benutzen wird natürlich die ID, die wir unserer Anweisung gegeben haben. Wir setzen das Label auf Exit und können auch noch eine Tooltip vereinbaren. Weiterhin habe ich noch ein kleines Icon spendiert das ich ebenfalls auswähle. Nachfolgend habe ich den kompletten Eintrag aus der plugin.xml dargestellt.

  <extension
         point="org.eclipse.ui.menus">
      <menuContribution
            locationURI="menu:org.eclipse.ui.main.menu">
         <menu
               id="de.emcon.example.commands.menu.main.file"
               label="File">
            <command
                  commandId="de.emcon.example.commands.exitcmd"
                  icon="icons/exit.gif"
                  label="Exit"
                  style="push"
                  tooltip="Schließt die Anwendung">
            </command>
        </menu>
      </menuContribution>
   </extension>

Um den Eintrag sichtbar zu machen bedarf es noch einer kleinen Korrektur im File ApplicationWorkbenchWindowAdvisor Hier muss die Sichtbarkeit des Menüs deklariert werden.

  @Override
  public void preWindowOpen()
  {
    IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
    configurer.setInitialSize(new Point(400, 300));
    configurer.setShowMenuBar(true);
    configurer.setShowCoolBar(false);
    configurer.setShowStatusLine(false);
    configurer.setTitle("Commands Test");
  }

So sieht unsere Anwendung bisher aus:

Anwendung mit Exit Menü

Anwendung mit Exit Menü

Help Menü mit Standardaktion

Haben wir den Exit-Befehl noch selber ausprogrammiert, können wir jedoch auch die Standardactions benutzen. Nachfolgend werden wir ein Help-Menü hinzufügen und einen About-Dialog einbetten, den wir über eine vorkonfigurierte Action referenzieren. Dazu fügen wir der menuContribution, die ja nun schon den Eintrag für das File enthält, ein zusätzliches menu zu. Dieses erhält als Label Help. Wir definieren eine neue ID (de.emcon.example.commands.menu.main.help). Auch hier fügen wir dem gerade initialisierten Menü aus dem Kontext ein command hinzu. Jedoch öffnen wir nun über den Browse Button den Auswahldialog und fügen die org.eclipse.ui.help.aboutAction hinzu. Die Suche gestaltet sich einfacher, indem wir einfach ‘*about’ eingeben. Ich habe noch ein Icon hinzugefügt und und das Lable ‘About’ vergeben. Wie das im Reiter Extension aussieht, zeigt nachfolgender Screenshot:

Menüstruktur mit Exit und Help

Menüstruktur mit Exit und Help

Damit haben wir den ersten Teil unserer Einführung in die commands beendet. Der zweite Teil beschäftigt sich mit der Einbettung in die Toolbar.

Weiterführende Links

January 16, 2009 • Tags:  • Posted in: Eclipse, RCP • No Comments

“Hallo Felix”

Einführung

In diesem ersten Beitrag möchte ich kurz beschreiben, wie man ein kleines Beispiel mit der OSGi Implementation von Apache Felix aufsetzt. Felix ist eine strikte Community Implementierung der OSGi Spezifikation 4.x Es sollen hier weniger die theoretischen Grundlagen von OSGi erklärt als eine Kurzanleitung für das Aufsetzen eines einfachen Projekts geliefert werden.

Vorbereitung

Welche Tools benötigen wir und wie muss die Umgebung eingerichtet sein? Nachfolgend eine kurze Beschreibung
Ich benutze Eclipse Ganymede unter Java 1.6 und habe mir das aktuelle Binary von Apache Felix heruntergeladen. Weiterhin benötigen wir noch Peter Criens Tool (BND), welches uns auf bequeme Art und Weise zu einem ausführbaren Bundle verhilft.

Eclipse konfigurieren

Felix als Library

Felix als Library

Java Projekt aufsetzen

Felix starten

BND-Tool einrichten

Das Programm

Activator Klasse

/**
 * HelloFelixActivator.java (created by: Uwe Sauerbrei - 22.10.2008)
 */
package org.osgi.tutorial;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
/**
 * Einfaches Beispiel für eine Activatorklasse
 *
 * @author Uwe Sauerbrei
 *
 */
public class HelloFelixActivator implements BundleActivator
{
  public void start(BundleContext arg0) throws Exception
  {
    System.out.println("Hello Felix...");
  }

  public void stop(BundleContext arg0) throws Exception
  {
    System.out.println("Goodbye Felix...");
  }
}

BND Skript

Ausführung

Fazit

Letztendlich ist es uns gelungen, mit einigem Vorbereitungsaufwand, ein einfaches Programm in einer modularen OSGi Struktur zum Laufen zu bringen. Hat man diese initiale Hürde einmal bewältigt, kann man von hier seine eigene Entdeckungsreise recht schnell beginnen. Natürlich bedarf es dazu noch weiterer theoretischer Grundlagen.
Ich werde aber an dieser Stelle zum Vergleich auch die Installation mit Equinox beschreiben, auf der ja Eclipse auch selber basiert.

Weiterführende Links

November 5, 2008 • Tags:  • Posted in: OSGi • No Comments