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.
'ABAP > Function|Class' 카테고리의 다른 글
[Class] CL_SALV_TABLE - SALV 제어 (2) | 2024.10.31 |
---|---|
[Class] CL_AUTH_OBJECTS_TO_SQL - 사용자의 보유 권한으로 SQL 조건문 생성 (1) | 2024.10.29 |
[Function] POPUP_GET_VALUES_DB_CHECKED - 필드값 입력 팝업 (0) | 2023.12.18 |
[Function] POPUP_GET_VALUES - 필드값 입력 팝업 (0) | 2023.12.18 |
[Class] SUBMIT으로 ALV 데이터 조회 - CL_SALV_BS_RUNTIME_INFO (1) | 2023.12.04 |
댓글