Dynamische Generierung von Kontextmenüs

Der Conigma Repository Browser erlaubt die dynamische Generierung von Teilen des Kontextmenüs mit Hilfe von ABAP Coding. Dies ist in folgenden Szenarien sinnvoll:

  • Die Erzeugung aller Kontextmenüeinträge über Customizing ist aufgrund der Anzahl nicht sinnvoll oder nicht möglich

  • Die Prüfung der Vorbedingung in Form von Expressions würde zu Performanceproblemen führen

  • Die Beschreibungen der Kontextmenüpunkte soll dynamisch generiert werden

Relevante Klassen und Interfaces 

Die folgende Tabelle zeigt die in diesem Kontext relevanten Klassen und Interfaces:

Name

Typ

Beschreibung

/GAL/CCM_IF_GUI_ACTION_TRIGGER

Interface

Interface für ein GUI-Element, welches das Auslösen einer Aktion unterstützt. Dieses Interface muss nicht direkt implementiert werden, da es im Interface für Menüpunkte enthalten ist.

/GAL/CCM_IF_GUI_MENU_ITEM 

Interface

Alle von einem Menüpunkt-Provider als Menüpunkte zurück gelieferten Instanzen müssen dieses Interface implementieren. Es ermöglicht die Definition der Anzeigefunktionen für einen Kontextmenüpunkte sowie die Implementierung der durch den Menüpunkt auszulösenden Aktion.

/GAL/CCM_IF_GUI_MENU_ITEM_PROV 

Interface

Klassen, welche dieses Interface implementieren, können als Provider für Menüpunkte (oder Unterpunkte) genutzt werden. Handelt es sich um einen Provider auf oberster Ebene, so kann das Interface /GAL/CCM_IF_GUI_MENU_ITEM zusätzlich implementiert werden, andernfalls werden die Informationen aus der Definition der Objektaktion übernommen. Menüpunkte welche zugleich als Provider für Untermenüpunkte fungieren, müssen sowohl das Interface /GAL/CCM_IF_GUI_MENU_ITEM als auch das Interface /GAL/CCM_IF_GUI_MENU_ITEM_PROV implementieren. 

/GAL/CCM_GUI_MENU_ADAPTER

Klasse

Diese Klasse fungiert als Schnittstelle zwischen den klassischen Objektaktionen und den neuen dynamisch generierbaren Kontextmenüs. Sie übernimmt die Instanzerzeugung der Kontextmenü-Provider und die Abfrage der zu generierenden Kontextmenüpunkte. Aus diesen Informationen wird dann zu Laufzeit eine Tabelle mit temporären Objektaktionen erzeugt und in die Tabelle der klassischen Objektaktionen eingefügt. Wird eine dieser temporären Objektaktionen ausgewählt, so wird das Objekt ermittelt, welches den zugehörigen Menüpunkt repräsentiert und die dort implementierte Aktionsverarbeitung angestoßen.

/GAL/CCM_GUI_MENU_BUILDER_IMP

Klasse

Menüpunkt-Provider für die schrittweise Ausführung eines Imports mit Systemfiltern. Diese Klasse kann als Beispiel für eigene Implementierungen von dynamischen Kontextmenüs verwendet werden.

/GAL/CCM_GUI_MENU_ITEM_IMP

Klasse

Menüpunkt für die schrittweise Ausführung eines Imports mit Systemfiltern. Diese Klasse kann als Beispiel für eigene Implementierungen von dynamischen Kontextmenüs verwendet werden.

/GAL/CCM_GUI_MENU_SEPARATOR

Klasse

Spezielle Implementierung des Interfaces /GAL/CCM_IF_GUI_MENU_ITEM, welche eine Trennlinie im Kontextmenü erzeugt. Diese Klasse kann bei Bedarf auch in eigenen Implementierungen von dynamischen Kontextmenüs verwendet werden. 

Implementierung eines Providers für ein dynamisches Kontextmenü 

Im ersten Schritt muss eine neue Klasse angelegt werden, welche als Menüpunkt-Provider für das dynamische Kontextmenü dient. Diese Klasse muss das Interface /GAL/CCM_IF_GUI_MENU_ITEM_PROV sowie optional auch das Interface /GAL/CCM_IF_GUI_MENU_ITEM implementieren.

Das Interface /GAL/CCM_IF_GUI_MENU_ITEM_PROV enthält lediglich eine Methode mit dem Namen GET_MENU_ITEMS. Diese muss eine Liste von Objektinstanzen zurück liefern, welche das Interface /GAL/CCM_IF_GUI_MENU_ITEM implementieren und die einzelnen Menüpunkte repräsentieren. Untermenüs können realisiert werden, indem einzelne Menüpunkte wiederum das Interface /GAL/CCM_IF_GUI_MENU_ITEM_PROV implementieren.

Das Interface /GAL/CCM_IF_GUI_MENU_ITEM enthält folgende Methoden:

Name

Beschreibung

GET_ICON

Liefert ein Icon zurück, welches den Menüpunkt repräsentiert. Ist dies nicht gewünscht, so kann die Konstante ICON_SPACE aus der Typgruppe ICON zurück geliefert werden.

Die SAP GUI unterstützt im Moment keine Anzeige von Icons in Kontextmenüs, werden die Aktionen jedoch in Form eines Buttons in einer Toolbar angezeigt (im Split-Screen Modus), so finden die Icons dort Verwendung.

GET_STATUS

Diese Methode liefert Statusinformationen zu dem Menüpunkt:

IS_ENABLED: Menüpunkt ist aktiv
IS_SEPARATOR: Menüpunkt wird als Trennlinie angezeigt
IS_VISIBLE: Menüpunkt ist sichtbar

GET_TEXT

Diese Methode liefert den Text für den Menüpunkt zurück.

TRIGGER_ACTION

Diese Methode enthält die Implementierung der eigentlichen Aktion, welche nach Auswahl des Menüpunkts ausgeführt werden soll. Auf Menüpunkten mit Untermenüs und Trennlinien können keine Aktionen ausgeführt werden.

Das Coding zur Ausführung der Aktion muss unter Umständen prüfen, ob deren Ausführung noch sinnvoll/relevant ist, da zwischen dem Abruf der möglichen Aktionen und der eigentlichen Ausführung einer Aktion ein größerer Zeitraum liegen kann.

Wie bei den klassischen Aktionen, können auch dynamische Aktionen eine Impact-Wert zurück liefern, welches den Umfang der in der Baumansicht zu aktualisierenden Repositoryobjekte angibt. Die entsprechende Definition geschieht durch Aufruf der statischen Methode SET_IMPACT in der Klasse /GAL/CCM_GUI_MENU_ADAPTER. Unterbleibt dieser Aufruf, so erfolgen keine expliziten Aktualisierungen in der Baumansicht der Repository Browsers.

 

Anpassung des Customizings für die Verwendung von dynamischen Kontextmenüs 

Als Platzhalter für ein dynamisches Kontextmenü muss im entsprechenden Objekttyp eine Objektaktion vom Typ "Provider für dynamischen Menüaufbau" gecustomized werden. Hierbei kann wie gewohnt eine Beschreibung und eine Vorbedingung hinterlegt werden. Der eigentliche Ausdruck enthält in diesem Fall jedoch nicht die im Falle der Auswahl auszuführende Aktion, sondern eine Expression, welche den gewünschten Menüpunkt-Provider zurück liefert. Diese könnte zum Beispiel folgendermaßen aussehen:

Alles Weitere wird automatisch beim Kontextmenüaufbau durch den Adapter für dynamische Kontextmenüs erledigt.