본문 바로가기
ABAP/Function|Class

[Class] CL_GUI_TEXTEDIT

by name_text 2024. 10. 24.

CL_GUI_TEXTEDIT

다수의 Text Editor 제어

 

Text Editor가 사용될 스크린, 컨테이너 정보와 텍스트 내용을 담을 변수명 등 여러 속성들을 Internal Table로 관리하여 다수의 Text Editor를 손쉽게 제어할수 있는 방법입니다.

 

# Text Editor 정보를 관리할 전역 변수

TYPES: BEGIN OF gts_text_editors,
         dynnr         TYPE sy-dynnr,              "Text Editor가 표시된 스크린 번호
         editor_name   TYPE scrfname,    "Text Editor가 사용될 Container 명(string 필드명과 동일하게 한다)
         is_required   TYPE abap_bool,    "필수 입력 여부
         max_width     TYPE i,                        "최대 문자 너비
         max_line      TYPE i,                           "최대 라인 수
         editor_object TYPE REF TO cl_gui_textedit,   "Text Editor Object
       END OF gts_text_editors,
       gty_text_editors TYPE SORTED TABLE OF gts_text_editors WITH UNIQUE KEY dynnr editor_name.

DATA: gt_text_editors  TYPE gty_text_editors.

 

# Text String이 있는 변수

DATA: BEGIN OF GS_ITAB,
        TEXT1 TYPE STRING,
        TEXT2 TYPE STRING,
        TEXT3 TYPE STRING,
        TEXT4 TYPE STRING,
END OF GS_ITAB.

DATA: BEGIN OF GS_ITAB2,
        TEXT1 TYPE STRING,
        TEXT2 TYPE STRING,
END OF GS_ITAB2.

 

# Text Editor 설정

gt_text_editors = VALUE #(  dynnr = '0103'  ( editor_name = 'GS_ITAB-TEXT1' is_required = abap_false   max_width = 65  max_line = 5 )
                            dynnr = '0104'  ( editor_name = 'GS_ITAB-TEXT2' is_required = abap_false   max_width = 35  max_line = 4 )
                                            ( editor_name = 'GS_ITAB-TEXT3' is_required = abap_false   max_width = 65  max_line = 5 )
                            dynnr = '0105'  ( editor_name = 'GS_ITAB2-TEXT1' is_required = abap_false   max_width = 65  max_line = 6 )
                                            ( editor_name = 'GS_ITAB-TEXT4' is_required = abap_false   max_width = 65  max_line = 400 )
                                  ).

 

# 스크린에 Text Editor를 사용할 Container 생성

container 이름은 위에서 설정한 "editor_name"과 동일하게 한다.

 

# PBO 모듈 (Text Editor Object Create)

MODULE SET_TEXT_EDITOR OUTPUT. 
  PERFORM set_text_editor.
ENDMODULE.

