*---------------------------------------------------------------------*
* Z _ B J H _ O O _ T E X T E D I T *
* *
* Autor: Bernd Haase (BJH Software) *
*---------------------------------------------------------------------*
* Beispielprogramm für das Nutzen des TextEdit-Controles in ABAP. *
* Der Texteditor wird in einen Container eingelagert, mehrere Funktio-*
* nen sind standardmäßig bereits aktiv (wie Daten laden, sichern, *
* usw.). In diesem Beispiel wird ein zusätzliches Ereignis definieret,*
* ein Doppelklick, welche ein Sternchen in der Zeile setzt oder es *
* wieder zurücknimmt. *
*---------------------------------------------------------------------*
* (DM) Textedit, Langtexte lesen (read_text) *
*---------------------------------------------------------------------*
* 02.09.2004 BHaa: Programm erstellt *
*---------------------------------------------------------------------*

REPORT z_bjh_oo_textedit .
CONSTANTS:
* irgendeinen Text einlesen, im diesem Beispiel ist es ein Präferenz-
* text in der Anmeldesprache zum Land UAE (tdname = AE??). Wenn Sie
* dieses Programm bei sich testen möchten, so müssten Sie die Text-
* schlüsselkonstanten anpassen
co_objekt LIKE stxh-tdobject VALUE 'TEXT',
co_name LIKE stxh-tdname VALUE 'AEAR',
co_id LIKE stxh-tdid VALUE 'Z3EX'.
DATA:
* welche Aktion wurde im Dynpro gewählt
gv_okcode LIKE sy-ucomm,
pgm_name LIKE sy-repid.
DATA:
* Referenz für den Container im Dynpro
go_screen_textedit TYPE REF TO cl_gui_custom_container,
* Referenz der TextEdit-Control auf den Container
go_textedit TYPE REF TO cl_gui_textedit.
* Ereignisse zu dem TextEdit-Control
DATA:
wa_ereignis(20) TYPE c,
* interne Tabelle für die Ereignisse (Events), die zugeordnet werden
* sollen
itab_events TYPE cntl_simple_events,
* Strukture eine Zeile (ein Ereignis) der internen Tabelle
wa_event TYPE cntl_simple_event.
**********************************************************************
* T E X T E D I T - Variablen
**********************************************************************
CONSTANTS:
* Länge einer Zeile im Editor
editorlaenge TYPE i VALUE 254.
TYPES:
* Textzeile typisieren, dabei die Textzeilenlänge der Länge der
* konstanten Vereinbarung entnehmen
BEGIN OF ty_textzeile,
line(editorlaenge) TYPE c,
END OF ty_textzeile.
DATA:
* interne Tabelle aller Textzeilen. Dient zum Datenaustausch zwischen
* dem TextEdit-Control und weiteren Anwendungen wie Texte speichern,
* laden oder aus / in den Control verschieben
itab_textzeilen TYPE TABLE OF ty_textzeile.
*---------------------------------------------------------------------*
* CLASS DEFINITION *
* *
* L C L _ E R E I G N I S S E *
*---------------------------------------------------------------------*
* Definition, welche Ereignisse im TextEdit vorkommen können. *
*---------------------------------------------------------------------*
CLASS lcl_ereignisse DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
catch_dblclick FOR EVENT dblclick OF cl_gui_textedit
IMPORTING sender.
ENDCLASS. "lcl_ereignisse DEFINITION
*---------------------------------------------------------------------*
* CLASS IMPLEMENTATION *
* *
* L C L _ E R E I G N I S S E *
* *
* D O P P E L C L I C K *
*---------------------------------------------------------------------*
* Doppelklick im TextEdit. *
*---------------------------------------------------------------------*
CLASS lcl_ereignisse IMPLEMENTATION.
METHOD catch_dblclick.
DATA:
idx_zeile TYPE i,
from_pos TYPE i,
to_line TYPE i,
to_pos TYPE i,
wa_texttable TYPE ty_textzeile.
* Ereignis ist ausgelöst worden. Der Aktionscode des Dynpros kann
* ereignisbezogen anders oder neu gesetzt werden, um auf den Doppel-
* klick im Nachlauf des Dynpros (PAI) reagieren zu können
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'SHOW'.
* Position des Doppelklickes ermitteln
CALL METHOD sender->get_selection_pos
IMPORTING
from_line = idx_zeile
from_pos = from_pos
to_line = to_line
to_pos = to_pos.
* die Textzeilen im TextEdit Control könnten verändert worden sein,
* somit aus Sicherheitsgründen die Zeilen des Controles in die interne
* Tabelle übertragen
CALL METHOD sender->get_text_as_r3table
IMPORTING
table = itab_textzeilen.
* Die Zeile in der internen Texttabelle lesen, die geklickt worden ist
READ TABLE itab_textzeilen INDEX idx_zeile INTO wa_texttable.
IF sy-subrc <> 0.
EXIT.
ENDIF.
* Beispielaktion beim Doppelklick: alternierend '*' setzen oder
* ausschalten (Kommentieren oder dekommentieren)
IF wa_texttable+0(1) CS '*'.
SHIFT wa_texttable.
ELSEIF wa_texttable+0(1) NS '*'.
SHIFT wa_texttable RIGHT.
wa_texttable+0(1) = '*'.
ENDIF.
* interne Texttabelle aktualisieren mit der geklickten Texte
MODIFY itab_textzeilen FROM wa_texttable INDEX idx_zeile.
* die Texte der internen Tabelle erneut in den Text-Editor übertragen
CALL METHOD go_textedit->set_text_as_r3table
EXPORTING
table = itab_textzeilen.
ENDMETHOD. "catch_dblclick
ENDCLASS. "lcl_ereignisse IMPLEMENTATION
***********************************************************************
* *
* P R O G R A M M S T A R T *
* *
***********************************************************************
* wechseln zum Dynpro
START-OF-SELECTION.
SET SCREEN '9900'.
*---------------------------------------------------------------------*
* T E X T E _ L A D E N *
*---------------------------------------------------------------------*
* Laden eines Textes auf den Textbausteinen (SO10). Der geladene Text *
* wird in den TextEdit kopiert und danach in eine andere interne *
* Tabelle weiterverschoben. Das Unterprogramm soll nur den Datenaus- *
* tausch zwischen Cluster-Tabellen für Texte (STXH), internen Text- *
* tabellen und dem Text-Editor aufzeigen *
*---------------------------------------------------------------------*
FORM upro-text_laden.
TYPES:
BEGIN OF textzeile,
line(editorlaenge) TYPE c,
END OF textzeile.
DATA:
* die benötigten internen Texttabellen
itab_text_in TYPE TABLE OF textzeile,
itab_text_out TYPE TABLE OF textzeile.
* Textzeile zum Auflösen der Clustertabelle
DATA: BEGIN OF t_lines OCCURS 0.
INCLUDE STRUCTURE tline.
DATA: END OF t_lines.
DATA:
* Anzeigestruktur für die Ausgabe
wa_lines LIKE t_lines.
DATA:
t_thead LIKE thead OCCURS 1 WITH HEADER LINE.
*= = = = = = = = = = = = = =
* interne Texttabellen initialisieren
CLEAR: itab_text_in, itab_text_out.
* irgendeinen Text einlesen, die Codierung, welcher Text gezogen wer-
* den, geschieht in diesem Beispiel über Konstanten. Wenn Sie dieses
* Programm bei sich testen möchten, so müssten Sie die Textschlüssel-
* konstanten anpassen.
SELECT tdobject tdname tdid tdspras FROM stxh
INTO CORRESPONDING FIELDS OF TABLE t_thead
WHERE tdobject = co_objekt
AND tdname = co_name
AND tdid = co_id
AND tdspras = sy-langu.
* Text aufbereiten in einzelen Zeilen einer internen Tabelle
LOOP AT t_thead.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = t_thead-tdid
language = t_thead-tdspras
name = t_thead-tdname
object = t_thead-tdobject
TABLES
lines = t_lines.
CLEAR wa_lines.
LOOP AT t_lines INTO wa_lines.
APPEND wa_lines-tdline TO itab_text_in.
ENDLOOP.
ENDLOOP.
* interne Texttabelle in den Text-Editor übertragen
CALL METHOD go_textedit->set_text_as_r3table
EXPORTING
table = itab_text_in.
IF sy-subrc > 0.
* Fehler => Abbruch oder vielleicht mal eine Meldung anzeigen
EXIT.
ENDIF.
* Alle Methoden, die mit Controls arbeiten, werden zum Frontend mit RFC
* übertragen. Die Flush-Methodik ermittelt, ob dieses getan ist
CALL METHOD cl_gui_cfw=>flush.
IF sy-subrc > 0.
* Fehler => Abbruch oder vielleicht mal eine Meldung anzeigen
ENDIF.
* Laden der Texte aus dem TextEdit-Control in eine andere Tabelle des
* Programms. Allerdings wird diese Tabelle hier nicht weiterverwendet.
CALL METHOD go_textedit->get_text_as_r3table
IMPORTING
table = itab_text_out.
IF sy-subrc > 0.
* Fehler => Abbruch oder vielleicht mal eine Meldung anzeigen
EXIT.
ENDIF.
* auch hier wieder den Flush nutzen
CALL METHOD cl_gui_cfw=>flush.
IF sy-subrc > 0.
* Fehler => Abbruch oder vielleicht mal eine Meldung anzeigen
ENDIF.
ENDFORM. "upro-text_laden
*---------------------------------------------------------------------*
* S T A T U S _ 9 9 0 0 *
*---------------------------------------------------------------------*
* Dynpro mit dem Text-Editor aufbauen. Container eröffnen und bei *
* Bedarf die benötugten Objekte aufbauen. Ereignistabelle füllen und *
* aktivieren. *
*---------------------------------------------------------------------*
MODULE status_9900 OUTPUT.
SET TITLEBAR 'BJH'.
IF go_textedit IS INITIAL.
* Wenn noch kein Objekt für Container und TextEdit-Control vorhanden
* sind, dann diese jetzt anlegen (ist so beim ersten Durchlauf durch
* das betroffenen Dynpro)
pgm_name = sy-repid.
* Den Custom-Container generieren
* ACHTUNG: Der Name im Exporting-Parameter muß genau dem entsprechen,
* wie der Name des Containers im Dynpro. Die Zuordnung Programm -
* Dynpro erfolgt durch die Module-PBO.
CREATE OBJECT go_screen_textedit
EXPORTING
container_name = 'MYCONTAINER'
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* Das Object des TextEdit-Controls generieren und dem dafür vorgesehe-
* nen Container zuordnen
CREATE OBJECT go_textedit
EXPORTING
wordwrap_mode =
cl_gui_textedit=>wordwrap_at_fixed_position
wordwrap_position = editorlaenge
wordwrap_to_linebreak_mode = cl_gui_textedit=>true
parent = go_screen_textedit
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
gui_type_not_supported = 5
OTHERS = 6
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* Ereignisse: Tabelle und Struktur initialisieren
CLEAR: itab_events, wa_event.
* Die Ereignis (Event handler) Methode zu dem TextEdit Control setzen
SET HANDLER lcl_ereignisse=>catch_dblclick FOR go_textedit.
* Das Ereignis in der internen Ereignis-Tabelle speichern
wa_event-eventid = cl_gui_textedit=>event_double_click.
* wa_events-appl_event = 'X'. "Das ist ein Application-Ereignis
wa_event-appl_event = space. "Das ist ein System-Ereignis
APPEND wa_event TO itab_events.
* Die interne Ereignistabelle dem TextEdit-Control zuordnen
CALL METHOD go_textedit->set_registered_events
EXPORTING
events = itab_events.
ENDIF.
ENDMODULE. "status_9900 OUTPUT
*---------------------------------------------------------------------*
* D Y N P R O _ 9 9 0 0 _ P A I *
*---------------------------------------------------------------------*
* Aktion oder Ereignisse im Dynpro mit dem TextEditor auswerten, *
* welche nicht standardmäßig über den Texteditor laufen *
*---------------------------------------------------------------------*
MODULE dynpro_9900_pai INPUT.
* auf Aktion reagieren
CASE gv_okcode.
WHEN 'IMP'.
PERFORM upro-text_laden.
WHEN 'ENDE'.
LEAVE TO SCREEN 0.
WHEN 'SHOW'.
wa_ereignis = 'System dblclick'.
WHEN OTHERS.
* Call the Dispacth method to initiate application event handling
*---- call method cl_gui_cfw=>Dispatch.
ENDCASE.
ENDMODULE. "dynpro_9900_pai INPUT
***** Ende *****
* Copyright BJH Software, Datei überarbeitet am: 21.3.2008