*---------------------------------------------------------------------*
*                  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                                  *
*---------------------------------------------------------------------*

SAP Programm Textedit Control, einen Freitext erfassen

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