SAP ABAP OBJECTS Tutorials

Example 5: Responding to an event

When you double click on a text line in the TextEdit control, you want it to be prefixed with a ‘*’.

The line number of the TextEdit control that is double clicked, is retreived using method GET_SELECTION_POS. The internal text table is reloaded froim the TextEdit control with method GET_TEXT_AS_R3TABLE. The position of the double click in the TextEdit control is used to find the entry in the table, and the entry is prefixed with ‘*’ and loaded into the TextEdit control again.

The program should be changed so that the internal table i_texttable is global, and a global flag g_loaded added. The load of the table should be moved to the PBO module. The changes in thje code are marked with red. The whole program now looks like this:

Code

REPORT sapmz_hf_controls1 .

CONSTANTS:

line_length TYPE i VALUE 254.

DATA: ok_code LIKE sy-ucomm.

DATA:

* Create reference to the custom container

custom_container TYPE REF TO cl_gui_custom_container,

* Create reference to the TextEdit control

editor TYPE REF TO cl_gui_textedit,

repid LIKE sy-repid.

**********************************************************************

* Utillity table to load texts

**********************************************************************

TYPES:

BEGIN OF t_texttable,

line(line_length) TYPE c,

END OF t_texttable.

DATA:

i_texttable TYPE TABLE OF t_texttable,

g_loaded(1) TYPE c.

**********************************************************************

* Impmenting events

**********************************************************************

DATA:

event_type(20) TYPE c,

* Internal table for events that should be registred

i_events TYPE cntl_simple_events,

* Structure for oneline of the table

wa_events TYPE cntl_simple_event.

*———————————————————————*

*       CLASS lcl_event_handler DEFINITION

*———————————————————————*

CLASS lcl_event_handler DEFINITION.

PUBLIC SECTION.

CLASS-METHODS:

catch_dblclick FOR EVENT dblclick

OF cl_gui_textedit IMPORTING sender.

ENDCLASS.

CLASS lcl_event_handler IMPLEMENTATION.

METHOD catch_dblclick.

DATA:

from_line TYPE i,

from_pos  TYPE i,

to_line TYPE i,

to_pos TYPE i,

wa_texttable TYPE t_texttable.

* Used for the sytem event

call method cl_gui_cfw=>set_new_ok_code

exporting new_code = ‘SHOW’.

* Read the position of the double click

CALL METHOD sender->get_selection_pos

IMPORTING

from_line = from_line

from_pos  = from_pos

to_line   = to_line

to_pos    = to_pos.

*   Texts in the TextEdit control can have been changed, so

*   first reload text from the control into the internal

*   table that contains text

IF NOT g_loaded IS INITIAL.

CALL METHOD sender->get_text_as_r3table

IMPORTING table = i_texttable.

*   Read the line of the internal table that was clicked

READ TABLE i_texttable INDEX from_line INTO wa_texttable.

IF sy-subrc <> 0.

EXIT.

ENDIF.

IF wa_texttable+0(1) CS ‘*’.

SHIFT wa_texttable.

ELSEIF wa_texttable+0(1) NS ‘*’.

SHIFT wa_texttable RIGHT.

wa_texttable+0(1) = ‘*’.

ENDIF.

modify i_texttable from wa_texttable index from_line.

*     Reload texts from h einternal table

perform load_texts.

ENDIF.

ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

CLEAR wa_events.

REFRESH: i_events.

SET SCREEN ‘100’.

*———————————————————————*

*       MODULE USER_COMMAND_0100 INPUT                                *

*———————————————————————*

MODULE user_command_0100 INPUT.

CASE ok_code.

WHEN ‘EXIT’.

LEAVE TO SCREEN 0.

WHEN ‘SHOW’.

event_type = ‘System dblclick’.

WHEN ‘IMP’.

PERFORM Load_texts.

WHEN OTHERS.

*    CALL METHOD cl_gui_cfw=>dispatch. “Not used for system events

ENDCASE.

ENDMODULE.                 ” USER_COMMAND_0100  INPUT

*&———————————————————————*

*&      Module  STATUS_0100  OUTPUT

*&———————————————————————*

MODULE status_0100 OUTPUT.

* The TextEdit control shoul only be initialized the first time the

* PBO module executes

IF editor IS INITIAL.

repid = sy-repid.

