Aktive/nichtaktive Menüeinträge in Eclipse erstellen

Während der Entwicklung eines Eclipse-Plugins zur zeitgleichen Bearbeitung von Dokumenten, Real-Time Collaboration for Eclipse genannt, hat sich die Erzeugung von Menüeinträgen als recht kompliziert erwiesen. Gerade im Vergleich zu anderen GUI-Elementen kam ich hier nur langsam voran.

Schnell und einfach Menüeinträge für ein Plugin erstellen

Der Einstieg ist eigentlich recht simpel. In der Eclipse-Plugin-Manifest-Verwaltung muss unter dem Reiter Extensions ein neues Actionset erzeugt werden. Hierzu klickt man auf Add, dann am bestem im Reiter Extension Wizard das „Hello, world“ action set wählen, welches bereits ein Beispielmenü und einen Action-Delegator (IWorkbenchWindowActionDelegate) erzeugt. Der Delegator delegiert Aktionen, wenn der Nutzer auf einen entsprechenden Menüeintrag geklickt hat.

Nach ein bisschen weiterer Arbeit kann das alles so aussehen:

Der Plugin-Editor von Eclipse

In der erstellten Delegate-Klasse kann man nun unter der Methode run die gewünschten Aktionen des Menüeintrags ausführen. Man muss auch nicht für jede Kleinigkeit eine neue Klasse erstellen, sondern kann innerhalb einer Run-Methode Fallunterscheidung verwenden:

if (action.getId().equals("de.uni_rostock.rtce.menu.add_shared")) {
    // dann das
} else if (...) {
    // dann so
}

Menüeinträge ausgrauen (disable) und reaktivieren (enable)

Aktionen lassen sich aktivieren und deaktivieren. Dies graut automatisch entsprechende Menüeinträge und Icons aus. Jeder Menüeintrag hat seine eigene Action, auf die man immer Zugriff hat, wenn ein anderer Editor oder Eclipse-View in den Fokus kommt. Wenn dies passiert, wird im Aktionsdelegator die Methode selectionChanged aufgerufen. Dieses übergibt die Aktion als Parameter, welche dann ein- und ausgeschaltet werden kann:

public void selectionChanged(IAction action, ISelection selection) {
    // Aktion deaktivieren
    action.setEnabled(false);
    // Unter einer bestimmten Bedingung aktivieren
    if ([condition]) {
        action.setEnabled(true);
    }
}

2 Kommentare

  1. Ich glaube, ich verstehe dein Problem noch nicht ganz. Wenn du das Menü bauen lässt (der Benutzer auf die rechte Maustaste drückt), dann kannst du doch anhand einer gesetzten Eigenschaft die Aktivität setzen. Oder sehe ich das verkehrt?

  2. Das ist richtig. Und auch einfach, das stimmt. Ich habe doch oben in der Hauptmenüleiste einen Punkt Collaboration eingefügt. Dieser hat ja einige Unterpunkte wie Unshare Current Editor. Dieser soll ja aber nur anklickbar sein, wenn ein gesharter Editor offen ist. Ich kann das bei der Pluginregistrierung festlegen, dass die von Beginn an ausgegraut sind.

    Nun registriert sich der Menü-Controller beim EditorController. Wenn er erfährt, dass das aktuelle Dokument z.B. geshared wird, muss er ja Unshare wieder freigeben – keine Ahnung wie das geht. Ich weiß wie ich oben durch die Menüleiste durchiterieren kann. Aber das ist sehr unschön. Und für die Iconleiste habe ich gleich gar keine Lösung.

Kommentare sind geschlossen.