FORM set_text_editor.
  LOOP AT gt_text_editors ASSIGNING FIELD-SYMBOL(<lfs_editor>) WHERE dynnr EQ sy-dynnr.
    ASSIGN (<lfs_editor>-editor_name) TO FIELD-SYMBOL(<lfv_content>) ELSE UNASSIGN.
    IF <lfv_content> IS NOT ASSIGNED.
      CONTINUE.
    ENDIF.

    IF <lfs_editor>-editor_object IS NOT BOUND.
      <lfs_editor>-editor_object = NEW #( parent                      = NEW cl_gui_custom_container( container_name = <lfs_editor>-editor_name )
                                          wordwrap_mode               = cl_gui_textedit=>wordwrap_at_fixed_position  "라인 최대 너비에 따라 줄 내림
                                          wordwrap_position           = <lfs_editor>-max_width                "라인의 최대 너비
                                          wordwrap_to_linebreak_mode  = cl_gui_textedit=>true           "입력한 문자가 라인 최대너비를 넘어가면 개행문자 삽입
                                          max_number_chars            = <lfs_editor>-max_width * <lfs_editor>-max_line
                                          name                        = CONV #( <lfs_editor>-editor_name )
                                          ).

      <lfs_editor>-editor_object->set_toolbar_mode( cl_gui_textedit=>false ).
      <lfs_editor>-editor_object->set_statusbar_mode( cl_gui_textedit=>false ).
      <lfs_editor>-editor_object->set_textstream( <lfv_content> ).
      <lfs_editor>-editor_object->set_readonly_mode( COND #( WHEN gs_control-edit EQ abap_true THEN cl_gui_textedit=>false ELSE cl_gui_textedit=>true ) ).
    ENDIF.
  ENDLOOP.
ENDFORM.



# 전체 Text Editor 내용 읽기

FORM get_text_editor_content .
  LOOP AT gt_text_editors ASSIGNING FIELD-SYMBOL(<lfs_text_editor>).
    ASSIGN (<lfs_text_editor>-editor_name) TO FIELD-SYMBOL(<lfv_content>) ELSE UNASSIGN.
    IF <lfv_content> IS NOT ASSIGNED.
      CONTINUE.
    ENDIF.

    IF <lfs_text_editor>-editor_object IS BOUND.
      cl_gui_cfw=>flush( ).

      <lfs_text_editor>-editor_object->get_textstream(
*        EXPORTING
*          only_when_modified     = false            " get text only when modified
        IMPORTING
          text                   = <lfv_content>
*          is_modified            =                  " modify status of text
        EXCEPTIONS
          error_cntl_call_method = 1                " Error while retrieving a property from TextEdit control
          not_supported_by_gui   = 2                " Method is not supported by installed GUI
          OTHERS                 = 3
      ).
    ENDIF.
  ENDLOOP.
ENDFORM.

 

# 전체 Text Editor 편집 모드 변경

FORM change_text_editor_mode .
  LOOP AT gt_text_editors ASSIGNING FIELD-SYMBOL(<lfs_text_editor>).
    ASSIGN (<lfs_text_editor>-editor_name) TO FIELD-SYMBOL(<lfv_content>) ELSE UNASSIGN.

    IF <lfv_content> IS NOT ASSIGNED OR <lfs_text_editor>-editor_object IS NOT BOUND.
      CONTINUE.
    ENDIF.

    IF <lfs_text_editor>-editor_object IS BOUND.
      IF gs_control-edit NE abap_true.
        "데이터 원복
        <lfs_text_editor>-editor_object->set_textstream( <lfv_content> ).
      ENDIF.

      <lfs_text_editor>-editor_object->set_readonly_mode( COND #( WHEN gs_control-edit EQ abap_true THEN cl_gui_textedit=>false ELSE cl_gui_textedit=>true ) ).
    ENDIF.
  ENDLOOP.
ENDFORM.

 

# Text Editor 포커스 설정

FORM set_editor_object_focus .
  DATA lt_string TYPE STANDARD TABLE OF string.
  DATA(ls_text_editor) = VALUE #( gt_text_editors[ dynnr        = sy-dynnr
                                                   editor_name  = gv_screen_focus ] OPTIONAL ).

  IF ls_text_editor IS NOT INITIAL AND ls_text_editor-max_line > 0.
    ASSIGN (ls_text_editor-editor_name) TO FIELD-SYMBOL(<lfv_content>) ELSE UNASSIGN.
    IF <lfv_content> IS ASSIGNED AND ls_text_editor-editor_object IS BOUND.
      CLEAR lt_string.
      IF <lfv_content> CS cl_abap_char_utilities=>cr_lf.
        SPLIT <lfv_content> AT cl_abap_char_utilities=>cr_lf INTO TABLE lt_string.
      ELSEIF <lfv_content> CS cl_abap_char_utilities=>newline.
        SPLIT <lfv_content> AT cl_abap_char_utilities=>newline INTO TABLE lt_string.
      ELSEIF <lfv_content> IS NOT INITIAL.
        APPEND CONV string( <lfv_content> ) TO lt_string.
      ENDIF.

      ls_text_editor-editor_object->select_lines(
        EXPORTING
          from_line              = ls_text_editor-max_line + 1
          to_line                = lines( lt_string )
        EXCEPTIONS
          error_cntl_call_method = 1                " Error while selecting lines within TextEdit control!
          OTHERS                 = 2
      ).

      ls_text_editor-editor_object->set_focus(
        EXPORTING
          control           =  ls_text_editor-editor_object                " Control
        EXCEPTIONS
          cntl_error        = 1                " cntl_error
          cntl_system_error = 2                " cntl_system_error
          OTHERS            = 3
      ).
    ENDIF.
  ENDIF.
ENDFORM.

 

# Text Editor의 필수 입력 여부 및 최대라인수 점검