*   Create object for custom container

CREATE OBJECT custom_container

EXPORTING

container_name              = ‘MYCONTAINER1’

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.

*   Create obejct for the TextEditor control

CREATE OBJECT editor

EXPORTING

wordwrap_mode          =

cl_gui_textedit=>wordwrap_at_fixed_position

wordwrap_position      = line_length

wordwrap_to_linebreak_mode = cl_gui_textedit=>true

parent                  = custom_container

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.

*   Link the event handler method to the event and the

*   TextEdit control

SET HANDLER lcl_event_handler=>catch_dblclick FOR editor.

*   Register the event in the internal table i_events

wa_events-eventid = cl_gui_textedit=>event_double_click.

*    wa_events-appl_event = ‘X’. “This is an application event

wa_events-appl_event = space. “This is a system event

APPEND wa_events TO i_events.

*   Pass the table to the TextEdit control uding method

*   set_registred_events

CALL METHOD editor->set_registered_events

EXPORTING events = i_events.

* Create internal table with texts taht can be uploaded to

* the TextEdit control

APPEND ‘This a method that fills the TextEdit control’ TO i_texttable.

APPEND ‘with a text.’ TO i_texttable.

DO 10 TIMES.

APPEND ‘hallo world !’ TO i_texttable.

ENDDO.

ENDIF.

ENDMODULE.                 ” STATUS_0100  OUTPUT

*&———————————————————————*

*&      Form Load_texts

*&———————————————————————*

* This form loads the lines of the internal table i_texttable into

* the TextEdit control

*———————————————————————-*

FORM Load_texts.

* Load TextEdit control with texts

CALL METHOD editor->set_text_as_r3table

EXPORTING table = i_texttable.

IF sy-subrc > 0.

*   Display an error message

EXIT.

ENDIF.

* All methods that operates on controls are transferred to the frontend

* by a RFC calls. the method FLUSH is used to determine when this is

* done.

CALL METHOD cl_gui_cfw=>flush.

IF sy-subrc > 0.

*   Display an error message

ENDIF.

g_loaded = ‘X’.

ENDFORM.                    ” create_texts

Example 6: Protect a line in the TextEdit control and the importance of FLUSH

All methods that operates on controls are transfered to the fronend by RFC calls. The FLUSH method is used to synchronize control execution and the frontend. This is very important when working e.g. with export parameters from a method, as the parmeters will not be correct before the FLUSH method has been called.

The example below portects selected lines in the TextEdit and uses FLUSH to ensure that the correct parameters are returned from method GET_SELECTION_POS.

Note: Instead of using method PROTECT_LINES, the method PROTECT_SELECTION could be used. This method does not need line numbers or a FLUSH statement

Steps

Add a new pushbutton to the screen with the function code PROTECT.

Code

Add the following code to the example:

* Global variables

DATA:

from_idx TYPE i,

to_idx TYPE i,

index TYPE i.

MODULE user_command_0100 INPUT.

CASE ok_code.

code…………………..

WHEN ‘PROTECT’.

PERFORM protect.

.    …………………..

ENDCASE.

*&———————————————————————*

*&      Form  protect

*&———————————————————————*

* Protects marked lines in a TextEdit control

*———————————————————————-*

FORM protect.

* Determine the area selected by the user

CALL METHOD editor->get_selection_pos

IMPORTING

from_line = from_idx

to_line   = to_idx

EXCEPTIONS

error_cntl_call_method = 1.

* Synchronize execution in the control with the ABAP program.

* Without this synchronization the variables from_idx and

* to_idx will have obsolutete values (The initial value for

* both, are 0)

CALL METHOD cl_gui_cfw=>flush.

IF sy-subrc > 0.

* Errormessage: Error in flush

ENDIF.

* Protect the selected lines

IF to_idx > from_idx.

to_idx = to_idx – 1.

ENDIF.

CALL METHOD editor->protect_lines

EXPORTING

from_line = from_idx

to_line   = to_idx.

* The PROTECT_SELECTION method could be used instead, eliminating the

* need of line numbers and the last FLUSH

* call method editor->protect_selection.

* Flush again to protect immidiately

CALL METHOD cl_gui_cfw=>flush.

IF sy-subrc > 0.

* Errormessage: Error in flush

ENDIF.

ENDFORM.                    ” protect