
ABAP Tools - IDE Actions (Ausgabe)
Schauen wir uns an, welche Ausgabemöglichkeiten wir aktuell mit IDE Actions haben und was wir damit erreichen können. Dabei schauen wir uns jeweils unterschiedliche Beispiele für die Implementierung an.
Inhaltsverzeichnis
Dieses Mal implementieren wir die Ausgabe für unsere Aktion und schauen uns dabei die aktuellen Ausgabetypen an und wofür wir sie verwenden können.
Einleitung
Im letzten Artikel hatten wir die IDE Action angelegt und sind auf die verschiedenen Details der Ausführung eingegangen. Dabei erhielten wir am Ende einen Fehler, das wir noch keine Ausgabe definiert hatten.
Ausgabe
Als Ausgabe stehen uns aktuell die Methoden Text, HTML und Code Change zur Verfügung, die wir uns in diesem Kapitel einmal genauer anschauen.
Rückgabe
Beim letzten Mal hatten wir die eigentliche Aktionsklasse ZCL_BS_DEMO_IDE_FIRST_ACTION angelegt und die RUN Methode nicht korrekt implementiert. Schauen wir uns die Methode an, dann sollten wir ein Objekt vom Interface IF_AIA_ACTION_RESULT erzeugen.
Dazu steht uns nun die Factory CL_AIA_RESULT_FACTORY zur Verfügung, die uns die passenden Objekte erstellen kann.
Text
Um einen String auszugeben, lassen wir uns von der Factory ein Text Popup erzeugen. Hier mappen wir zuerst noch nicht auf das Ziel-Interface, um an die Methode SET_CONTENT zu gelangen. Weitere Einstellungen oder Möglichkeiten haben wir aktuell nicht.
DATA(text) = cl_aia_result_factory=>create_text_popup_result( ).
text->set_content( `Here is my text output ...` ).
result = text.
Als Ergebnis wird dann der Text in einem einfachen Popup angezeigt. Die Größe des Fensters können wir nicht einstellen, sondern wird durch die letzten Aktionen festgelegt.
HTML
Wie der Name HTML schon andeutet, haben wir hier alle Möglichkeiten ein HTML Dokument zu erzeugen und auszugeben. Grundsätzlich ergeben sich damit einige Möglichkeiten hübsche Listen, Aufzählungen und andere Dinge zu erzeugen. In diesem Beispiel generieren wir eine einfache Überschrift und ein Paragraph für die Ausgabe. Zusätzlich setzen wir noch die Farbe der Überschrift auf Blau.
DATA(html_document) = `<html><head></head><body><h1 style="color:blue;">Big Heading</h1><p>A text in a paragraph</p><body></html>`.
DATA(html) = cl_aia_result_factory=>create_html_popup_result( ).
html->set_content( html_document ).
result = html.
Die Ausgabe des HTML Popups würde nun entsprechend so aussehen. Grundsätzlich hast du hier alle Freiheiten, von der Größe her musst du es wahrscheinlich ebenfalls anpassen, damit es zu deiner Ausgabe passt.
Daher würden wir dir ein kleines Framework empfehlen, dass sich um die Aufbereitung der Ausgabe nach HTML kümmert. Mit CSS kannst du einige Anpassungen erreichen, damit deine Ausgabe noch besser aussieht.
Code Change
Etwas komplexer wird es bei der Erzeugung eines Code Changes. Hier benötigen wir im Normalfall noch den eigentlich markierten Quellcode, wenn wir damit in die Analyse gehen wollen. Wollen wir dagegen einfach nur etwas neuen Quellcode einfügen, dann benötigen wir keinen Referenz-Code und können den neuen Code einfach übernehmen. Dafür bietet der Standard verschiedene Möglichkeiten von Code Changes an.
- INSERT - Fügt den übergebenen Content in den Quellcode ein.
- REMOVE - Entfernt den markierten Quellcode an der übergebenen Position
- REPLACE - Ersetzt den markierten Quellcode
In dem folgenden Beispiel führen wir ein Replacement des Quellcodes durch. Dazu holen wir uns die aktuelle Cursor-Position aus dem CONTEXT Objekt. Dieses müssen wir zuvor aber das Objekt auf das Interface IF_ADT_CONTEXT_SRC_BASED_OBJ casten, um an die Methode GET_POSITION zu kommen. Im Anschluss lassen wir uns über die Factory ein neues Source-Code-Change Objekt geben. Dann fügen wir ein Replacement hinzu und übergeben den neuen Quellcode.
DATA(resource) = CAST if_adt_context_src_based_obj( context->get_focused_resource( ) ).
DATA(position) = resource->get_position( ).
DATA(change) = cl_aia_result_factory=>create_source_change_result( ).
change->add_code_replacement_delta( content = `" [REPLACE]`
selection_position = position ).
result = change.
Nun erhalten wir den Änderungs-Dialog und können die Code-Änderung prüfen. Sind wir damit zufrieden, dann können wir mit OK die Anpassung übernehmen. Damit steht uns eine einfache Möglichkeit zur Verfügung, auch direkte Änderungen im Quellcode durchzuführen und das Delta dem Ausführenden mitteilen.
Vollständiges Beispiel
Das vollständige Beispiel findest du bei uns im GitHub Repository. Alle Änderungen aus dem heutigen Artikel sind in diesem Commit zusammengefasst und sollten nachvollziehbar sein.
Fazit
Egal ob du nur eine Meldung ausgeben, dich mit HTML ausdrücken möchtest oder eine Änderung im Code darstellen möchtest. Über die aktuellen Ausgabemethoden ist das möglich. Allerdings würden wir uns hier auch Möglichkeiten für Objektbäume und fixierbare Fenster wünschen.