FORM check_validation .
  DATA: lt_error      TYPE STANDARD TABLE OF bal_s_show,
        lt_tab        TYPE SORTED TABLE OF d021t WITH NON-UNIQUE KEY fldn,
        lt_field_text TYPE SORTED TABLE OF d021t WITH UNIQUE KEY prog dynr fldn.

  DATA: lv_tab_text   TYPE dynfldtext,
        lv_field_text TYPE dynfldtext.
  DATA(lt_dynpfields) = VALUE dynpread_t( ).
  DATA(lv_fieldvalue) = VALUE dynfieldvalue( ).

  CONSTANTS gc_tab TYPE string VALUE 'TAB_100_FC'.

  CLEAR: lt_error, gs_control-error.
  CLEAR gv_screen_focus.


  "TAB TEXT
  SELECT
    fldn, dtxt
  FROM d021t
  WHERE prog EQ @sy-repid
    AND lang EQ @sy-langu
    AND fldn LIKE 'TAB_100_TAB%'
  GROUP BY fldn, dtxt
  INTO CORRESPONDING FIELDS OF TABLE @lt_tab.

  "스크린 필드 라벨
  SELECT
    prog,
    dynr,
    fldn,
    dtxt
  FROM d021t AS a
  WHERE a~prog EQ @sy-repid
    AND a~lang EQ @sy-langu
  INTO CORRESPONDING FIELDS OF TABLE @lt_field_text.

  "텍스트 에디터 내용 점검
  FIELD-SYMBOLS: <lfv_content> TYPE any.
  DATA: lt_string TYPE STANDARD TABLE OF string.

  LOOP AT gt_text_editors INTO DATA(ls_text_editor).
    ASSIGN (ls_text_editor-editor_name) TO <lfv_content> ELSE UNASSIGN.
    IF <lfv_content> IS NOT ASSIGNED.
      CONTINUE.
    ENDIF.

    "에디터가 속한 탭의 이름
    IF ls_text_editor-dynnr+3(1) NE '0'.
      lv_tab_text = VALUE #( lt_tab[ fldn = |TAB_100_TAB{ ls_text_editor-dynnr+3(1) }| ]-dtxt OPTIONAL ).
    ENDIF.

    "에디터의 이름을 LABEL_에디터명 필드에서 찾는다.
    lv_field_text = VALUE #( lt_field_text[ prog = sy-repid
                                            dynr = ls_text_editor-dynnr
                                            fldn = |LABEL_{ ls_text_editor-editor_name }| ]-dtxt OPTIONAL ).

    "필수 여부 점검
    IF ls_text_editor-is_required EQ abap_true AND <lfv_content> IS INITIAL.
      APPEND VALUE #( t_msg = |{ lv_tab_text }{ COND #( WHEN lv_tab_text IS NOT INITIAL THEN '-' ) }{ lv_field_text }: { TEXT-m13 }| ) TO lt_error.
      IF gv_screen_focus IS INITIAL.
        gv_screen_focus = ls_text_editor-editor_name.
        IF ls_text_editor-dynnr+3(1) NE '0'.
          g_tab_100-pressed_tab = |{ gc_tab }{ ls_text_editor-dynnr+3(1) }|.
        ENDIF.
      ENDIF.
    ENDIF.

    IF <lfv_content> IS NOT INITIAL.
      "텍스트 에디터 내용 점검
      CLEAR lt_string.
      IF <lfv_content> CS cl_abap_char_utilities=>cr_lf.
        SPLIT <lfv_content> AT cl_abap_char_utilities=>cr_lf INTO TABLE lt_string.
      ELSEIF <lfv_content> CS cl_abap_char_utilities=>newline.
        SPLIT <lfv_content> AT cl_abap_char_utilities=>newline INTO TABLE lt_string.
      ELSEIF <lfv_content> IS NOT INITIAL.
        APPEND CONV string( <lfv_content> ) TO lt_string.
      ENDIF.

      "텍스트 에디터별 최대 행수 점검
      IF lines( lt_string ) > ls_text_editor-max_line.
        APPEND VALUE #( t_msg = |{ lv_tab_text }{ COND #( WHEN lv_tab_text IS NOT INITIAL THEN '-' ) }{ lv_field_text }: { ls_text_editor-max_line NUMBER = USER } { TEXT-m14 }| ) TO lt_error.
        IF gv_screen_focus IS INITIAL.
          gv_screen_focus = ls_text_editor-editor_name.
          IF ls_text_editor-dynnr+3(1) NE '0'.
            g_tab_100-pressed_tab = |{ gc_tab }{ ls_text_editor-dynnr+3(1) }|.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.

  IF lt_error IS NOT INITIAL.
    CALL FUNCTION 'ZEXB_SHOW_REQ_FIELDS'
      TABLES
        t_err = lt_error.

    gs_control-error = abap_true.
  ENDIF.
ENDFORM.

 

댓글