0% found this document useful (0 votes)
872 views629 pages

(Incl) ZXLWB Include

This document defines core classes and types used in the XLWB components. It includes definitions for tree and grid layouts, pattern areas, context bindings, and other structures.

Uploaded by

Duncan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
872 views629 pages

(Incl) ZXLWB Include

This document defines core classes and types used in the XLWB components. It includes definitions for tree and grid layouts, pattern areas, context bindings, and other structures.

Uploaded by

Duncan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 629

*&---------------------------------------------------------------------*

*& Include ZXLWB_INCLUDE C o r e


*&---------------------------------------------------------------------*

*=======================================================================
*=======================================================================
* Copyright 2016 Igor Borodin
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*=======================================================================
*=======================================================================
*
* XLSX-Workbench(XLWB) components [Version 4.10]
* Documentation is available at:
* https://sites.google.com/site/sapxlwb/home
*=======================================================================
* C o r e
*=======================================================================

DATA:
gv_guidcounter TYPE n LENGTH 10 .

*----------------------------------------------------------------------*
* CLASS lcl_root
*----------------------------------------------------------------------*
CLASS lcl_root DEFINITION .

TYPE-POOLS:
icon ,
abap ,
stree ,
soi ,
rs .

PUBLIC SECTION.
TYPES:
ty_r_tree TYPE REF TO cl_hrpayna_gui_alv_tree ,
ty_r_tree_s TYPE REF TO cl_salv_tree .
CONSTANTS:
c_typename_tree TYPE abap_abstypename VALUE 'CL_HRPAYNA_GUI_ALV_TREE' ,
c_typename_tree_s TYPE abap_abstypename VALUE 'CL_SALV_TREE' .
TYPES:
ty_numc3 TYPE n LENGTH 3 ,
ty_char1 TYPE c LENGTH 1 ,
ty_char8 TYPE c LENGTH 8 ,
ty_char10 TYPE c LENGTH 10 ,
ty_char15 TYPE c LENGTH 15 ,
ty_char30 TYPE c LENGTH 30 ,
ty_char31 TYPE c LENGTH 31 ,
ty_char50 TYPE c LENGTH 50 ,
ty_char100 TYPE c LENGTH 100 ,
ty_char255 TYPE c LENGTH 255 ,
ty_char1024 TYPE c LENGTH 1024 ,
ty_charmax TYPE c LENGTH 60000 .
TYPES:
ty_comp_type TYPE ty_char1 ,
ty_comp_name TYPE massd_component ,
ty_comp_path TYPE string .
TYPES:
BEGIN OF ty_s_comp_types ,
comp_type TYPE ty_comp_type ,
icon TYPE icon_d ,
description TYPE ty_char100 ,
END OF ty_s_comp_types ,
ty_t_comp_types TYPE SORTED TABLE OF ty_s_comp_types
WITH NON-UNIQUE KEY comp_type .
TYPES:
BEGIN OF ty_s_nodetab ,
id TYPE snodetext-id ,
END OF ty_s_nodetab ,
ty_t_nodetab TYPE STANDARD TABLE OF ty_s_nodetab
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_patternarea ,
sheetname TYPE ty_char31 ,
areaid TYPE snode-id ,
areaname TYPE ty_comp_name .
INCLUDE TYPE soi_area_item .
TYPES:
colprop TYPE flag ,
rowprop TYPE flag ,
END OF ty_s_patternarea ,
ty_t_patternarea TYPE STANDARD TABLE OF ty_s_patternarea .
TYPES:
BEGIN OF ty_s_ctxtmulti ,
comp_type TYPE ty_comp_type ,
comp_name TYPE ty_comp_name ,
comp_shortdescr TYPE ddtext ,
cb_relpath TYPE ty_comp_path ,
END OF ty_s_ctxtmulti ,
ty_t_ctxtmulti TYPE STANDARD TABLE OF ty_s_ctxtmulti .
TYPES:
BEGIN OF ty_s_tree_layout ,
rotate TYPE flag , " -->> rotate tree 90 degree CCW
stru TYPE flag , " -->> output structure
stru_exp_coll TYPE flag , " -->> initial state:
expanded/collapsed/...
head TYPE flag , " -->> output header
col_hier TYPE flag , " -->> output hierarchy column
col_hier_shift TYPE ty_numc3," -->> shift text of hierarchy column
col_hier_after TYPE flag , " -->> hierarchy column placed
before/after other columns
col_othr TYPE flag , " -->> output other columns (outtab)
col_othr_width TYPE ty_numc3," -->> width of other columns (outtab)
allow_formulas TYPE flag , " -->> interpret value as formula if it
starting with '='
END OF ty_s_tree_layout ,
ty_t_tree_layout TYPE STANDARD TABLE OF ty_s_tree_layout .
TYPES:
BEGIN OF ty_s_grid_layout ,
rotate TYPE flag , " -->> rotate tree 90 degree CCW
head TYPE flag , " -->> output header
head_titles TYPE ty_char1," -->> header titles: technical/
description/ both
allow_formulas TYPE flag , " -->> interpret value as formula if it
starting with '='
END OF ty_s_grid_layout ,
ty_t_grid_layout TYPE STANDARD TABLE OF ty_s_grid_layout .
TYPES:
ty_t_string_tab TYPE STANDARD TABLE OF string .
TYPES:
ty_t_int_tab TYPE HASHED TABLE OF i WITH UNIQUE KEY table_line .
TYPES:
BEGIN OF ty_s_fldval ,
field TYPE string ,
value TYPE string ,
END OF ty_s_fldval ,
ty_t_fldval TYPE STANDARD TABLE OF ty_s_fldval .
TYPES:
BEGIN OF ty_s_dataset_series_tab ,
seridx TYPE string ,
sercap TYPE string ,
dtsfld TYPE string ,
END OF ty_s_dataset_series_tab ,
ty_t_dataset_series_tab TYPE STANDARD TABLE OF ty_s_dataset_series_tab
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_mergecells_rel .
INCLUDE TYPE soi_area_item .
TYPES:
autofit_rows TYPE flag ,
autofit_cols TYPE flag ,
END OF ty_s_mergecells_rel ,
ty_t_mergecells_rel TYPE STANDARD TABLE OF ty_s_mergecells_rel
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_vbs_tables_tab ,
cb_relpath TYPE ty_comp_path , " -->> alias path (binding with
context)
cb_shortdescr TYPE ty_comp_path ,
table_name TYPE ty_char1024 ,
table_data TYPE REF TO data ,
END OF ty_s_vbs_tables_tab ,
ty_t_vbs_tables_tab TYPE STANDARD TABLE OF ty_s_vbs_tables_tab
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_sheetprotection_flags ,
selectlockedcells TYPE flag ,
selectunlockedcells TYPE flag ,
formatcells TYPE flag ,
formatcolumns TYPE flag ,
formatrows TYPE flag ,
insertcolumns TYPE flag ,
insertrows TYPE flag ,
inserthyperlinks TYPE flag ,
deletecolumns TYPE flag ,
deleterows TYPE flag ,
sort TYPE flag ,
autofilter TYPE flag ,
pivottables TYPE flag ,
objects TYPE flag ,
scenarios TYPE flag ,
END OF ty_s_sheetprotection_flags .
TYPES:
BEGIN OF ty_s_sheetprotection , " sheet protection options
mode TYPE ty_char1 ,
password TYPE string ,
cb_val_relpath TYPE ty_comp_path .
INCLUDE TYPE ty_s_sheetprotection_flags .
TYPES:
END OF ty_s_sheetprotection .
DATA:
v_retcode TYPE sysubrc ,
t_retmess TYPE bapiret2_t .
CONSTANTS:
BEGIN OF c_retcode ,
okey TYPE sysubrc VALUE '0' ,
warning TYPE sysubrc VALUE '1' ,
error TYPE sysubrc VALUE '2' ,
legacy TYPE sysubrc VALUE '3' , " -->> legacy error
END OF c_retcode ,
BEGIN OF c_sheetprotection_mode ,
off TYPE ty_char1 VALUE space ,
from_template TYPE ty_char1 VALUE '1' ,
from_context TYPE ty_char1 VALUE '2' ,
static TYPE ty_char1 VALUE '3' ,
END OF c_sheetprotection_mode ,
c_fldseq_separator TYPE ty_char1 VALUE ':' ,
c_chart_category_idx TYPE string VALUE '9999' ,
c_extension_xlsx TYPE ty_char10 VALUE '.xlsx' ,
c_extension_xlsm TYPE ty_char10 VALUE '.xlsm' .
METHODS:
msg_init ,
msg_syst_catch IMPORTING is_syst TYPE syst DEFAULT sy
iv_toplist TYPE flag DEFAULT space
iv_subj TYPE any OPTIONAL ,
msg_syst_catch2 IMPORTING is_syst TYPE syst DEFAULT sy
CHANGING ct_retmess TYPE bapiret2_t ,
msg_syst_convert IMPORTING is_syst TYPE syst DEFAULT sy
RETURNING value(rs_retmess) TYPE bapiret2 ,
msg_io_catch IMPORTING ir_error TYPE REF TO i_oi_error
iv_subj TYPE any OPTIONAL ,
msg_add IMPORTING iv_any TYPE REF TO lcl_root ,

msg_show IMPORTING value(it_retmess) TYPE bapiret2_t OPTIONAL ,


msg_show_hier IMPORTING value(it_retmess) TYPE bapiret2_t OPTIONAL ,
msg_check_errors_and_show
IMPORTING iv_any TYPE REF TO lcl_root
RETURNING value(rv_error_occurs) TYPE flag .
CLASS-DATA:
BEGIN OF s_presets_dt , " workbench Design-time presets
leftframe_width TYPE i , " -->> Screen splitter left column width
popup_tb TYPE flag , " -->> Request user confirmation of
template binding change
popup_im TYPE flag , " -->> Allow to upload an initial XLSX-
template from frontend
mesgtab_when_error TYPE flag , " -->> Activate messages tab when error
occurs
deselect_cells_no_tb TYPE flag , " -->> Losing cell range selection when
the component has no template binding
END OF s_presets_dt ,
BEGIN OF s_presets_rt , " Run-time environment settings
postprocessing_method TYPE ty_char1 , " -->> Postprocessing via MS Excel
application
END OF s_presets_rt .
CONSTANTS:
BEGIN OF c_postprocessing_method ,
ole TYPE ty_char1 VALUE abap_on , "OLE
vbs TYPE ty_char1 VALUE abap_off , "VBScript
END OF c_postprocessing_method .
CLASS-DATA:
v_msg_init TYPE flag VALUE abap_on ,
v_gui_available TYPE flag ,
v_dummy TYPE dummy ,
v_title TYPE sytitle VALUE 'XLSX Workbench Ver.4.10' ,
BEGIN OF v_text ,
url0 TYPE string , url1 TYPE string , url2 TYPE string , url3 TYPE
string ,
t001 TYPE string , t002 TYPE string , t003 TYPE string , t004 TYPE
string , t005 TYPE string ,
t006 TYPE string , t007 TYPE string , t008 TYPE string , t009 TYPE
string , t010 TYPE string ,
t011 TYPE string , t012 TYPE string , t013 TYPE string , t014 TYPE
string , t015 TYPE string ,
t016 TYPE string , t017 TYPE string , t018 TYPE string , t019 TYPE
string , t020 TYPE string ,
t021 TYPE string , t022 TYPE string , t023 TYPE string , t024 TYPE
string , t025 TYPE string ,
t026 TYPE string , t027 TYPE string , t028 TYPE string , t029 TYPE
string , t030 TYPE string ,
t031 TYPE string , t032 TYPE string , t033 TYPE string , t034 TYPE
string , t035 TYPE string ,
t036 TYPE string , t037 TYPE string , t038 TYPE string , t039 TYPE
string , t040 TYPE string ,
t041 TYPE string , t042 TYPE string , t043 TYPE string , t044 TYPE
string , t045 TYPE string ,
t046 TYPE string , t047 TYPE string , t048 TYPE string , t049 TYPE
string , t050 TYPE string ,
t051 TYPE string , t052 TYPE string , t053 TYPE string , t054 TYPE
string , t055 TYPE string ,
t056 TYPE string , t057 TYPE string , t058 TYPE string , t059 TYPE
string , t060 TYPE string ,
t061 TYPE string , t062 TYPE string , t063 TYPE string , t064 TYPE
string , t065 TYPE string ,
t066 TYPE string , t067 TYPE string , t068 TYPE string , t069 TYPE
string , t070 TYPE string ,
t071 TYPE string , t072 TYPE string , t073 TYPE string , t074 TYPE
string , t075 TYPE string ,
t076 TYPE string , t077 TYPE string , t078 TYPE string , t079 TYPE
string , t080 TYPE string ,
t081 TYPE string , t082 TYPE string , t083 TYPE string , t084 TYPE
string , t085 TYPE string ,
t086 TYPE string , t087 TYPE string , t088 TYPE string , t089 TYPE
string , t090 TYPE string ,
t091 TYPE string , t092 TYPE string , t093 TYPE string , t094 TYPE
string , t095 TYPE string ,
t096 TYPE string , t097 TYPE string , t098 TYPE string , t099 TYPE
string , t100 TYPE string ,
t101 TYPE string , t102 TYPE string , t103 TYPE string , t104 TYPE
string , t105 TYPE string ,
t106 TYPE string , t107 TYPE string , t108 TYPE string , t109 TYPE
string , t110 TYPE string ,
t111 TYPE string , t112 TYPE string , t113 TYPE string , t114 TYPE
string , t115 TYPE string ,
t116 TYPE string , t117 TYPE string , t118 TYPE string , t119 TYPE
string , t120 TYPE string ,
t121 TYPE string , t122 TYPE string , t123 TYPE string , t124 TYPE
string , t125 TYPE string ,
t126 TYPE string , t127 TYPE string , t128 TYPE string , t129 TYPE
string , t130 TYPE string ,
t131 TYPE string , t132 TYPE string , t133 TYPE string , t134 TYPE
string , t135 TYPE string ,
t136 TYPE string , t137 TYPE string , t138 TYPE string , t139 TYPE
string , t140 TYPE string ,
t141 TYPE string , t142 TYPE string , t143 TYPE string , t144 TYPE
string , t145 TYPE string ,
t146 TYPE string , t147 TYPE string , t148 TYPE string , t149 TYPE
string , t150 TYPE string ,
t151 TYPE string , t152 TYPE string , t153 TYPE string , t154 TYPE
string , t155 TYPE string ,
t156 TYPE string , t157 TYPE string , t158 TYPE string , t159 TYPE
string , t160 TYPE string ,
t161 TYPE string , t162 TYPE string , t163 TYPE string , t164 TYPE
string , t165 TYPE string ,
t166 TYPE string , t167 TYPE string , t168 TYPE string , t169 TYPE
string , t170 TYPE string ,
t171 TYPE string , t172 TYPE string , t173 TYPE string , t174 TYPE
string , t175 TYPE string ,
t176 TYPE string , t177 TYPE string , t178 TYPE string , t179 TYPE
string , t180 TYPE string ,
t181 TYPE string , t182 TYPE string , t183 TYPE string , t184 TYPE
string , t185 TYPE string ,
t186 TYPE string , t187 TYPE string , t188 TYPE string , t189 TYPE
string , t190 TYPE string ,
t191 TYPE string , t192 TYPE string , t193 TYPE string , t194 TYPE
string , t195 TYPE string ,
t196 TYPE string , t197 TYPE string , t198 TYPE string , t199 TYPE
string , t200 TYPE string ,
t201 TYPE string , t202 TYPE string , t203 TYPE string , t204 TYPE
string , t205 TYPE string ,
t206 TYPE string , t207 TYPE string , t208 TYPE string , t209 TYPE
string , t210 TYPE string ,
t211 TYPE string , t212 TYPE string , t213 TYPE string , t214 TYPE
string , t215 TYPE string ,
t216 TYPE string , t217 TYPE string , t218 TYPE string , t219 TYPE
string , t220 TYPE string ,
t221 TYPE string , t222 TYPE string , t223 TYPE string , t224 TYPE
string , t225 TYPE string ,
t226 TYPE string , t227 TYPE string , t228 TYPE string , t229 TYPE
string , t230 TYPE string ,
t231 TYPE string , t232 TYPE string , t233 TYPE string , t234 TYPE
string , t235 TYPE string ,
t236 TYPE string , t237 TYPE string , t238 TYPE string , t239 TYPE
string , t240 TYPE string ,
t241 TYPE string , t242 TYPE string , t243 TYPE string , t244 TYPE
string , t245 TYPE string ,
t246 TYPE string , t247 TYPE string , t248 TYPE string , t249 TYPE
string , t250 TYPE string ,
t251 TYPE string , t252 TYPE string , t253 TYPE string , t254 TYPE
string , t255 TYPE string ,
t256 TYPE string , t257 TYPE string , t258 TYPE string , t259 TYPE
string , t260 TYPE string ,
t261 TYPE string , t262 TYPE string , t263 TYPE string , t264 TYPE
string , t265 TYPE string ,
t266 TYPE string , t267 TYPE string , t268 TYPE string , t269 TYPE
string , t270 TYPE string ,
t271 TYPE string , t272 TYPE string , t273 TYPE string , t274 TYPE
string , t275 TYPE string ,
t276 TYPE string , t277 TYPE string , t278 TYPE string , t279 TYPE
string , t280 TYPE string ,
t281 TYPE string , t282 TYPE string , t283 TYPE string , t284 TYPE
string , t285 TYPE string ,
t286 TYPE string , t287 TYPE string , t288 TYPE string , t289 TYPE
string , t290 TYPE string ,
t291 TYPE string , t292 TYPE string , t293 TYPE string , t294 TYPE
string , t295 TYPE string ,
t296 TYPE string , t297 TYPE string , t298 TYPE string , t299 TYPE
string , t300 TYPE string ,
t301 TYPE string , t302 TYPE string , t303 TYPE string , t304 TYPE
string , t305 TYPE string ,
t306 TYPE string , t307 TYPE string , t308 TYPE string , t309 TYPE
string , t310 TYPE string ,
t311 TYPE string , t312 TYPE string , t313 TYPE string , t314 TYPE
string , t315 TYPE string ,
t316 TYPE string , t317 TYPE string , t318 TYPE string , t319 TYPE
string , t320 TYPE string ,
t321 TYPE string , t322 TYPE string , t323 TYPE string , t324 TYPE
string , t325 TYPE string ,
t326 TYPE string , t327 TYPE string , t328 TYPE string , t329 TYPE
string , t330 TYPE string ,
t331 TYPE string , t332 TYPE string , t333 TYPE string , t334 TYPE
string , t335 TYPE string ,
t336 TYPE string , t337 TYPE string , t338 TYPE string , t339 TYPE
string , t340 TYPE string ,
t341 TYPE string , t342 TYPE string , t343 TYPE string , t344 TYPE
string , t345 TYPE string ,
t346 TYPE string , t347 TYPE string , t348 TYPE string , t349 TYPE
string , t350 TYPE string ,
t351 TYPE string , t352 TYPE string , t353 TYPE string , t354 TYPE
string , t355 TYPE string ,
t356 TYPE string , t357 TYPE string , t358 TYPE string , t359 TYPE
string , t360 TYPE string ,
END OF v_text ,
BEGIN OF s_progressbar_loop ,
text TYPE ty_char100 ,
step TYPE i ,
step_tmp TYPE i ,
row_count TYPE sytabix ,
row_current TYPE sytabix ,
percent_start TYPE i ,
percent_end TYPE i ,
END OF s_progressbar_loop .
CLASS-METHODS:
class_constructor ,
init_texts ,
is_gui_available RETURNING value(rv_available) TYPE flag ,
guid_create RETURNING value(rv_guid) TYPE string ,
format_path IMPORTING iv_source TYPE any
CHANGING cv_formatted TYPE any ,
path_file_split IMPORTING iv_fullpath TYPE any
EXPORTING ev_path TYPE any
ev_file TYPE any ,
progressbar IMPORTING iv_percentage TYPE any DEFAULT 50
iv_text TYPE any OPTIONAL ,
progressbar_loop_init
IMPORTING it_tab TYPE ANY TABLE OPTIONAL "
-->> the filled table (on which apply LOOP)
iv_step TYPE any DEFAULT 1 "
-->> step (records count) for refreshing the progress bar
iv_percent_start TYPE any DEFAULT 0 "
-->> begin percent
iv_percent_end TYPE any DEFAULT 99 "
-->> end percent
iv_text TYPE any OPTIONAL , "
-->> message text
progressbar_loop_actualize ,
get_fullpath IMPORTING iv_parent_fullpath TYPE any
iv_relpath TYPE any
RETURNING value(rv_fullpath) TYPE ty_comp_path ,
tech_presets_dt_load ,
tech_presets_dt_init RETURNING value(rs_disextract) TYPE disextract ,
tech_presets_rt_load ,
tech_presets_rt_init RETURNING value(rs_disextract) TYPE disextract .

ENDCLASS . "lcl_root DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_root IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_root IMPLEMENTATION .
METHOD class_constructor .
init_texts( ) .
v_gui_available = is_gui_available( ) .
ENDMETHOD . "class_constructor
METHOD format_path .
DATA:
lv_length_source TYPE i ,
lv_length_formatted TYPE i ,
lv_offset TYPE i .

CHECK iv_source IS NOT INITIAL .

lv_length_source = STRLEN( iv_source ) .


DESCRIBE FIELD cv_formatted LENGTH lv_length_formatted
IN CHARACTER MODE .

IF lv_length_formatted GE lv_length_source .
cv_formatted = iv_source .
ELSE .
lv_offset = lv_length_source - lv_length_formatted + 3 .
cv_formatted(3) = '...' .
cv_formatted+3 = iv_source+lv_offset .
ENDIF .
ENDMETHOD . "format_path
METHOD path_file_split .
DATA:
lv_last_occurrence TYPE i ,
lv_offset TYPE i ,
ls_result_tab TYPE match_result ,
lt_result_tab TYPE match_result_tab .

FIND ALL OCCURRENCES OF '/' IN iv_fullpath


RESULTS lt_result_tab .

lv_last_occurrence = LINES( lt_result_tab ) .


CHECK lv_last_occurrence GT 0 .

READ TABLE lt_result_tab INTO ls_result_tab INDEX lv_last_occurrence .


CHECK sy-subrc EQ 0.
lv_offset = ls_result_tab-offset + ls_result_tab-length .

ev_path = iv_fullpath(lv_offset) .

CHECK lv_offset LT STRLEN( iv_fullpath ) .


ev_file = iv_fullpath+lv_offset .

ENDMETHOD . "PATH_FILE_SPLIT
METHOD init_texts .

CASE sy-langu .
WHEN 'R' .
v_text-url0 = 'https://sites.google.com/site/sapxlwb/home' .
v_text-url1 =
'https://sites.google.com/site/sapxlwb/home/rus/use/tutorials' .
v_text-url2 =
'https://sites.google.com/site/sapxlwb/home/rus/use/tutorials/form/user_interface'
.
v_text-url3 =
'https://sites.google.com/site/sapxlwb/home/rus/use/tutorials/form/postprocessing'
.
WHEN OTHERS .
v_text-url0 = 'https://sites.google.com/site/sapxlwb/home' .
v_text-url1 =
'https://sites.google.com/site/sapxlwb/home/eng/use/tutorials' .
v_text-url2 =
'https://sites.google.com/site/sapxlwb/home/eng/use/tutorials/form/user_interface'
.
v_text-url3 =
'https://sites.google.com/site/sapxlwb/home/eng/use/tutorials/form/postprocessing'
.
ENDCASE .

v_text-t001 = 'Common messages'(001) .


v_text-t002 = 'Messages'(002) .
v_text-t003 = 'Components of the form'(003) .
v_text-t004 = 'Specify valid name of the context'(004) .
v_text-t005 = 'Requested node was not found in the structure'(005) .
v_text-t006 = 'Relevant nodes of the context are not found'(006) .
v_text-t007 = 'Sheets'(007) .
v_text-t008 = 'Sheet'(008) .
v_text-t009 = 'Loop'(009) .
v_text-t010 = 'Pattern'(010) .
v_text-t011 = 'Value'(011) .
v_text-t012 = 'Folder'(012) .
v_text-t013 = 'Specify a name of the form'(013) .
v_text-t014 = 'A form already exists with the name'(014) .
v_text-t015 = 'Form data is interupted'(015) .
v_text-t016 = 'Form is not found'(016) .
v_text-t017 = 'Form'(017) .
v_text-t018 = 'is locked by the user'(018) .
v_text-t019 = 'A name of the component is not unique'(019) .
v_text-t020 = 'Context binding is incorrect'(020) .
v_text-t021 = 'on the upper levels'(021) .
v_text-t022 = 'Context binding is missing'(022) .
v_text-t023 = 'Workbook must have at least one visible Worksheet'(023) .
v_text-t024 = 'Chars number'(024) .
v_text-t025 = 'overlap the field length'(025) .
v_text-t026 = 'problem occurs with component'(026) .
v_text-t027 = 'A component'(027) .
v_text-t028 = 'already presents'(028) .
v_text-t029 = 'Binding with Sheet of the template missing'(029) .
v_text-t030 = 'Template does not contain a Sheet'(030) .
v_text-t031 = 'is missing'(031) .
v_text-t032 = 'An area is not specified in the template'(032) .
v_text-t033 = 'A problem with area determination occurs'(033) .
v_text-t034 = 'An area is beyond the scope of upper-level areas'(034) .
v_text-t035 = 'is inappropriate under the component'(035) .
v_text-t036 = 'Form is inactive (not activated)'(036) .
v_text-t037 = 'Development class is not specified'(037) .
v_text-t038 = 'Firstly, save the form'(038) .
v_text-t039 = 'Component name is incorrect'(039) .
v_text-t040 = 'Component with same name already exists'(040) .
v_text-t041 = 'Moving of the component is impossible'(041) .
v_text-t042 = 'Window mode'(042) .
v_text-t043 = 'Actualize'(043) .
v_text-t044 = 'Save'(044) .
v_text-t045 = 'Save as...'(045) .
v_text-t046 = 'Activate'(046) .
v_text-t047 = 'Send mail'(047) .
v_text-t050 = 'The working directory is not determined'(050) .
v_text-t051 = 'Select an area on the actual template sheet'(051) .
v_text-t052 = 'Only single area selection is required'(052) .
v_text-t053 = 'Positioning on the sheet is impossible'(053) .
v_text-t054 = 'Excel is not responding. |Perhaps a cell is being edited
now'(054) .
v_text-t055 = 'Form structure'(055) .
v_text-t056 = 'Status'(056) .
v_text-t057 = 'Direction'(057) .
v_text-t058 = 'Description'(058) .
v_text-t061 = 'Delete component'(061) .
v_text-t062 = 'Create component'(062) .
v_text-t063 = 'Move component UP'(063) .
v_text-t064 = 'Move component DOWN'(064) .
v_text-t066 = 'Select a node'(066) .
v_text-t067 = 'Form properties'(067) .
v_text-t068 = 'Component'(068) .
v_text-t069 = 'Properties of the component'(069) .
v_text-t070 = 'Messages'(070) .
v_text-t072 = 'Error Creating Control'(072) .
v_text-t073 = 'Name of the context'(073) .
v_text-t074 = '<...not assigned...>'(074) .
v_text-t075 = 'Form description'(075) .
v_text-t076 = 'Name/ description'(076) .
v_text-t077 = 'Binding with context'(077) .
v_text-t078 = '(optional)'(078) .
v_text-t079 = 'Appearance at runtime:'(079) .
v_text-t080 = 'Always'(080) .
v_text-t081 = 'Only when field contains value'(081) .
v_text-t082 = 'Sheet name at runtime:'(082) .
v_text-t083 = 'Auto'(083) .
v_text-t084 = 'get Value from field'(084) .
v_text-t085 = 'convert value to ext.format'(085) .
v_text-t086 = 'Binding with sheet of the template'(086) .
v_text-t087 = 'Area in the template'(087) .
v_text-t088 = 'Output direction at runtime'(088) .
v_text-t089 = 'Right'(089) .
v_text-t090 = 'Down'(090) .
v_text-t091 = 'Copy properties'(091) .
v_text-t092 = 'Rows'(092) .
v_text-t093 = 'Columns'(093) .
v_text-t094 = 'Group'(094) .
v_text-t095 = 'The entire value'(095) .
v_text-t096 = 'first'(096) .
v_text-t097 = 'characters'(097) .
v_text-t098 = 'from position'(098) .
v_text-t099 = 'all subsequent'(099) .
v_text-t100 = 'Operation was terminated by the user'(100) .
v_text-t101 = 'Delete form'(101) .
v_text-t102 = 'was deleted'(102) .
v_text-t103 = 'Allow to upload an initial XLSX-template from frontend'(103) .
v_text-t104 = 'Function has not been processed'(104) .
v_text-t105 = 'Notice!'(105) .
v_text-t106 = 'Continue'(106) .
v_text-t107 = 'Cancel'(107) .
v_text-t108 = 'Specify a unique name of the component'(108) .
v_text-t109 = 'Relevant nodes were not found in the context'(109) .
v_text-t110 = 'Component is not allowed for choice'(110) .
v_text-t111 = 'Field length'(111) .
v_text-t112 = 'Error while searching sheets in the template'(112) .
v_text-t113 = 'Select a sheet of the template'(113) .
v_text-t114 = 'Edit'(114) .
v_text-t115 = 'Create'(115) .
v_text-t116 = 'Tmpl.'(116) .
v_text-t117 = 'Copy'(117) .
v_text-t118 = 'Delete'(118) .
v_text-t119 = 'Moving of the component'(119) .
v_text-t120 = 'Relevant components are missing'(120) .
v_text-t121 = 'Choose a component'(121) .
v_text-t122 = 'Removе the component from the form'(122) .
v_text-t123 = 'context'(123) .
v_text-t124 = 'Specify a name of the context (data dictionary type)'(124) .
v_text-t125 = 'Process is flowing in OFF-line mode'(125) .
v_text-t126 = 'Specify new value'(126) .
v_text-t127 = 'Firstly, eliminate problems due context binding'(127) .
v_text-t128 = 'Removing of the binding'(128) .
v_text-t129 = 'Delete connection with field ?'(129) .
v_text-t130 = 'The property is irrelevant for component type'(130) .
v_text-t131 = 'Delete connection with a sheet ?'(131) .
v_text-t132 = 'Specify an area on the sheet:'(132) .
v_text-t133 = 'Connection with selected area in the template will be
created'(133) .
v_text-t134 = 'END of the list is reached'(134) .
v_text-t135 = 'TOP of the list is reached'(135) .
v_text-t136 = 'Search the XLSX-form'(136) .
v_text-t137 = 'Data was not found'(137) .
v_text-t138 = 'Leave the workbench ?'(138) .
v_text-t139 = 'Drawing'(139) .
v_text-t140 = 'Source'(140) .
v_text-t141 = 'Rawdata from context field'(141) .
v_text-t142 = 'Drawing from template'(142) .
v_text-t143 = 'Select a drawing on the worksheet'(143) .
v_text-t144 = 'There are no drawings on the worksheet'(144) .
v_text-t145 = 'Name of the drawing is not specified'(145) .
v_text-t146 = 'does not contain any drawings'(146) .
v_text-t147 = 'Technical information'(147) .
v_text-t148 = 'Created by'(148) .
v_text-t149 = 'Changed by'(149) .
v_text-t150 = 'Package'(150) .
v_text-t151 = 'Form must contain at less one sheet'(151) .
v_text-t152 = 'Print titles'(152) .
v_text-t153 = 'Preventing of automatic page breaks (inside)'(153) .
v_text-t154 = 'Horizn.'(154) .
v_text-t155 = 'Vertic.'(155) .
v_text-t156 = 'Extend unbroken area'(156) .
v_text-t157 = 'This option will be implemented via OLE on FrontEnd'(157) .
v_text-t158 = 'shift pagebreak to the left-side border'(158) .
v_text-t159 = 'shift pagebreak: & column(s) outside the left border'(159) .
v_text-t160 = 'shift pagebreak to the top border'(160) .
v_text-t161 = 'shift pagebreak: & row(s) higher than top border'(161) .
v_text-t162 = 'column(s)'(162) .
v_text-t163 = 'row(s)'(163) .
v_text-t164 = 'Patterns are not found'(164) .
v_text-t165 = 'Select a pattern'(165) .
v_text-t166 = 'Save as...'(166) .
v_text-t167 = 'New form name'(167) .
v_text-t168 = 'Specify another form name'(168) .
v_text-t169 = 'Form with same name already exists. Overwrite it ?'(169) .
v_text-t170 = 'Form has been saved'(170) .
v_text-t171 = 'Form has been activated'(171) .
v_text-t172 = 'Clone component'(172) .
v_text-t173 = 'an actual data were not obtained from Excel !'(173) .
v_text-t174 = 'Tree'(174) .
v_text-t175 = 'Pattern (resizable)'(175) .
v_text-t176 = 'Merge cells'(176) .
v_text-t177 = 'Span rows'(177) .
v_text-t178 = 'Span columns'(178) .
v_text-t179 = 'Specify area inside single row'(179) .
v_text-t180 = 'Specify area inside single column'(180) .
v_text-t181 = 'Select components to be added'(181) .
v_text-t182 = 'Follow to Excel menu: DATA->OUTLINE'(182) .
v_text-t183 = 'and uncheck SUMMARY ROWS BELOW DETAIL'(183) .
v_text-t184 = 'Preparing of form data. Step:'(184) .
v_text-t185 = 'Layout options'(185) .
v_text-t186 = 'rotate 90 CCW'(186) .
v_text-t187 = 'standard orientation'(187) .
v_text-t188 = 'structure'(188) .
v_text-t189 = 'header'(189) .
v_text-t190 = 'hierarchy column'(190) .
v_text-t191 = 'shift'(191) .
v_text-t192 = 'other columns'(192) .
v_text-t193 = 'All Expanded'(193) .
v_text-t194 = 'All Collapsed'(194) .
v_text-t195 = 'Draft'(195) .
v_text-t196 = 'As area specify 2x2(or more) |cell range (see
documentation)'(196) .
v_text-t197 = 'Writing of data to XLSX-file'(197) .
v_text-t198 = 'Building of tree, node:'(198) .
v_text-t199 = 'Before'(199) .
v_text-t200 = 'After'(200) .
v_text-t201 = 'width from f.cat.'(201) .
v_text-t202 = 'multiplier'(202) .
v_text-t203 = 'Nothing to output (Structure/ Hier.col/ Other cols)'(203) .
v_text-t204 = 'Actual (from TreeControl)'(204) .
v_text-t205 = '. Initial state of nodes:'(205) .
v_text-t206 = 'Presets'(206) .
v_text-t207 = 'User guide'(207) .
v_text-t208 = 'Requesting of user confirmation due template binding
change'(208) .
v_text-t209 = 'Upload XLSX-template from frontend'(209) .
v_text-t210 = 'Import'(210) .
v_text-t211 = 'Export'(211) .
v_text-t212 = 'Help'(212) .
v_text-t213 = 'Create the form structure automatically ?'(213) .
v_text-t214 = 'Mass processing'(214) .
v_text-t215 = 'Select all components'(215) .
v_text-t216 = 'Matrix (one char per cell)'(216) .
v_text-t217 = 'Interval:'(217) .
v_text-t218 = 'Do not create'(218) .
v_text-t219 = 'Form name'(219) .
v_text-t220 = 'Shift template binding coordinates'(220) .
v_text-t221 = 'Nothing to change'(221) .
v_text-t222 = 'Sheet is being prepared'(222) .
v_text-t223 = 'Insert page break (at the beginning)'(223) .
v_text-t224 = 'Print out'(224) .
v_text-t225 = 'Grid'(225) .
v_text-t226 = 'columns'(226) .
v_text-t227 = 'available columns set'(227) .
v_text-t228 = 'Setting up columns in the output table'(228) .
v_text-t229 = 'Tech.names'(229) .
v_text-t230 = 'Descriptions'(230) .
v_text-t231 = 'No column list is specified'(231) .
v_text-t232 = 'Chart'(232) .
v_text-t233 = 'Model'(233) .
v_text-t234 = 'Dataset'(234) .
v_text-t235 = 'Series'(235) .
v_text-t236 = 'Table row'(236) .
v_text-t237 = 'Column'(237) .
v_text-t238 = 'On the sheet'(238) .
v_text-t239 = 'Select a Chart model on the worksheet'(239) .
v_text-t240 = 'There are no Chart models on the worksheet'(240) .
v_text-t241 = 'Name of the Chart model is not specified'(241) .
v_text-t242 = 'does not contain any Charts'(242) .
v_text-t243 = 'Dataset is not specified'(243) .
v_text-t244 = 'Incorrect Dataset is specified'(244) .
v_text-t245 = 'Link between Chart series and Dataset columns'(245) .
v_text-t246 = 'from'(246) .
v_text-t247 = 'assignment'(247) .
v_text-t248 = 'has problems'(248) .
v_text-t249 = 'Dataset: Grid has hidden column'(249) .
v_text-t250 = 'Category Axis labels'(250) .
v_text-t251 = 'Chart title'(251) .
v_text-t252 = 'Series name'(252) .
v_text-t253 = 'from Model (statically)'(253) .
v_text-t254 = 'from Context'(254) .
v_text-t255 = 'from Dataset grid column captions'(255) .
v_text-t256 = 'File'(256) .
v_text-t257 = 'is saved in the directory'(257) .
v_text-t258 = 'Runtime state'(258) .
v_text-t259 = 'Visible'(259) .
v_text-t260 = 'Hidden'(260) .
v_text-t261 = 'Row processing'(261) .
v_text-t262 = 'All rows'(262) .
v_text-t263 = 'Row'(263) .
v_text-t264 = 'from'(264) .
v_text-t265 = 'to'(265) .
v_text-t266 = '(0 = no limit)'(266) .
v_text-t267 = 'Interval is incorrect'(267) .
v_text-t268 = 'Formula'(268) .
v_text-t269 = 'allow formulas'(269) .
v_text-t270 = 'Activate messages tab when error occurs'(270) .
v_text-t271 = 'Losing cell range selection when the component has no template
binding'(271) .
v_text-t272 = 'Mark in the text'(272) .
v_text-t273 = 'Char.sequence, which has to be replaced by the Value'(273) .
v_text-t274 = 'Chart Sheet can contain the Charts only'(274) .
v_text-t275 = 'AutoFit for merged cells'(275) .
v_text-t276 = 'Off'(276) .
v_text-t277 = 'Row height'(277) .
v_text-t278 = 'Col.width'(278) .
v_text-t279 = 'Properties of the Grid columns'(279) .
v_text-t280 = 'Problem while OLE/VBScript post-processing'(280) .
v_text-t281 = 'AutoFit merged cells'(281) .
v_text-t282 = 'Macros initialization error'(282) .
v_text-t283 = 'Macros execution error'(283) .
v_text-t284 = 'Design-time presets'(284) .
v_text-t285 = 'Run-time presets'(285) .
v_text-t286 = 'Method for post-processing'(286) .
v_text-t287 = 'Final post-processing'(287) .
v_text-t288 = 'Provide tables'(288) .
v_text-t289 = 'There are no changes'(289) .
v_text-t290 = 'Sub procedure "Entry" is not found or incorrect |in the final
post-processing VBScript'(290) .
v_text-t291 = 'Tables for transferring data to Final VBScript post-
processing'(291) .
v_text-t292 = 'Specify Table name'(292) .
v_text-t293 = 'Table name is not unique'(293) .
v_text-t294 = 'Table name'(294) .
v_text-t295 = 'Error accessing MS Excel application'(295) .
v_text-t296 = 'as Child'(296) .
v_text-t297 = 'as Sibling'(297) .
v_text-t298 = 'Sheet protection'(298) .
v_text-t299 = 'From template'(299) .
v_text-t300 = 'From context'(300) .
v_text-t301 = 'Static'(301) .
v_text-t302 = 'Select Locked Cells'(302) .
v_text-t303 = 'Select Unlocked Cells'(303) .
v_text-t304 = 'Format Cells'(304) .
v_text-t305 = 'Format Columns'(305) .
v_text-t306 = 'Format Rows'(306) .
v_text-t307 = 'Insert Columns'(307) .
v_text-t308 = 'Insert Rows'(308) .
v_text-t309 = 'Insert Hyperlinks'(309) .
v_text-t310 = 'Delete Columns'(310) .
v_text-t311 = 'Delete Rows'(311) .
v_text-t312 = 'Sort'(312) .
v_text-t313 = 'Auto Filter'(313) .
v_text-t314 = 'Pivot Tables'(314) .
v_text-t315 = 'Objects'(315) .
v_text-t316 = 'Scenarios'(316) .
v_text-t317 = 'Allow all users of this worksheet to:'(317) .
v_text-t318 = 'Password to unprotect sheet:'(318) .
v_text-t319 = 'Other'(319) .
v_text-t320 = 'Components must have same type'(320) .
v_text-t321 = 'Specify target parent component'(321) .
v_text-t322 = 'Renaming features'(322) .
v_text-t323 = 'add Prefix'(323) .
v_text-t324 = 'add Postfix'(324) .
v_text-t325 = 'Find text...'(325) .
v_text-t326 = '... and replace with'(326) .
v_text-t327 = 'File format'(327) .
v_text-t328 = 'Without VBA-macro .XLSX'(328) .
v_text-t329 = 'VBA-macro-enabled .XLSM'(329) .
v_text-t330 = 'Name of Cell range'(330) .
v_text-t331 = 'Incorrect name of cell range'(331) .
v_text-t332 = 'The most probable reason is'(332) .
v_text-t333 = 'Your current SAP GUI version'(333) .
v_text-t334 = 'does not work properly with MS Excel.'(334) .
v_text-t335 = 'Try to update SAP GUI to latest version.'(335) .
v_text-t336 = 'Error while reading template file'(336) .
v_text-t337 = 'Size'(337) .
v_text-t338 = 'Fit within area'(338) .
v_text-t339 = 'From context field'(339) .
v_text-t340 = 'Height'(340) .
v_text-t341 = 'Width'(341) .
v_text-t342 = 'Root node cannot be removed'(342) .
v_text-t343 = 'Value Axis title'(343) .
v_text-t344 = 'Category Axis title'(344) .
v_text-t345 = 'Changing of this option can cause file error'(345) .
v_text-t346 = 'Other options'(346) .
v_text-t347 = 'Keep named ranges of template'(347) .
v_text-t348 = 'Data validation'(348) .
v_text-t349 = 'Attributes (from template)'(349) .
v_text-t350 = 'Table for dynamic substitution (attribute/value)'(350) .
v_text-t351 = 'Value (Formula)'(351) .
v_text-t352 = 'From Dataset (Grid)'(352) .
v_text-t353 = 'Field of Dataset is missing'(353) .
v_text-t354 = 'Field of Dataset is incorrect'(354) .
v_text-t355 = 'Place relative to Subarea'(355) .
v_text-t356 = 'Before'(356) .
v_text-t357 = 'After'(357) .

DEFINE mk_settext .
if &1 ca 'абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
.
else .
&1 = &2 .
endif .
END-OF-DEFINITION .
CASE sy-langu .
WHEN 'R' .
* special case for Russian logon language:
* set values directly, if text elements (and translations) are not created
mk_settext:
v_text-t001 'Общие сообщения' ,
v_text-t002 'Сообщения' ,
v_text-t003 'Компоненты формуляра' ,
v_text-t004 'Укажите действительное имя контекста' ,
v_text-t005 'в структуре не найден запрашиваемый узел' ,
v_text-t006 'Подходящих узлов контекста не найдено' ,
v_text-t007 'Листы' ,
v_text-t008 'Лист' ,
v_text-t009 'Цикл' ,
v_text-t010 'Паттерн' ,
v_text-t011 'Значение' ,
v_text-t012 'Папка' ,
v_text-t013 'Укажите имя формуляра' ,
v_text-t014 'Уже существует формуляр с именем' ,
v_text-t015 'Данные формуляра повреждены' ,
v_text-t016 'форуляр не найден' ,
v_text-t017 'Формуляр' ,
v_text-t018 'блокирован пользователем' ,
v_text-t019 'Имя компонента не уникально:' ,
v_text-t020 'Некорректная связь с контекстом' ,
v_text-t021 'на пред.уровнях' ,
v_text-t022 'Отсутствует связь с контекстом' ,
v_text-t023 'Книга должна иметь не менее одного видимого листа' ,
v_text-t024 'Кол-во симв.' ,
v_text-t025 'превышает длину поля' ,
v_text-t026 'проблемы с компонентом' ,
v_text-t027 'Компонент' ,
v_text-t028 'уже присутствует' ,
v_text-t029 'Отсутствует связь с листом шаблона' ,
v_text-t030 'В шаблоне не найден Лист' ,
v_text-t031 'отсутствует' ,
v_text-t032 'Область в шаблоне не определена' ,
v_text-t033 'Проблема определения области шаблона' ,
v_text-t034 'Область в шаблоне выходит за рамки вышест.областей' ,
v_text-t035 'недопустим под компонентом' ,
v_text-t036 'Формуляр не активен (не активирован)' ,
v_text-t037 'Не указан класс разработки' ,
v_text-t038 'Сначала сохраните формуляр' ,
v_text-t039 'Имя компонента некорректно' ,
v_text-t040 'Компонент с таким именем уже существует' ,
v_text-t041 'Перемещение компонента невозможно' ,
v_text-t042 'Режим окна' ,
v_text-t043 'Актуализировать' ,
v_text-t044 'Сохранить' ,
v_text-t045 'Сохранить как...' ,
v_text-t046 'Активировать' ,
v_text-t047 'Отправить по почте' ,
v_text-t050 'Рабочая директория не определена' ,
v_text-t051 'Выделите область на актуальном листе' ,
v_text-t052 'Требуется выделение только одной области' ,
v_text-t053 'Невозможно позиционирование на листе' ,
v_text-t054 'Excel не отвечает. |Возможно, в данный момент редактируется
ячейка' ,
v_text-t055 'Структура формуляра' ,
v_text-t056 'Статус' ,
v_text-t057 'Направление' ,
v_text-t058 'Описание' ,
v_text-t061 'Удалить компонент' ,
v_text-t062 'Создать компонент' ,
v_text-t063 'Передв.компонент вверх' ,
v_text-t064 'Передв.компонент вниз' ,
v_text-t066 'Выделите узел структуры' ,
v_text-t067 'Свойства формуляра' ,
v_text-t068 'Компонент' ,
v_text-t069 'Свойства компонента' ,
v_text-t070 'Сообщения' ,
v_text-t072 'Ошибка создания контрола' ,
v_text-t073 'Наименование контекста' ,
v_text-t074 '<...не присвоено...>' ,
v_text-t075 'Описание формуляра' ,
v_text-t076 'Имя/ Описание' ,
v_text-t077 'Связь с контекстом' ,
v_text-t078 '(опционально)' ,
v_text-t079 'Появление при выводе:' ,
v_text-t080 'Всегда' ,
v_text-t081 'При наличии значения в поле' ,
v_text-t082 'Наименование при выводе:' ,
v_text-t083 'Авто' ,
v_text-t084 'Значение из поля' ,
v_text-t085 'преобр.во внешний формат' ,
v_text-t086 'Связь с листом шаблона' ,
v_text-t087 'Область в шаблоне' ,
v_text-t088 'Направление вывода' ,
v_text-t089 'Вправо' ,
v_text-t090 'Вниз' ,
v_text-t091 'Копировать свойства' ,
v_text-t092 'Строк' ,
v_text-t093 'Столбцов' ,
v_text-t094 'Группировка' ,
v_text-t095 'Значение полностью' ,
v_text-t096 'первые' ,
v_text-t097 'символов' ,
v_text-t098 'с позиции' ,
v_text-t099 'все последующие' ,
v_text-t100 'Операция отменена пользователем' ,
v_text-t101 'Удалить формуляр' ,
v_text-t102 'удален' ,
v_text-t103 'Включить функцию загрузки нач.XLSX-шаблона с frontend' ,
v_text-t104 'Команда не обрабатывается' ,
v_text-t105 'Внимание!' ,
v_text-t106 'Продолжить' ,
v_text-t107 'Отменить' ,
v_text-t108 'Укажите уникальное наименование компонента' ,
v_text-t109 'Подходящих узлов контекста не найдено' ,
v_text-t110 'Компонент недоступен для выбора' ,
v_text-t111 'Общая длина поля' ,
v_text-t112 'Ошибка поиска Листов в шаблоне' ,
v_text-t113 'Выберите лист шаблона' ,
v_text-t114 'Изменить' ,
v_text-t115 'Создать' ,
v_text-t116 'Шабл.' ,
v_text-t117 'Скопировать' ,
v_text-t118 'Удалить' ,
v_text-t119 'Перемещение компонента' ,
v_text-t120 'Нет подходящих типов компонентов' ,
v_text-t121 'Выберите компонент' ,
v_text-t122 'Удаление компонента формы' ,
v_text-t123 'контекст' ,
v_text-t124 'Укажите имя контекста (тип данных в словаре)' ,
v_text-t125 'Процесс протекает в OFF-line режиме' ,
v_text-t126 'Укажите новое значение' ,
v_text-t127 'Сначала устраните проблему связи с контекстом' ,
v_text-t128 'Удаление связи' ,
v_text-t129 'Удалить ссылку на поле ?' ,
v_text-t130 'Свойство не релевантно для данного типа узла' ,
v_text-t131 'Удалить связь с Листом ?' ,
v_text-t132 'Укажите область на листе:' ,
v_text-t133 'Будет создана связь с выделенной областью в шаблоне' ,
v_text-t134 'Достигнут конец списка' ,
v_text-t135 'Достигнуто начало списка' ,
v_text-t136 'Поиск XLSX-формуляра' ,
v_text-t137 'Данные не найдены' ,
v_text-t138 'Выйти из редактора?' ,
v_text-t139 'Рисунок' ,
v_text-t140 'Источник' ,
v_text-t141 'Данные из поля контекста' ,
v_text-t142 'Рисунок из шаблона' ,
v_text-t143 'Выберите рисунок на листе' ,
v_text-t144 'Не найдено рисунков на листе' ,
v_text-t145 'Наименование рисунка не задано' ,
v_text-t146 'не содержит рисунков' ,
v_text-t147 'Техническая информация' ,
v_text-t148 'Создано' ,
v_text-t149 'Изменено' ,
v_text-t150 'Пакет' ,
v_text-t151 'В формуляре должен быть минимум один лист' ,
v_text-t152 'Печать на каждой странице' ,
v_text-t153 'Предотвр.автоматич.разрыва страниц (внутри)' ,
v_text-t154 'Горизт.' ,
v_text-t155 'Вертик.' ,
v_text-t156 'Продлить неразрывную область' ,
v_text-t157 'Опция будет реализована на FrontEnd через OLE' ,
v_text-t158 'Перенос разрыва к левой границе' ,
v_text-t159 'Перенос разрыва на & стлб за пределы левой границы' ,
v_text-t160 'Перенос разрыва к верхней границе' ,
v_text-t161 'Перенос разрыва на & стрк выше, чем верхняя граница' ,
v_text-t162 'стлб.' ,
v_text-t163 'стрк.' ,
v_text-t164 'Паттерны не найдены' ,
v_text-t165 'Выберите паттерн' ,
v_text-t166 'Сохранить как...' ,
v_text-t167 'Новое имя формуляра' ,
v_text-t168 'Укажите другое имя формуляра' ,
v_text-t169 'Формуляр с таким именем уже существует. Заменить?' ,
v_text-t170 'Формуляр сохранен' ,
v_text-t171 'Формуляр активирован' ,
v_text-t172 'Дублировать компонент' ,
v_text-t173 'Актуальные данные не были получены из Excel !' ,
v_text-t174 'Дерево' ,
v_text-t175 'Паттерн (масштабир.)' ,
v_text-t176 'Объединение ячеек' ,
v_text-t177 'Охват строк' ,
v_text-t178 'Охват столбцов' ,
v_text-t179 'Укажите область высотой в одну строку' ,
v_text-t180 'Укажите область шириной в один столбец' ,
v_text-t181 'Выберите компоненты для добавления' ,
v_text-t182 'В меню Excel: Данные > Структура' ,
v_text-t183 'уберите галочку ИТОГОВЫЕ СТРОКИ ПОД ДАННЫМИ' ,
v_text-t184 'Подготовка данных формуляра. Шаг:' ,
v_text-t185 'Опции вывода' ,
v_text-t186 'развернуть на 90 градусов' ,
v_text-t187 'стандартная ориентация' ,
v_text-t188 'структура' ,
v_text-t189 'заголовок' ,
v_text-t190 'столбец иерархии' ,
v_text-t191 'отступ' ,
v_text-t192 'остальные столбцы' ,
v_text-t193 'Все развернуты' ,
v_text-t194 'Все свернуты' ,
v_text-t195 'Черновик' ,
v_text-t196 'Укажите область минимум |2x2 ячейки (см.документацию)' ,
v_text-t197 'Запись данных в XLSX-файл' ,
v_text-t198 'Построение дерева, узел:' ,
v_text-t199 'В начале' ,
v_text-t200 'В конце' ,
v_text-t201 'ширина поля из ф.кат.' ,
v_text-t202 'множитель' ,
v_text-t203 'Нечего выводить (Структура/ Столб.иерархии/ Др.столбцы)' ,
v_text-t204 'Актуаль.(из TreeControl)' ,
v_text-t205 '. Началь.состояние узлов:' ,
v_text-t206 'Настройки' ,
v_text-t207 'Руководство пользователя' ,
v_text-t208 'Запрос подтвержд.действия при изменении связи с шаблоном' ,
v_text-t209 'Загрузить XLSX-шаблон с локального компьютера' ,
v_text-t210 'Импорт' ,
v_text-t211 'Экспорт' ,
v_text-t212 'Справка' ,
v_text-t213 'Создать структуру формуляра автоматически ?' ,
v_text-t214 'Массовые операции' ,
v_text-t215 'Выделить все компоненты' ,
v_text-t216 'Матрица (каждая буква - в отдельной ячейке)' ,
v_text-t217 'Интервал:' ,
v_text-t218 'Не создавать' ,
v_text-t219 'Наименование формуляра' ,
v_text-t220 'Сдвиг координат связи с шаблоном' ,
v_text-t221 'Нет изменений' ,
v_text-t222 'Лист подготавливается' ,
v_text-t223 'Вставить разрыв страницы (в начале)' ,
v_text-t224 'Печать' ,
v_text-t225 'Грид' ,
v_text-t226 'выбор столбцов' ,
v_text-t227 'доступные столбцы' ,
v_text-t228 'Настройка столбцов в выходной таблице' ,
v_text-t229 'Тех.имена' ,
v_text-t230 'Описания' ,
v_text-t231 'Список выводимых столбцов не задан' ,
v_text-t232 'Диаграмма' ,
v_text-t233 'Макет' ,
v_text-t234 'Набор данных' ,
v_text-t235 'Ряды' ,
v_text-t236 'Строка таблицы' ,
v_text-t237 'Столбец' ,
v_text-t238 'На листе' ,
v_text-t239 'Выберите макет Диаграммы на листе' ,
v_text-t240 'Не найдено Диаграмм на листе' ,
v_text-t241 'Наименование макета Диаграммы не задано' ,
v_text-t242 'не содержит Диаграмму' ,
v_text-t243 'Набор данных не указан' ,
v_text-t244 'Указан некорректный Набор данных' ,
v_text-t245 'Связь между Рядами диаграммы и Столбцами ист.данных' ,
v_text-t246 'из' ,
v_text-t247 'присвоение' ,
v_text-t248 'имеет проблемы' ,
v_text-t249 'Набор данных: в Гриде скрыт столбец' ,
v_text-t250 'Подписи Оси Категорий' ,
v_text-t251 'Название диаграммы' ,
v_text-t252 'Имена рядов' ,
v_text-t253 'из Макета (статично)' ,
v_text-t254 'из Контекста' ,
v_text-t255 'из названий столбцов Грида набора данных' ,
v_text-t256 'Файл' ,
v_text-t257 'выгружен в директорию' ,
v_text-t258 'При выводе' ,
v_text-t259 'Видимый' ,
v_text-t260 'Скрыт' ,
v_text-t261 'Обработка строк' ,
v_text-t262 'Все строки' ,
v_text-t263 'Строка' ,
v_text-t264 'с' ,
v_text-t265 'по' ,
v_text-t266 '(0 = НеОгранич.)' ,
v_text-t267 'Интервал некорректен' ,
v_text-t268 'Формула' ,
v_text-t269 'разрешить формулы' ,
v_text-t270 'Активировать вкладку сообщений при наличии ошибок' ,
v_text-t271 'Потеря выделения ячеек для компонента, не имеющего связи с
шаблоном' ,
v_text-t272 'Метка в тексте' ,
v_text-t273 'Последоват-сть символов, которую следует заменить
Значением' ,
v_text-t274 'Лист Диаграмм может содержать только Диаграммы' ,
v_text-t275 'Автоподбор размеров объединенных ячеек' ,
v_text-t276 'Откл.' ,
v_text-t277 'Высоты строк' ,
v_text-t278 'Ширины стлбц' ,
v_text-t279 'Свойства столбцов грида' ,
v_text-t280 'Проблема при пост-обработке OLE/VBScript' ,
v_text-t281 'Автоподбор размеров объединеных ячеек' ,
v_text-t282 'Ошибка инициализации макроса' ,
v_text-t283 'Ошибка при выполнении макроса' ,
v_text-t284 'Настройки Design-time' ,
v_text-t285 'Настройки Run-time' ,
v_text-t286 'Способ пост-обработки' ,
v_text-t287 'Заключительная пост-обработка' ,
v_text-t288 'Передать таблицы' ,
v_text-t289 'Нет изменений' ,
v_text-t290 'Sub-процедура "Entry" не найдена или некорректна |в VBScript-
коде заключительной пост-обработки' ,
v_text-t291 'Таблицы для передачи данных в Заключит.пост-обработку
VBScript' ,
v_text-t292 'Укажите имя таблицы' ,
v_text-t293 'Имя таблицы не уникально' ,
v_text-t294 'Имя таблицы' ,
v_text-t295 'Ошибка доступа к приложению MS Excel' ,
v_text-t296 'как Дочерний' ,
v_text-t297 'на Этом же уровне' ,
v_text-t298 'Защита листа' ,
v_text-t299 'Из шаблона' ,
v_text-t300 'Из контекста' ,
v_text-t301 'Статически' ,
v_text-t302 'Выделение заблокированных ячеек' ,
v_text-t303 'Выделение Незаблокированных ячеек' ,
v_text-t304 'Форматирование Ячеек' ,
v_text-t305 'Форматирование Столбцов' ,
v_text-t306 'Форматирование Строк' ,
v_text-t307 'Вставку Столбцов' ,
v_text-t308 'Вставку Строк' ,
v_text-t309 'Вставку Гиперссылок' ,
v_text-t310 'Удаление Столбцов' ,
v_text-t311 'Удаление Строк' ,
v_text-t312 'Сортировку' ,
v_text-t313 'Использование Автофильта' ,
v_text-t314 'Использование отчетов сводной таблицы' ,
v_text-t315 'Изменение Объектов' ,
v_text-t316 'Изменение Сценариев' ,
v_text-t317 'Разрешить всем пользователям этого листа:' ,
v_text-t318 'Пароль для отключения защиты листа:' ,
v_text-t319 'Другой' ,
v_text-t320 'Компоненты должны быть одного типа' ,
v_text-t321 'Укажите целевой родительский компонент' ,
v_text-t322 'Опции переименования' ,
v_text-t323 'добавить Префикс' ,
v_text-t324 'добавить Постфикс' ,
v_text-t325 'Найти текст...' ,
v_text-t326 '...и заменить его текстом' ,
v_text-t327 'Формат файла' ,
v_text-t328 'Без VBA-макросов .XLSX' ,
v_text-t329 'С поддержкой VBA-макросов .XLSM' ,
v_text-t330 'Имя диапазона ячеек' ,
v_text-t331 'Некорректное имя диапазона ячеек' ,
v_text-t332 'Вероятная причина в том, что' ,
v_text-t333 'Ваша версия SAP GUI' ,
v_text-t334 'некорректно работает с MS Excel.' ,
v_text-t335 'Попробуйте обновить SAP GUI до последней версии.' ,
v_text-t336 'Ошибка чтения файла шаблона' ,
v_text-t337 'Размер' ,
v_text-t338 'Вписать в область' ,
v_text-t339 'Из поля контекста' ,
v_text-t340 'Высота' ,
v_text-t341 'Ширина' ,
v_text-t342 'Корневой узел не может быть удалён' ,
v_text-t343 'Заголовок Оси Значений' ,
v_text-t344 'Заголовок Оси Категорий' ,
v_text-t345 'Изменение этого параметра может привести к ошибке файла' ,
v_text-t346 'Прочие параметры' ,
v_text-t347 'Сохранять именованные диапазоны шаблона' ,
v_text-t348 'Проверка данных' ,
v_text-t349 'Атрибуты (из шаблона)' ,
v_text-t350 'Таблица для динамич.замены (атрибут/значение)' ,
v_text-t351 'Значение (Формула)' ,
v_text-t352 'Из Наб.данных (Грида)' ,
v_text-t353 'Поле Наб.данных не заполнено' ,
v_text-t354 'Поле Наб.данных некорректно' ,
v_text-t355 'Расположение относительно вложенной области' ,
v_text-t356 'До' ,
v_text-t357 'После' .
WHEN OTHERS .
* ...
ENDCASE .
ENDMETHOD . "init_texts
METHOD is_gui_available .
CLEAR rv_available .

STATICS:
lv_available TYPE flag ,
lv_firstcall TYPE flag VALUE abap_on .

IF lv_firstcall EQ abap_on .
lv_firstcall = abap_off .

* Background ?
DATA:
lv_task_state TYPE sm04dic-counter ,
lv_task_state_x TYPE x ,
lv_task_online_x TYPE x VALUE 1 .

CHECK sy-batch IS INITIAL .

CALL FUNCTION 'TH_USER_INFO'


IMPORTING
task_state = lv_task_state.

lv_task_state_x = lv_task_state .
CHECK lv_task_state_x O lv_task_online_x .

* Update task ?
DATA lv_in_update_task TYPE sysubrc .
CALL FUNCTION 'TH_IN_UPDATE_TASK'
IMPORTING
in_update_task = lv_in_update_task.
CHECK lv_in_update_task IS INITIAL .

* Batch input mode 'Background processing' ?


IF sy-binpt IS NOT INITIAL .
DATA ls_bi_info TYPE bdcrun .
CALL FUNCTION 'BDC_RUNNING'
IMPORTING
bi_info = ls_bi_info
EXCEPTIONS
OTHERS = 3.
IF sy-subrc EQ 0
AND ( ls_bi_info-bdc_amodus EQ 'N' OR
ls_bi_info-ctu_amodus EQ 'N' ) .
EXIT .
ENDIF .
ENDIF .

* Bapi dialog supressed ?


DATA lv_dialog_status TYPE flag .
GET PARAMETER ID 'FLAG_DIALOG_STATUS' FIELD lv_dialog_status.
CHECK lv_dialog_status IS INITIAL .

CALL FUNCTION 'GUI_IS_AVAILABLE'


IMPORTING
return = lv_available.

ENDIF . " lv_firstcall EQ abap_on

rv_available = lv_available .

ENDMETHOD . "is_gui_available
METHOD guid_create .
DATA lv_guid TYPE guid_32 .
CALL FUNCTION 'GUID_CREATE'
IMPORTING
ev_guid_32 = lv_guid.
* it's amazing, but the same (not unique) GUID can be generated several times
successively!

* we bring additional uniqueness for GUID


IF gv_guidcounter GE 9999999998 .
gv_guidcounter = 0 .
ENDIF .
ADD 1 TO gv_guidcounter .

CONCATENATE gv_guidcounter lv_guid INTO rv_guid .

ENDMETHOD . " guid_create


METHOD msg_init .
CHECK v_msg_init EQ abap_on .
CLEAR: v_retcode, t_retmess .
ENDMETHOD . "msg_init
METHOD msg_add .
CHECK iv_any NE me .

IF v_retcode LT iv_any->v_retcode .
v_retcode = iv_any->v_retcode .
ENDIF .
APPEND LINES OF iv_any->t_retmess TO t_retmess .
ENDMETHOD . "msg_add
METHOD msg_syst_catch .
DATA ls_retmess TYPE bapiret2 .
ls_retmess = msg_syst_convert( is_syst ) .
ls_retmess-parameter = iv_subj .
CASE iv_toplist .
WHEN space . APPEND ls_retmess TO t_retmess .
WHEN OTHERS. INSERT ls_retmess INTO t_retmess INDEX 1 .
ENDCASE .

IF ls_retmess-type CA 'EAX' .
v_retcode = c_retcode-error .
ELSE .
v_retcode = c_retcode-warning .
ENDIF .
ENDMETHOD . "msg_syst_catch
METHOD msg_syst_catch2 .
DATA ls_retmess TYPE bapiret2 .
ls_retmess = msg_syst_convert( is_syst ) .
APPEND ls_retmess TO ct_retmess .
ENDMETHOD . "msg_syst_catch2
METHOD msg_syst_convert .
CALL FUNCTION 'BALW_BAPIRETURN_GET2'
EXPORTING
type = is_syst-msgty
cl = is_syst-msgid
number = is_syst-msgno
par1 = is_syst-msgv1
par2 = is_syst-msgv2
par3 = is_syst-msgv3
par4 = is_syst-msgv4
IMPORTING
return = rs_retmess.
ENDMETHOD . "msg_syst_convert
METHOD msg_io_catch .
DATA ls_retmess TYPE bapiret2 .
CHECK ir_error IS BOUND .
CHECK ir_error->error_code NE c_oi_errors=>ret_ok .

ls_retmess-type = 'E' .
ls_retmess-parameter = iv_subj .

ir_error->get_message(
IMPORTING message_id = ls_retmess-id
message_number = ls_retmess-number
param1 = ls_retmess-message_v1
param2 = ls_retmess-message_v2
param3 = ls_retmess-message_v3
param4 = ls_retmess-message_v4 ) .
APPEND ls_retmess TO t_retmess .

v_retcode = c_retcode-error .
ENDMETHOD . "msg_io_catch
METHOD msg_show .

IF it_retmess IS INITIAL .
it_retmess = t_retmess .
ENDIF .
CHECK NOT it_retmess[] IS INITIAL .

LOOP AT it_retmess TRANSPORTING NO FIELDS WHERE parameter IS NOT INITIAL .


EXIT .
ENDLOOP .
IF sy-subrc EQ 0 .
msg_show_hier( it_retmess ) .
EXIT .
ENDIF .

DATA:
lv_balloghndl TYPE balloghndl ,
ls_log TYPE bal_s_log ,
ls_bal TYPE bal_s_msg ,
ls_profile TYPE bal_s_prof .
FIELD-SYMBOLS:
<bapiret2> TYPE bapiret2 .

ls_log-aldate = sy-datum .
ls_log-altime = sy-uzeit .
ls_log-aluser = sy-uname .
ls_log-altcode = sy-tcode .
ls_log-alprog = sy-repid .

CALL FUNCTION 'BAL_LOG_CREATE'


EXPORTING
i_s_log = ls_log
IMPORTING
e_log_handle = lv_balloghndl
EXCEPTIONS
OTHERS = 2.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .

CHECK NOT lv_balloghndl IS INITIAL .

LOOP AT it_retmess ASSIGNING <bapiret2> .


CLEAR ls_bal .
MOVE:
<bapiret2>-type TO ls_bal-msgty ,
<bapiret2>-id TO ls_bal-msgid ,
<bapiret2>-number TO ls_bal-msgno ,
<bapiret2>-message_v1 TO ls_bal-msgv1 ,
<bapiret2>-message_v2 TO ls_bal-msgv2 ,
<bapiret2>-message_v3 TO ls_bal-msgv3 ,
<bapiret2>-message_v4 TO ls_bal-msgv4 .

CALL FUNCTION 'BAL_LOG_MSG_ADD'


EXPORTING
i_log_handle = lv_balloghndl
i_s_msg = ls_bal
EXCEPTIONS
log_not_found = 1
msg_inconsistent = 2
log_is_full = 3
OTHERS = 4.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
ENDIF .
ENDLOOP .

CALL FUNCTION 'BAL_DSP_PROFILE_POPUP_GET'


IMPORTING
e_s_display_profile = ls_profile.

IF sy-batch IS INITIAL .
ls_profile-use_grid = abap_on .
ENDIF .
ls_profile-no_toolbar = abap_on .

CALL FUNCTION 'BAL_DSP_LOG_DISPLAY'


EXPORTING
i_s_display_profile = ls_profile
EXCEPTIONS
OTHERS = 0.

CALL FUNCTION 'BAL_LOG_MSG_DELETE_ALL'


EXPORTING
i_log_handle = lv_balloghndl
EXCEPTIONS
log_not_found = 1
OTHERS = 2.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
ENDIF .

CALL FUNCTION 'BAL_LOG_REFRESH'


EXPORTING
i_log_handle = lv_balloghndl
EXCEPTIONS
OTHERS = 0.

ENDMETHOD . "msg_show
METHOD msg_show_hier .

IF it_retmess IS INITIAL .
it_retmess = t_retmess .
ENDIF .
CHECK NOT it_retmess[] IS INITIAL .

DATA:
ls_log TYPE bal_s_log ,
ls_bal TYPE bal_s_msg ,
ls_fcat TYPE bal_s_fcat ,
lv_balloghnd TYPE balloghndl ,
lt_balloghnd TYPE bal_t_logh ,
ls_display_profile TYPE bal_s_prof .
FIELD-SYMBOLS:
<balloghnd> TYPE balloghndl ,
<bapiret2> TYPE bapiret2 .

ls_log-aldate = sy-datum .
ls_log-altime = sy-uzeit .
ls_log-aluser = sy-uname .
ls_log-altcode = sy-tcode .
ls_log-alprog = sy-repid .
ls_log-object = 'BCT1' .

LOOP AT it_retmess ASSIGNING <bapiret2> .


IF <bapiret2>-parameter IS INITIAL .
<bapiret2>-parameter = v_text-t001 . " text: Common messages
ENDIF .
IF ls_log-extnumber NE <bapiret2>-parameter .
ls_log-extnumber = <bapiret2>-parameter .

CALL FUNCTION 'BAL_LOG_CREATE'


EXPORTING
i_s_log = ls_log
IMPORTING
e_log_handle = lv_balloghnd
EXCEPTIONS
OTHERS = 1.
CHECK sy-subrc EQ 0 .
INSERT lv_balloghnd INTO TABLE lt_balloghnd .
ENDIF .

CLEAR ls_bal .
MOVE:
<bapiret2>-type TO ls_bal-msgty ,
<bapiret2>-id TO ls_bal-msgid ,
<bapiret2>-number TO ls_bal-msgno ,
<bapiret2>-message_v1 TO ls_bal-msgv1 ,
<bapiret2>-message_v2 TO ls_bal-msgv2 ,
<bapiret2>-message_v3 TO ls_bal-msgv3 ,
<bapiret2>-message_v4 TO ls_bal-msgv4 .

CALL FUNCTION 'BAL_LOG_MSG_CUMULATE'


EXPORTING
i_log_handle = lv_balloghnd
i_s_msg = ls_bal
i_compare_attributes = abap_on
i_compare_context = abap_on
i_compare_parameters = abap_on
EXCEPTIONS
OTHERS = 0.
ENDLOOP .

CHECK lt_balloghnd IS NOT INITIAL .

CALL FUNCTION 'BAL_DSP_PROFILE_POPUP_GET'


IMPORTING
e_s_display_profile = ls_display_profile.

ls_display_profile-title = v_text-t002 . " text: Messages


ls_display_profile-root_text = v_text-t003 . " text: Components of the form

ls_fcat-ref_table = 'BAL_S_SHOW' .
ls_fcat-ref_field = 'EXTNUMBER' .
ls_fcat-outputlen = 60 .
APPEND ls_fcat TO ls_display_profile-lev1_fcat .

CLEAR ls_display_profile-mess_fcat .
ls_fcat-ref_table = 'BAL_S_SHOW' .
ls_fcat-ref_field = 'T_MSG' .
ls_fcat-outputlen = 60 .
APPEND ls_fcat TO ls_display_profile-mess_fcat .

ls_display_profile-use_grid = abap_on .
ls_display_profile-no_toolbar = abap_on .
ls_display_profile-end_col = 120 .
ls_display_profile-disvariant-report = sy-repid .
ls_display_profile-disvariant-handle = 'LOG' .

CALL FUNCTION 'BAL_DSP_LOG_DISPLAY'


EXPORTING
i_t_log_handle = lt_balloghnd
i_s_display_profile = ls_display_profile
EXCEPTIONS
OTHERS = 0.

LOOP AT lt_balloghnd ASSIGNING <balloghnd> .


CALL FUNCTION 'BAL_LOG_REFRESH'
EXPORTING
i_log_handle = <balloghnd>
EXCEPTIONS
OTHERS = 0.
ENDLOOP .
ENDMETHOD . "msg_show_hier
METHOD msg_check_errors_and_show .
rv_error_occurs = abap_off .

msg_add( iv_any ) .
msg_show( ) .

CHECK v_retcode EQ c_retcode-error .


rv_error_occurs = abap_on .
ENDMETHOD . "msg_check_errors_and_show
METHOD progressbar .
CHECK v_gui_available IS NOT INITIAL .

CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'


EXPORTING
percentage = iv_percentage
text = iv_text.
ENDMETHOD . "progressbar
METHOD progressbar_loop_actualize .
DATA:
lv_percentage TYPE i ,
lv_percentage_tmp TYPE i ,
lv_text TYPE ty_char100 ,
lv_row_current TYPE ty_char15 ,
lv_row_count TYPE ty_char15 .

CHECK v_gui_available IS NOT INITIAL .

* record counter
ADD 1 TO s_progressbar_loop-row_current .

* steps control
ADD 1 TO s_progressbar_loop-step_tmp .
CHECK s_progressbar_loop-step_tmp GE s_progressbar_loop-step .
CLEAR s_progressbar_loop-step_tmp .

* ----
MOVE s_progressbar_loop-row_current TO lv_row_current .
CONDENSE lv_row_current .

IF s_progressbar_loop-row_count IS INITIAL .
* messages text formatting
CONCATENATE s_progressbar_loop-text lv_row_current
INTO lv_text SEPARATED BY space .

* actual percent
lv_percentage = 100 .

ELSE .
* messages text formatting
MOVE s_progressbar_loop-row_count TO lv_row_count .
CONDENSE lv_row_count .
CONCATENATE s_progressbar_loop-text lv_row_current '//' lv_row_count
INTO lv_text SEPARATED BY space .

* actual percent
IF s_progressbar_loop-row_count NE 0 .
lv_percentage_tmp = s_progressbar_loop-row_current * 100 /
s_progressbar_loop-row_count .
ELSE .
lv_percentage_tmp = 0 .
ENDIF .

* interline the actual percent into the specified interval


lv_percentage =
( ( s_progressbar_loop-percent_end - s_progressbar_loop-percent_start ) *
lv_percentage_tmp / 100 )
+ s_progressbar_loop-percent_start .

IF lv_percentage GT 100 .
lv_percentage = 100 .
ENDIF .
ENDIF .

* output message by the statusbar


progressbar( iv_percentage = lv_percentage
iv_text = lv_text ) .
ENDMETHOD . "progressbar_loop_actualize
METHOD progressbar_loop_init .
CLEAR s_progressbar_loop.

CHECK v_gui_available IS NOT INITIAL .

* step (records count) for refreshing the progress bar


MOVE iv_step TO:
s_progressbar_loop-step ,
s_progressbar_loop-step_tmp .

* message text (beside with %)


DATA lv_text TYPE ty_char1024 .
MOVE iv_text TO lv_text .
CONCATENATE lv_text ':' INTO s_progressbar_loop-text .

* records count in the target table


IF it_tab IS SUPPLIED .
DESCRIBE TABLE it_tab .
MOVE sy-tfill TO s_progressbar_loop-row_count .
ENDIF .

* percent
IF iv_percent_start BETWEEN 0 AND 100
AND iv_percent_end BETWEEN 0 AND 100
AND iv_percent_start LT iv_percent_end .

s_progressbar_loop-percent_start = iv_percent_start .
s_progressbar_loop-percent_end = iv_percent_end .

ELSE .
s_progressbar_loop-percent_start = 0 .
s_progressbar_loop-percent_end = 100 .
ENDIF .
ENDMETHOD . "progressbar_loop_init
METHOD get_fullpath .
DATA lv_fullpath TYPE string .
CLEAR rv_fullpath .
IF iv_parent_fullpath IS INITIAL .
lv_fullpath = iv_relpath .
ELSEIF iv_relpath IS INITIAL .
lv_fullpath = iv_parent_fullpath .
ELSE .
CONCATENATE iv_parent_fullpath
iv_relpath
INTO lv_fullpath SEPARATED BY '-' .
ENDIF .
rv_fullpath = lv_fullpath .
ENDMETHOD . "get_fullpath
METHOD tech_presets_dt_init .
CLEAR rs_disextract .
rs_disextract-report = 'SAPLZXLWB' . "sy-repid .
rs_disextract-handle = '0001' .
rs_disextract-username = sy-uname .
rs_disextract-text = 'XLSX Workbench presets' .
rs_disextract-exname = 'presets' .
ENDMETHOD . "tech_presets_dt_init
METHOD tech_presets_dt_load .
* initialize extract parameters
DATA ls_disextract TYPE disextract .
ls_disextract = tech_presets_dt_init( ) .

DATA:
ls_fldval TYPE ty_s_fldval ,
lt_fldval TYPE ty_t_fldval .
FIELD-SYMBOLS:
<components> TYPE abap_compdescr ,
<value> TYPE ANY .

* load presets from the extract


CLEAR s_presets_dt .
CALL FUNCTION 'REUSE_ALV_EXTRACT_LOAD'
EXPORTING
is_extract = ls_disextract
TABLES
et_exp01 = lt_fldval
EXCEPTIONS
OTHERS = 0.

* convert LT_FLDVAL table to the S_PRESETS structure


LOOP AT lt_fldval INTO ls_fldval .
ASSIGN COMPONENT ls_fldval-field OF STRUCTURE s_presets_dt TO <value> .
CHECK <value> IS ASSIGNED .
<value> = ls_fldval-value .
ENDLOOP .

IF s_presets_dt IS INITIAL .
s_presets_dt-popup_tb = abap_on .
s_presets_dt-mesgtab_when_error = abap_on .
s_presets_dt-deselect_cells_no_tb = abap_on .
ENDIF .

IF s_presets_dt-leftframe_width IS INITIAL .
s_presets_dt-leftframe_width = 30 .
ENDIF .
ENDMETHOD . "tech_presets_dt_load
METHOD tech_presets_rt_init .
CLEAR rs_disextract .
rs_disextract-report = 'SAPLZXLWB' . "sy-repid .
rs_disextract-handle = '0002' .
* rs_disextract-username = sy-uname .
rs_disextract-text = 'XLSX Workbench presets (Run-time)' .
rs_disextract-exname = 'Run-time' .
ENDMETHOD . "tech_presets_dt_init
METHOD tech_presets_rt_load .
* initialize extract parameters
DATA ls_disextract TYPE disextract .
ls_disextract = tech_presets_rt_init( ) .

DATA:
ls_fldval TYPE ty_s_fldval ,
lt_fldval TYPE ty_t_fldval .
FIELD-SYMBOLS:
<components> TYPE abap_compdescr ,
<value> TYPE ANY .

* load presets from the extract


CLEAR s_presets_rt .
CALL FUNCTION 'REUSE_ALV_EXTRACT_LOAD'
EXPORTING
is_extract = ls_disextract
TABLES
et_exp01 = lt_fldval
EXCEPTIONS
OTHERS = 0.

* convert LT_FLDVAL table to the S_PRESETS structure


LOOP AT lt_fldval INTO ls_fldval .
ASSIGN COMPONENT ls_fldval-field OF STRUCTURE s_presets_rt TO <value> .
CHECK <value> IS ASSIGNED .
<value> = ls_fldval-value .
ENDLOOP .

ENDMETHOD . "tech_presets_rt_load
ENDCLASS . " lcl_root IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_ole DEFINITION
*----------------------------------------------------------------------*
* MS-Office template document
*----------------------------------------------------------------------*
CLASS lcl_ole DEFINITION INHERITING FROM lcl_root .
PUBLIC SECTION .
CLASS-DATA:
v_temp_dir TYPE string ,
v_temp_directory TYPE string ,
v_file_separator TYPE ty_char1 .
CLASS-METHODS:
temp_directory_set ,
temp_directory_clear .

DATA:
r_control TYPE REF TO i_oi_container_control ,
r_docproxy TYPE REF TO i_oi_document_proxy ,
r_spreadsheet TYPE REF TO i_oi_spreadsheet .
DATA:
BEGIN OF s_ole ,
handle TYPE cntl_handle ,
application TYPE ole2_object ,
activeworkbook TYPE ole2_object ,
activewindow TYPE ole2_object ,
activesheet TYPE ole2_object ,
vbscript TYPE ole2_object ,
location TYPE ole2_object ,
locationnew TYPE ole2_object ,
pagebreak TYPE ole2_object ,
pagebreaks TYPE ole2_object ,
tmp_range TYPE ole2_object ,
tmp_range_rows TYPE ole2_object ,
tmp_range_row TYPE ole2_object ,
tmp_range_cols TYPE ole2_object ,
tmp_range_col TYPE ole2_object ,
tmp_cells TYPE ole2_object ,
cur_range TYPE ole2_object ,
cur_rang1 TYPE ole2_object ,
cur_range_rows TYPE ole2_object ,
cur_range_row TYPE ole2_object ,
cur_range_cols TYPE ole2_object ,
cur_range_col TYPE ole2_object ,
selection TYPE ole2_object ,
END OF s_ole .
DATA:
v_temp_filename TYPE string ,
v_readonly TYPE flag ,
v_viewmode TYPE flag ,
v_background TYPE flag ,
v_postprocessing TYPE flag ,
v_extension TYPE ty_char10 ,
r_container TYPE REF TO cl_gui_container .
CONSTANTS:
BEGIN OF c_viewmode ,
floating TYPE flag VALUE abap_on ,
inplace TYPE flag VALUE space ,
END OF c_viewmode .
CONSTANTS:
BEGIN OF c_fcode ,
close_template TYPE ui_func VALUE 'CLOSE_TEMPLATE' ,
END OF c_fcode .

EVENTS:
evnt_fcode
EXPORTING value(ev_fcode) TYPE ui_func .

METHODS:
constructor
IMPORTING ir_container TYPE REF TO cl_gui_container
iv_document_rawdata TYPE xstring
iv_viewmode TYPE flag
iv_readonly TYPE flag DEFAULT space
iv_background TYPE flag DEFAULT space
EXCEPTIONS process_terminated ,
init
IMPORTING iv_document_rawdata TYPE xstring
EXCEPTIONS process_terminated ,
application_availability_check ,
rawdata_get_as_table
IMPORTING iv_extension TYPE ty_char10
EXPORTING et_document_table TYPE tsfmime
ev_document_size TYPE i ,
free ,
free_ole_object
IMPORTING value(iv_varname) TYPE any ,
hndl_close
FOR EVENT on_close_document OF i_oi_document_proxy .

PRIVATE SECTION .
TYPES:
BEGIN OF ty_s_regval ,
key TYPE string ,
name TYPE string ,
value TYPE i ,
END OF ty_s_regval ,
ty_t_regval TYPE STANDARD TABLE OF ty_s_regval .

METHODS:
register_setnew
EXPORTING et_regval TYPE ty_t_regval ,
register_return
IMPORTING it_regval TYPE ty_t_regval .
ENDCLASS . "lcl_ole DEFINITION

*----------------------------------------------------------------------*
* CLASS lcl_ole IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_ole IMPLEMENTATION .
METHOD constructor .
super->constructor( ) .

IF v_gui_available IS INITIAL .
MESSAGE e000(lp) WITH v_text-t125 " text: Process is flowing in OFF-line
mode
RAISING process_terminated .
ENDIF .

v_readonly = iv_readonly .
v_viewmode = iv_viewmode .
v_background = iv_background .
r_container = ir_container .

init( EXPORTING iv_document_rawdata = iv_document_rawdata


EXCEPTIONS OTHERS = 1 ) .
IF sy-subrc NE 0 .
RAISE process_terminated .
ENDIF .

ENDMETHOD . "constructor
METHOD init .

msg_init( ) .

DATA:
lv_inplace TYPE flag ,
lv_show_toolbars TYPE flag ,
lv_r3_appl_name TYPE ty_char10 VALUE 'XLWB' ,
lv_on_close_event TYPE flag ,
lt_document_table TYPE tsfmime ,
lv_document_size TYPE i ,
lv_fileformat_cur TYPE ty_char10 ,
lt_regval TYPE ty_t_regval .

IF v_readonly IS INITIAL .
temp_directory_set( ) .
IF v_temp_directory IS INITIAL .
MESSAGE i000(lp) WITH v_text-t050 . " text: The working directory is not
determined
EXIT .
ENDIF .
temp_directory_clear( ) .
ENDIF .

CHECK r_container IS BOUND .

c_oi_container_control_creator=>get_container_control(
IMPORTING control = r_control ) .

CASE v_viewmode .
WHEN c_viewmode-floating .
lv_inplace = abap_off .
lv_show_toolbars = abap_off .
lv_on_close_event = abap_on .
WHEN c_viewmode-inplace .
lv_inplace = abap_on .
lv_show_toolbars = abap_on .
lv_on_close_event = abap_off .
ENDCASE .

r_control->init_control(
EXPORTING parent = r_container
inplace_enabled = lv_inplace
inplace_scroll_documents = lv_inplace
inplace_show_toolbars = lv_show_toolbars
r3_application_name = lv_r3_appl_name
register_on_close_event = lv_on_close_event
no_flush = abap_on ) .

r_control->get_document_proxy(
EXPORTING document_type = soi_doctype_excel_sheet
no_flush = abap_on
IMPORTING document_proxy = r_docproxy ) .

IF iv_document_rawdata IS INITIAL .
r_docproxy->create_document(
EXPORTING create_view_data = abap_off
open_inplace = lv_inplace ) .
ELSE .
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = iv_document_rawdata
IMPORTING
output_length = lv_document_size
TABLES
binary_tab = lt_document_table.

register_setnew( IMPORTING et_regval = lt_regval ) .

r_docproxy->open_document_from_table(
EXPORTING document_size = lv_document_size
document_table = lt_document_table
open_inplace = lv_inplace
no_flush = abap_on ) .

* register_return( EXPORTING it_regval = lt_regval ) .


ENDIF .

DATA lv_spreadsheet_available TYPE i .


r_docproxy->has_spreadsheet_interface(
EXPORTING no_flush = abap_on
IMPORTING is_available = lv_spreadsheet_available ) .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 1 ) .
IF lv_spreadsheet_available EQ 0 .
MESSAGE e000(lp) WITH v_text-t295 " text: Error accessing MS Excel
application
RAISING process_terminated .
ENDIF .

r_docproxy->get_spreadsheet_interface(
EXPORTING no_flush = abap_on
IMPORTING sheet_interface = r_spreadsheet ) .

r_spreadsheet->load_lib(
EXPORTING no_flush = abap_on ) .

IF lv_on_close_event EQ abap_on .
SET HANDLER hndl_close FOR r_docproxy .
ENDIF .

CASE v_background .
WHEN space . r_spreadsheet->screen_update( EXPORTING updating = abap_on
no_flush = abap_on ) .
WHEN OTHERS . r_spreadsheet->screen_update( EXPORTING updating = abap_off
no_flush = abap_on ) .
ENDCASE .

IF v_readonly IS INITIAL .
r_docproxy->get_document_handle(
EXPORTING no_flush = abap_on
IMPORTING handle = s_ole-handle ) .
GET PROPERTY OF s_ole-handle-obj 'Application' = s_ole-application no flush .
GET PROPERTY OF s_ole-application 'ActiveWorkbook' = s_ole-activeworkbook no
flush .

* actual (current) format


GET PROPERTY OF s_ole-activeworkbook 'FileFormat' = lv_fileformat_cur .
CASE lv_fileformat_cur .
WHEN 51 . v_extension = c_extension_xlsx .
WHEN 52 . v_extension = c_extension_xlsm .
ENDCASE .
ENDIF .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 1 ) .

IF v_background IS INITIAL .
r_control->set_focus( ) .
ENDIF .

ENDMETHOD . "init
METHOD register_setnew .
* Windows registry modification according
http://support.microsoft.com/kb/948615/en-us
* ( see SAP Note 1517552 )
*
* to avoid an Excel application popup-message:
* "The file you are trying to open ... ,
* is in a different format than specified by the file extension"

DATA ls_regval TYPE ty_s_regval .


DATA lv_tmp_key TYPE string .
DATA lv_tmp_value TYPE string .
DATA lv_office_version TYPE ty_char10 .
DATA lv_rc TYPE i .

DO .
CLEAR lv_tmp_key .
CLEAR lv_tmp_value .
CLEAR lv_rc .
CLEAR lv_office_version .

CASE sy-index .
WHEN 1 . lv_office_version = '12.0' .
WHEN 2 . lv_office_version = '14.0' .
WHEN 3 . lv_office_version = '15.0' .
WHEN 4 . lv_office_version = '16.0' .
WHEN OTHERS . EXIT .
ENDCASE .

CONCATENATE 'Software\Microsoft\Office\' lv_office_version '\Excel'


INTO lv_tmp_key .

cl_gui_frontend_services=>registry_get_value(
EXPORTING root = cl_gui_frontend_services=>hkey_current_user
key = lv_tmp_key
value = 'ExcelName'
IMPORTING reg_value = lv_tmp_value
EXCEPTIONS OTHERS = 0 ) .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .

CHECK lv_tmp_value IS NOT INITIAL .

CONCATENATE 'Software\Microsoft\Office\' lv_office_version '\Excel\Security'


INTO ls_regval-key .

ls_regval-name = 'ExtensionHardening' .

cl_gui_frontend_services=>registry_get_dword_value(
EXPORTING root = cl_gui_frontend_services=>hkey_current_user
key = ls_regval-key
value = ls_regval-name
IMPORTING reg_value = ls_regval-value
EXCEPTIONS OTHERS = 0 ) .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .

CHECK ls_regval-value NE 0 .

cl_gui_frontend_services=>registry_set_dword_value(
EXPORTING root = cl_gui_frontend_services=>hkey_current_user
key = ls_regval-key
value = ls_regval-name
dword_value = 0
IMPORTING rc = lv_rc
EXCEPTIONS OTHERS = 0 ) .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .

CHECK lv_rc EQ 1 .

APPEND ls_regval TO et_regval .


ENDDO .
ENDMETHOD . "register_setnew
METHOD register_return .
* restore register values

DATA ls_regval_old TYPE ty_s_regval .

LOOP AT it_regval INTO ls_regval_old .


CASE ls_regval_old-value .
WHEN 999999999 .
cl_gui_frontend_services=>registry_delete_value(
EXPORTING root = cl_gui_frontend_services=>hkey_current_user
key = ls_regval_old-key
value = ls_regval_old-name
EXCEPTIONS OTHERS = 1 ) .
WHEN OTHERS .
cl_gui_frontend_services=>registry_set_dword_value(
EXPORTING root = cl_gui_frontend_services=>hkey_current_user
key = ls_regval_old-key
value = ls_regval_old-name
dword_value = ls_regval_old-value
EXCEPTIONS OTHERS = 1 ) .
ENDCASE .
ENDLOOP .

CHECK sy-subrc EQ 0 .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .
ENDMETHOD . "register_return
METHOD temp_directory_set .
DATA lv_temp_dir_c TYPE ty_char1024 .
DATA lv_rc TYPE i .

* determine an available directory


cl_gui_frontend_services=>get_file_separator(
CHANGING file_separator = v_file_separator
EXCEPTIONS OTHERS = 0 ) .

cl_gui_frontend_services=>get_sapgui_workdir(
CHANGING sapworkdir = v_temp_dir
EXCEPTIONS OTHERS = 0 ) .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .
IF v_temp_dir IS INITIAL .
CALL FUNCTION 'GUI_GET_DESKTOP_INFO'
EXPORTING
type = 4
CHANGING
return = lv_temp_dir_c.
v_temp_dir = lv_temp_dir_c .
ENDIF .
CHECK v_temp_dir IS NOT INITIAL .

* create subdirectory for NEW temporary files (if not exists yet)
CONCATENATE v_temp_dir '~tmp_XLWB_template'
INTO v_temp_directory SEPARATED BY v_file_separator .

CHECK space EQ cl_gui_frontend_services=>directory_exist(


directory = v_temp_directory ) .

cl_gui_frontend_services=>directory_create(
EXPORTING directory = v_temp_directory
CHANGING rc = lv_rc
EXCEPTIONS OTHERS = 1 ) .
IF lv_rc NE 0
OR sy-subrc NE 0 .
CLEAR v_temp_directory .
ENDIF .

ENDMETHOD . "temp_directory_set
METHOD temp_directory_clear .
DATA:
lv_temp_filename TYPE string ,
ls_old_filetab TYPE file_info ,
lt_old_filetab TYPE STANDARD TABLE OF file_info ,
lv_rc TYPE i ,
lv_count TYPE i .

cl_gui_frontend_services=>directory_list_files(
EXPORTING directory = v_temp_directory
files_only = abap_on
CHANGING file_table = lt_old_filetab
count = lv_count
EXCEPTIONS OTHERS = 0 ) .

LOOP AT lt_old_filetab INTO ls_old_filetab .


CONCATENATE
v_temp_directory v_file_separator ls_old_filetab-filename
INTO lv_temp_filename .

cl_gui_frontend_services=>file_delete(
EXPORTING filename = lv_temp_filename
CHANGING rc = lv_rc
EXCEPTIONS OTHERS = 0 ) .
ENDLOOP .

ENDMETHOD . "temp_directory_clear
METHOD application_availability_check .
msg_init( ) .

DATA lv_rs TYPE soi_ret_string .


DO 1 TIMES .
r_docproxy->has_changed( IMPORTING retcode = lv_rs ) .
CHECK lv_rs EQ c_oi_errors=>ret_ok .
r_spreadsheet->get_sheets( IMPORTING retcode = lv_rs ) .
ENDDO .

IF lv_rs NE c_oi_errors=>ret_ok .
SPLIT v_text-t054 " text: Excel is not responding. |Perhaps a cell is
being edited now
AT '|' INTO sy-msgv1 sy-msgv2 .
MESSAGE e000(lp) WITH sy-msgv1 sy-msgv2 INTO v_dummy .
msg_syst_catch( ) .
EXIT .
ENDIF .
ENDMETHOD . "application_availability_check
METHOD rawdata_get_as_table .
CHECK v_readonly IS INITIAL .

msg_init( ) .

CLEAR ev_document_size .
CLEAR et_document_table .

v_extension = iv_extension .
IF v_extension IS INITIAL .
v_extension = c_extension_xlsx .
ENDIF .

application_availability_check( ) .
CHECK v_retcode NE c_retcode-error .

DATA:
lv_snap_filename TYPE string ,
lv_snap_filename_c(30000) TYPE c ,
lv_guid TYPE string ,
lv_rc TYPE i ,
lv_fileformat_cur TYPE i ,
lv_fileformat_new TYPE i ,
lv_document_rawdata TYPE xstring ,
lv_temp_filename TYPE string ,
ls_document_table TYPE w3mime .

cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .


cl_gui_cfw=>dispatch( ) .

* actual (current) format


GET PROPERTY OF s_ole-activeworkbook 'FileFormat' = lv_fileformat_cur .

* required format
CASE v_extension .
WHEN c_extension_xlsx . lv_fileformat_new = 51 . " xlOpenXMLWorkbook
WHEN c_extension_xlsm . lv_fileformat_new = 52 . "
xlOpenXMLWorkbookMacroEnabled
ENDCASE .

IF lv_fileformat_cur EQ lv_fileformat_new .
* returning of result
r_docproxy->save_document_to_table(
CHANGING document_size = ev_document_size
document_table = et_document_table ) .
* sometimes GET PROPERTY 'FileFormat' returns wrong value. So, we verify file
header signature
READ TABLE et_document_table INTO ls_document_table INDEX 1 .
IF ls_document_table-line(8) NE '504B030414000600' .
CLEAR lv_fileformat_cur .
CLEAR ev_document_size .
CLEAR et_document_table .
ENDIF .
ENDIF .

IF lv_fileformat_cur NE lv_fileformat_new .
* convert to required format
lv_guid = guid_create( ) .
CONCATENATE v_temp_directory v_file_separator lv_guid `--` v_extension
INTO lv_temp_filename .

CALL METHOD OF s_ole-activeworkbook 'SaveAs'


EXPORTING
#1 = lv_temp_filename
#2 = lv_fileformat_new .
CHECK sy-subrc EQ 0 .

CONCATENATE v_temp_directory v_file_separator lv_guid v_extension


INTO v_temp_filename .

CALL METHOD OF s_ole-activeworkbook 'SaveAs'


EXPORTING
#1 = v_temp_filename
#2 = lv_fileformat_new .
CHECK sy-subrc EQ 0 .

cl_gui_frontend_services=>gui_upload(
EXPORTING filename = lv_temp_filename
filetype = 'BIN'
IMPORTING filelength = ev_document_size
CHANGING data_tab = et_document_table
EXCEPTIONS OTHERS = 1 ) .

CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'


EXPORTING
input_length = ev_document_size
IMPORTING
buffer = lv_document_rawdata
TABLES
binary_tab = et_document_table.

free( ) .

init( EXPORTING iv_document_rawdata = lv_document_rawdata


EXCEPTIONS OTHERS = 1 ) .
ENDIF .

temp_directory_clear( ) .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .

ENDMETHOD . "rawdata_get_as_table
METHOD free .
DATA lv_rc TYPE i .
DATA lv_count TYPE i .
IF r_spreadsheet IS BOUND .
r_spreadsheet->screen_update( EXPORTING updating = abap_on ) .
ENDIF .

IF v_readonly IS INITIAL .
CALL METHOD OF s_ole-activeworkbook 'Close' EXPORTING #1 = 0 .
FREE OBJECT s_ole-activeworkbook . CLEAR s_ole-activeworkbook .
* CALL METHOD OF s_ole-application 'Quit' .
FREE OBJECT s_ole-application . CLEAR s_ole-application .
ENDIF .

FREE OBJECT s_ole-handle-obj . CLEAR s_ole-handle-obj .

IF r_docproxy IS BOUND .
r_docproxy->is_open( IMPORTING ret_value = lv_rc ) .
IF lv_rc EQ 1 .
CALL METHOD r_docproxy->close_document( ) .
ENDIF .
r_docproxy->is_destroyed( IMPORTING ret_value = lv_rc ) .
IF lv_rc EQ 0 .
CALL METHOD r_docproxy->release_document( ) .
ENDIF .
ENDIF .

IF NOT r_control IS INITIAL .


r_control->release_all_documents( ) .
r_control->destroy_control( ) .
ENDIF .

cl_gui_cfw=>dispatch( ) .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .

IF r_spreadsheet IS BOUND .
FREE r_spreadsheet .
ENDIF .
IF r_docproxy IS BOUND .
FREE r_docproxy .
ENDIF .
IF NOT r_control IS INITIAL .
FREE r_control .
ENDIF .

IF v_readonly IS INITIAL .
temp_directory_clear( ) .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .
ENDIF .

ENDMETHOD . "free
METHOD free_ole_object .
FIELD-SYMBOLS <ole2_object> TYPE ole2_object .
TRANSLATE iv_varname TO UPPER CASE .
ASSIGN COMPONENT iv_varname OF STRUCTURE s_ole TO <ole2_object> .
CHECK <ole2_object> IS ASSIGNED .

IF <ole2_object> IS NOT INITIAL .


FREE OBJECT <ole2_object> .
CLEAR <ole2_object> .
ENDIF .
ENDMETHOD . "free_ole_object
METHOD hndl_close .
RAISE EVENT evnt_fcode
EXPORTING ev_fcode = c_fcode-close_template .
ENDMETHOD . "hndl_close
ENDCLASS . "lcl_ole IMPLEMENTATION

*----------------------------------------------------------------------*
* CLASS lcl_context DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_context DEFINITION INHERITING FROM lcl_root .

PUBLIC SECTION .
TYPES:
ty_s_hierarchy TYPE snodetext ,
ty_t_hierarchy TYPE STANDARD TABLE OF ty_s_hierarchy .
TYPES:
BEGIN OF ty_s_properties ,
id TYPE ty_s_hierarchy-id ,
comp_type TYPE ty_comp_type ,
comp_name TYPE ty_comp_name ,
comp_fullpath TYPE ty_comp_path ,
comp_shortdescr TYPE ddtext ,
type_absname TYPE abap_abstypename ,
type_absname_t TYPE abap_abstypename ,
type_refname TYPE abap_abstypename ,
type_refname_tab TYPE tabname ,
type_refname_fld TYPE fieldname ,
type_kind TYPE abap_typekind ,
type_length TYPE i ,
type_decimals TYPE i ,
type_edit_mask TYPE abap_editmask ,
END OF ty_s_properties ,
ty_t_properties TYPE HASHED TABLE OF ty_s_properties
WITH UNIQUE KEY comp_fullpath .
TYPES:
ty_contextname TYPE bdlstruct .
DATA:
v_contextname TYPE ty_contextname READ-ONLY ,
v_contextshortdescr TYPE as4text READ-ONLY ,
t_properties TYPE ty_t_properties READ-ONLY ,
t_hierarchy TYPE ty_t_hierarchy READ-ONLY ,
v_root_id TYPE snode-id READ-ONLY ,
v_f4_strategy TYPE i READ-ONLY .
CONSTANTS:
BEGIN OF c_comp_type ,
root TYPE ty_comp_type VALUE 'R' ,
table TYPE ty_comp_type VALUE 'T' ,
struct TYPE ty_comp_type VALUE 'S' ,
element TYPE ty_comp_type VALUE 'E' ,
tree TYPE ty_comp_type VALUE 'A' ,
tree_s TYPE ty_comp_type VALUE 'a' ,
END OF c_comp_type .
CONSTANTS:
BEGIN OF c_comp_icon ,
root TYPE icon_d VALUE icon_tree ,
table TYPE icon_d VALUE icon_list ,
struct TYPE icon_d VALUE icon_structure ,
element TYPE icon_d VALUE icon_field_with_text ,
tree TYPE icon_d VALUE icon_display_tree ,
END OF c_comp_icon .
CONSTANTS:
BEGIN OF c_f4_strategy ,
loopstep TYPE i VALUE 1 ,
folder TYPE i VALUE 2 ,
value TYPE i VALUE 3 ,
tree TYPE i VALUE 4 ,
grid TYPE i VALUE 5 ,
gridfld TYPE i VALUE 6 ,
apr_relpath TYPE i VALUE 7 ,
END OF c_f4_strategy .

METHODS:
constructor
IMPORTING iv_contextname TYPE any ,
free,
comp_shortdescription
IMPORTING iv_type_kind TYPE any
iv_type_absname TYPE any
iv_type_absname_t TYPE any
iv_type_refname_tab TYPE any
iv_type_refname_fld TYPE any
RETURNING value(rv_comp_shortdescr) TYPE ddtext ,
node_get
IMPORTING iv_id TYPE any
RETURNING value(rs_properties) TYPE ty_s_properties ,
node_get_by_path
IMPORTING iv_comp_fullpath TYPE any OPTIONAL
iv_relpath TYPE any OPTIONAL
iv_fullpath_parent TYPE any OPTIONAL
RETURNING value(rs_properties) TYPE ty_s_properties ,
subtree_get
IMPORTING iv_begin_fullpath TYPE any OPTIONAL
iv_f4_strategy TYPE i
EXPORTING et_hierarchy TYPE ty_t_hierarchy ,
gridfld_get
IMPORTING iv_begin_fullpath TYPE any
EXPORTING et_hierarchy TYPE ty_t_hierarchy
et_properties TYPE ty_t_properties .

PRIVATE SECTION .
METHODS:
subtree_get_recurs
IMPORTING iv_parent_id_new TYPE snode-id
is_parent_hierarchy TYPE ty_s_hierarchy
CHANGING ct_hierarchy_new TYPE ty_t_hierarchy ,
node_add
IMPORTING iv_parent_id TYPE snode-id
CHANGING cs_properties TYPE ty_s_properties ,
nodes_recurs
IMPORTING iv_parent_id TYPE snode-id
iv_parent_fullpath TYPE any
iv_type_refname TYPE any
iv_comp_name TYPE any .

ENDCLASS . "lcl_context DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_context IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_context IMPLEMENTATION .
METHOD constructor .
DATA ls_attr TYPE streeattr .

super->constructor( ) .
msg_init( ) .

cl_abap_datadescr=>describe_by_name(
EXPORTING p_name = iv_contextname
EXCEPTIONS OTHERS = 4 ) .
IF sy-subrc EQ 0 .
v_contextname = iv_contextname .
ELSE .
MESSAGE e000(lp) WITH v_text-t004 INTO v_dummy . " text: Specify valid name
of the context
msg_syst_catch( ) .
ENDIF .

ls_attr-nodeicon = c_comp_icon-root .
ls_attr-kind = 'I' .
ls_attr-tlength1 = 30 .
ls_attr-text1 = 'Component' .
ls_attr-tlength2 = 10 .
ls_attr-text2 = 'Type' .
ls_attr-tlength3 = 10 .
ls_attr-text3 = 'Length' . CONDENSE ls_attr-text3 .
ls_attr-tlength4 = 10.
ls_attr-text4 = 'Decimals' . CONDENSE ls_attr-text4 .
* ls_attr-tlength5 = 20 .
* ls_attr-text5 = 'Absolute_name' .
ls_attr-tlength5 = 20 .
ls_attr-text5 = 'Short description' .

CALL FUNCTION 'RS_TREE_CREATE'


EXPORTING
root_name = 'CONTEXT'
display_attributes = ls_attr
IMPORTING
root_id = v_root_id.

IF v_contextname IS NOT INITIAL .


nodes_recurs( iv_parent_id = v_root_id
iv_parent_fullpath = space
iv_type_refname = v_contextname
iv_comp_name = v_contextname ) .
ENDIF .

CALL FUNCTION 'RS_TREE_GET_CURRENT_TREE'


TABLES
nodeinfo = t_hierarchy.

CALL FUNCTION 'RS_TREE_SET_CURRENT_TREE' .

ENDMETHOD . "constructor
METHOD free .
CLEAR:
v_contextname ,
t_properties ,
t_hierarchy ,
v_root_id ,
v_f4_strategy .
ENDMETHOD . "free
METHOD comp_shortdescription .
DATA lv_tablename TYPE dd02l-tabname .
DATA lv_fieldname TYPE dd03l-fieldname .
DATA lv_ddtext TYPE dd02t-ddtext .
DATA ls_dd40v TYPE dd40v .
DATA lv_objname TYPE ddobjname .

CASE iv_type_kind .
WHEN cl_abap_datadescr=>typekind_struct1
OR cl_abap_datadescr=>typekind_struct2 .
lv_tablename = iv_type_refname_tab .
CALL FUNCTION 'RS_DS_INT_TAB_INFO'
EXPORTING
p_tablename = lv_tablename
p_language = sy-langu
IMPORTING
p_text = lv_ddtext
EXCEPTIONS
OTHERS = 0.
rv_comp_shortdescr = lv_ddtext .

WHEN cl_abap_datadescr=>typekind_table .
lv_objname = iv_type_refname_tab .
CALL FUNCTION 'DDIF_TTYP_GET'
EXPORTING
name = lv_objname
state = 'M'
langu = sy-langu
IMPORTING
dd40v_wa = ls_dd40v
EXCEPTIONS
OTHERS = 0.
rv_comp_shortdescr = ls_dd40v-ddtext .

WHEN cl_abap_datadescr=>typekind_class .
SELECT SINGLE descript
INTO rv_comp_shortdescr
FROM seoclasstx
WHERE clsname EQ iv_type_absname_t
AND langu EQ sy-langu .
IF sy-subrc NE 0 .
SELECT SINGLE descript
INTO rv_comp_shortdescr
FROM seoclasstx
WHERE clsname EQ iv_type_absname_t .
ENDIF .

WHEN OTHERS .
lv_tablename = iv_type_refname_tab .
lv_fieldname = iv_type_refname_fld .
CALL FUNCTION 'RS_DS_INT_FIELD_INFO'
EXPORTING
p_tablename = lv_tablename
p_fieldname = lv_fieldname
p_language = sy-langu
IMPORTING
p_fieldtext = lv_ddtext
EXCEPTIONS
OTHERS = 0.
rv_comp_shortdescr = lv_ddtext .
ENDCASE .
ENDMETHOD . "comp_shortdescription
METHOD nodes_recurs .
DATA:
lr_tabledescr TYPE REF TO cl_abap_tabledescr ,
lr_structdescr TYPE REF TO cl_abap_structdescr ,
lr_elemdescr TYPE REF TO cl_abap_elemdescr ,
lr_typedescr TYPE REF TO cl_abap_typedescr ,
lr_classdescr TYPE REF TO cl_abap_classdescr ,
lt_components TYPE abap_compdescr_tab ,
lv_type_refname TYPE string ,
ls_properties TYPE ty_s_properties ,
lv_type_refname_tab TYPE ty_char100 ,
lv_type_absname TYPE abap_abstypename ,
lv_type_absname_t TYPE abap_abstypename ,
lv_dummy TYPE dummy .
FIELD-SYMBOLS:
<components> TYPE abap_compdescr .

*======================================================================
* add current node
*======================================================================
ls_properties-comp_name = iv_comp_name .
ls_properties-type_refname = iv_type_refname .

SPLIT iv_type_refname AT '-'


INTO lv_type_refname_tab ls_properties-type_refname_fld .
IF lv_type_refname_tab CS '=' .
SPLIT lv_type_refname_tab AT '=' INTO lv_dummy lv_type_refname_tab .
ENDIF .
ls_properties-type_refname_tab = lv_type_refname_tab .

ls_properties-comp_fullpath =
get_fullpath( iv_parent_fullpath = iv_parent_fullpath
iv_relpath = iv_comp_name ) .

* describe
cl_abap_datadescr=>describe_by_name(
EXPORTING p_name = iv_type_refname
RECEIVING p_descr_ref = lr_typedescr
EXCEPTIONS type_not_found = 4 ) .
IF sy-subrc NE 0 .
EXIT .
ENDIF .

CASE lr_typedescr->type_kind .
WHEN cl_abap_datadescr=>typekind_struct1
OR cl_abap_datadescr=>typekind_struct2 .
TRY .
lr_structdescr ?= lr_typedescr .
CATCH cx_sy_move_cast_error .
EXIT .
ENDTRY .
ls_properties-comp_type = c_comp_type-struct .
ls_properties-type_absname = lr_structdescr->absolute_name .
ls_properties-type_kind = lr_structdescr->type_kind .
ls_properties-type_length = lr_structdescr->length .
ls_properties-type_decimals = lr_structdescr->decimals .
lt_components[] = lr_structdescr->components[] .

WHEN cl_abap_datadescr=>typekind_table .
TRY .
lr_tabledescr ?= lr_typedescr .
lr_structdescr ?= lr_tabledescr->get_table_line_type( ) .
CATCH cx_sy_move_cast_error .
EXIT .
ENDTRY .
ls_properties-comp_type = c_comp_type-table .
ls_properties-type_absname = lr_tabledescr->absolute_name .
ls_properties-type_kind = lr_tabledescr->type_kind .
ls_properties-type_length = lr_tabledescr->length .
ls_properties-type_decimals = lr_tabledescr->decimals .

WHEN cl_abap_datadescr=>typekind_class
OR cl_abap_datadescr=>typekind_oref .

CLEAR lv_type_absname .
CASE lr_typedescr->type_kind .
WHEN cl_abap_datadescr=>typekind_class .
TRY .
lr_classdescr ?= lr_typedescr .
CATCH cx_sy_move_cast_error .
EXIT .
ENDTRY .
lv_type_absname = lr_classdescr->absolute_name .
WHEN cl_abap_datadescr=>typekind_oref .
SELECT SINGLE rollname
INTO lv_type_absname
FROM dd03l
WHERE tabname EQ ls_properties-type_refname_tab
AND fieldname EQ ls_properties-type_refname_fld .
CHECK sy-subrc EQ 0 .
WHEN OTHERS .
ENDCASE .
IF lv_type_absname CS '=' .
SPLIT lv_type_absname AT '=' INTO lv_dummy lv_type_absname_t .
ELSE .
lv_type_absname_t = lv_type_absname .
ENDIF .
CASE lv_type_absname_t .
WHEN c_typename_tree .
ls_properties-comp_type = c_comp_type-tree .
ls_properties-type_absname = lv_type_absname .
ls_properties-type_absname_t = lv_type_absname_t .
ls_properties-type_kind = cl_abap_datadescr=>typekind_class .
WHEN c_typename_tree_s .
ls_properties-comp_type = c_comp_type-tree_s .
ls_properties-type_absname = lv_type_absname .
ls_properties-type_absname_t = lv_type_absname_t .
ls_properties-type_kind = cl_abap_datadescr=>typekind_class .
WHEN OTHERS . EXIT .
ENDCASE .

WHEN OTHERS .
TRY .
lr_elemdescr ?= lr_typedescr .
CATCH cx_sy_move_cast_error .
EXIT .
ENDTRY .
ls_properties-comp_type = c_comp_type-element .
ls_properties-type_absname = lr_elemdescr->absolute_name .
ls_properties-type_kind = lr_elemdescr->type_kind .
ls_properties-type_length = lr_elemdescr->output_length .
ls_properties-type_decimals = lr_elemdescr->decimals .
ls_properties-type_edit_mask = lr_elemdescr->edit_mask .
ENDCASE .

IF ls_properties-type_absname CS '=' .
SPLIT ls_properties-type_absname AT '='
INTO lv_dummy ls_properties-type_absname_t .
ELSE .
ls_properties-type_absname_t = ls_properties-type_absname .
ENDIF .

ls_properties-comp_shortdescr = comp_shortdescription(
iv_type_kind = ls_properties-type_kind
iv_type_absname = ls_properties-type_absname
iv_type_absname_t = ls_properties-type_absname_t
iv_type_refname_tab = ls_properties-type_refname_tab
iv_type_refname_fld = ls_properties-type_refname_fld ) .

IF iv_parent_id EQ v_root_id
AND iv_type_refname EQ v_contextname .
v_contextshortdescr = ls_properties-comp_shortdescr .
ENDIF .

node_add( EXPORTING iv_parent_id = iv_parent_id


CHANGING cs_properties = ls_properties ) .

*======================================================================
* find and add children components
*======================================================================
CASE ls_properties-type_kind .
WHEN cl_abap_datadescr=>typekind_struct1
OR cl_abap_datadescr=>typekind_struct2 .

LOOP AT lt_components ASSIGNING <components> .

CONCATENATE ls_properties-type_absname <components>-name


INTO lv_type_refname SEPARATED BY '-' .

nodes_recurs( iv_parent_id = ls_properties-id


iv_parent_fullpath = ls_properties-comp_fullpath
iv_type_refname = lv_type_refname
iv_comp_name = <components>-name ) .
ENDLOOP .

WHEN cl_abap_datadescr=>typekind_table .
nodes_recurs( iv_parent_id = ls_properties-id
iv_parent_fullpath = ls_properties-comp_fullpath
iv_type_refname = lr_structdescr->absolute_name
iv_comp_name = 'LINE' ) .
WHEN OTHERS .

ENDCASE .

ENDMETHOD . "nodes_recurs
METHOD node_add .
DATA:
ls_attr TYPE streeattr .
ls_attr-kind = 'I' .
ls_attr-tlength1 = 30 .
ls_attr-text1 = cs_properties-comp_name .
ls_attr-tlength2 = 10 .
ls_attr-text2 = cs_properties-type_kind .
ls_attr-tlength3 = 10 .
ls_attr-text3 = cs_properties-type_length . CONDENSE ls_attr-text3 .
ls_attr-tlength4 = 10 .
ls_attr-text4 = cs_properties-type_decimals . CONDENSE ls_attr-text4 .
ls_attr-tlength5 = 20 .
ls_attr-text5 = cs_properties-comp_shortdescr .
* ls_attr-text5 = cs_properties-type_absname .

CASE cs_properties-comp_type .
WHEN c_comp_type-struct . ls_attr-nodeicon = c_comp_icon-struct .
WHEN c_comp_type-table . ls_attr-nodeicon = c_comp_icon-table .
WHEN c_comp_type-element . ls_attr-nodeicon = c_comp_icon-element .
WHEN c_comp_type-tree
OR c_comp_type-tree_s .
ls_attr-nodeicon = c_comp_icon-tree .
ENDCASE .

CALL FUNCTION 'RS_TREE_ADD_NODE'


EXPORTING
new_name = space
insert_id = iv_parent_id
relationship = stree_reltype_baby
display_attributes = ls_attr
IMPORTING
new_id = cs_properties-id
EXCEPTIONS
OTHERS = 0.

INSERT cs_properties INTO TABLE t_properties .


ENDMETHOD . "node_add
METHOD node_get .
msg_init( ) .

READ TABLE t_properties INTO rs_properties WITH KEY id = iv_id .


IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t005 INTO v_dummy . " text: Requested node was
not found in the structure
msg_syst_catch( ) .
EXIT .
ENDIF .
ENDMETHOD . "node_get
METHOD node_get_by_path .
msg_init( ) .
DATA lv_comp_fullpath TYPE ty_comp_path .
IF iv_comp_fullpath IS INITIAL .
lv_comp_fullpath = get_fullpath( iv_parent_fullpath = iv_fullpath_parent
iv_relpath = iv_relpath ) .
ELSE .
lv_comp_fullpath = iv_comp_fullpath .
ENDIF .

READ TABLE t_properties INTO rs_properties


WITH TABLE KEY comp_fullpath = lv_comp_fullpath .
IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t005 INTO v_dummy . " text: Requested node was
not found in the structure
msg_syst_catch( ) .
EXIT .
ENDIF .
ENDMETHOD . "node_get_by_path
METHOD subtree_get .
msg_init( ) .

DATA:
lv_subtree_root_id TYPE snode-id ,
ls_attr TYPE streeattr ,
ls_hierarchy TYPE ty_s_hierarchy ,
ls_properties TYPE ty_s_properties .

v_f4_strategy = iv_f4_strategy .

* create a header line (root node)


READ TABLE t_hierarchy INTO ls_hierarchy WITH KEY id = v_root_id .
CHECK sy-subrc EQ 0 .

MOVE-CORRESPONDING ls_hierarchy TO ls_attr.


ls_attr-force_plus = abap_on .
ls_attr-hotspot = abap_on .

IF iv_begin_fullpath IS NOT INITIAL .


format_path( EXPORTING iv_source = iv_begin_fullpath
CHANGING cv_formatted = ls_attr-text1(25) ) .
ENDIF .

CALL FUNCTION 'RS_TREE_CREATE'


EXPORTING
root_name = 'CONTEXT'
display_attributes = ls_attr
IMPORTING
root_id = lv_subtree_root_id.

* create other nodes


IF iv_begin_fullpath IS NOT INITIAL .
CLEAR ls_hierarchy .
CLEAR ls_properties .

ls_properties = node_get_by_path( iv_comp_fullpath = iv_begin_fullpath ) .


CHECK v_retcode NE c_retcode-error .

READ TABLE t_hierarchy INTO ls_hierarchy WITH KEY id = ls_properties-id .


CHECK sy-subrc EQ 0 .
ENDIF .
subtree_get_recurs( EXPORTING iv_parent_id_new = lv_subtree_root_id
is_parent_hierarchy = ls_hierarchy
CHANGING ct_hierarchy_new = et_hierarchy ) .

CALL FUNCTION 'RS_TREE_GET_CURRENT_TREE'


TABLES
nodeinfo = et_hierarchy.

CALL FUNCTION 'RS_TREE_SET_CURRENT_TREE' .

CASE v_f4_strategy .
WHEN c_f4_strategy-loopstep
OR c_f4_strategy-grid .
READ TABLE et_hierarchy TRANSPORTING NO FIELDS
WITH KEY nodeicon = lcl_context=>c_comp_icon-table .
WHEN c_f4_strategy-folder .
READ TABLE et_hierarchy TRANSPORTING NO FIELDS
WITH KEY nodeicon = lcl_context=>c_comp_icon-struct .
WHEN c_f4_strategy-apr_relpath
OR c_f4_strategy-gridfld .
READ TABLE et_hierarchy TRANSPORTING NO FIELDS
WITH KEY nodeicon = lcl_context=>c_comp_icon-element .
WHEN c_f4_strategy-value .
READ TABLE et_hierarchy TRANSPORTING NO FIELDS
WITH KEY nodeicon = lcl_context=>c_comp_icon-element .
IF sy-subrc NE 0 .
READ TABLE et_hierarchy TRANSPORTING NO FIELDS
WITH KEY nodeicon = lcl_context=>c_comp_icon-table .
ENDIF .
WHEN c_f4_strategy-tree .
READ TABLE et_hierarchy TRANSPORTING NO FIELDS
WITH KEY nodeicon = lcl_context=>c_comp_icon-tree .
WHEN OTHERS .
ENDCASE .

IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t006 INTO v_dummy . " text: Relevant nodes of
the context are not found
msg_syst_catch( ) .
CLEAR et_hierarchy[] .
EXIT .
ENDIF .

ENDMETHOD . "subtree_get
METHOD subtree_get_recurs .
DATA:
ls_attr TYPE streeattr ,
ls_hierarchy TYPE ty_s_hierarchy ,
ls_properties TYPE ty_s_properties ,
lv_id_new TYPE snode-id ,
lv_id_next TYPE snode-id .

lv_id_next = is_parent_hierarchy-child .
lv_id_new = iv_parent_id_new .

DO .
* read a next node
READ TABLE t_hierarchy INTO ls_hierarchy
WITH KEY parent = is_parent_hierarchy-id
id = lv_id_next .
IF sy-subrc NE 0 .
EXIT .
ENDIF .

READ TABLE t_properties INTO ls_properties


WITH KEY id = ls_hierarchy-id .
CHECK sy-subrc EQ 0 .
*===================================================

DO 1 TIMES .
CASE v_f4_strategy .
WHEN c_f4_strategy-loopstep
OR c_f4_strategy-grid .
CHECK ls_properties-comp_type EQ c_comp_type-table
OR ls_properties-comp_type EQ c_comp_type-struct .
WHEN c_f4_strategy-folder .
CHECK ls_properties-comp_type EQ c_comp_type-struct .
WHEN c_f4_strategy-value .
CHECK ls_properties-comp_type EQ c_comp_type-table
OR ls_properties-comp_type EQ c_comp_type-struct
OR ls_properties-comp_type EQ c_comp_type-element .
WHEN c_f4_strategy-apr_relpath .
CHECK ls_properties-comp_type EQ c_comp_type-struct
OR ls_properties-comp_type EQ c_comp_type-element .
WHEN c_f4_strategy-tree .
CHECK ls_properties-comp_type EQ c_comp_type-struct
OR ls_properties-comp_type EQ c_comp_type-tree
OR ls_properties-comp_type EQ c_comp_type-tree_s .
WHEN c_f4_strategy-gridfld .
CHECK ls_properties-comp_type EQ c_comp_type-table
OR ls_properties-comp_type EQ c_comp_type-struct
OR ls_properties-comp_type EQ c_comp_type-element .
WHEN OTHERS .
ENDCASE .

MOVE-CORRESPONDING ls_hierarchy TO ls_attr .


ls_attr-hide = ls_hierarchy-id .

CALL FUNCTION 'RS_TREE_ADD_NODE'


EXPORTING
new_name = space
insert_id = iv_parent_id_new
relationship = stree_reltype_baby
display_attributes = ls_attr
IMPORTING
new_id = lv_id_new
EXCEPTIONS
OTHERS = 0.
ENDDO .

*===================================================
DO 1 TIMES .
CHECK ls_hierarchy-child IS NOT INITIAL .

IF ls_properties-comp_type EQ c_comp_type-table .
CHECK v_f4_strategy EQ c_f4_strategy-gridfld .
ENDIF .
* recursive process subtree
subtree_get_recurs( EXPORTING iv_parent_id_new = lv_id_new
is_parent_hierarchy = ls_hierarchy
CHANGING ct_hierarchy_new = ct_hierarchy_new ) .
ENDDO .

*===================================================
IF ls_hierarchy-next IS INITIAL .
EXIT .
ELSE .
lv_id_next = ls_hierarchy-next .
ENDIF .
ENDDO .

ENDMETHOD . "subtree_get_recurs
METHOD gridfld_get .
DATA:
ls_hierarchy TYPE ty_s_hierarchy ,
lt_hierarchy TYPE ty_t_hierarchy ,
ls_properties TYPE ty_s_properties .
CLEAR:
et_properties ,
et_hierarchy .

subtree_get(
EXPORTING iv_begin_fullpath = iv_begin_fullpath
iv_f4_strategy = c_f4_strategy-gridfld
IMPORTING et_hierarchy = lt_hierarchy ) .

LOOP AT lt_hierarchy INTO ls_hierarchy .


READ TABLE t_properties INTO ls_properties
WITH KEY id = ls_hierarchy-hide .
CHECK sy-subrc EQ 0 .

CHECK ls_properties-comp_type EQ c_comp_type-element


OR ls_properties-comp_type EQ c_comp_type-table .
INSERT ls_properties INTO TABLE et_properties .
INSERT ls_hierarchy INTO TABLE et_hierarchy .
ENDLOOP .

ENDMETHOD . "gridfld_get
ENDCLASS . "lcl_context IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_excel DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_excel DEFINITION INHERITING FROM lcl_root ABSTRACT .

PUBLIC SECTION.

TYPE-POOLS:
ixml.
TYPES:
ty_rawdata TYPE xstring.
TYPES:
BEGIN OF ty_s_elemsequence ,
order TYPE sy-index ,
element TYPE string ,
END OF ty_s_elemsequence ,
ty_t_elemsequence TYPE STANDARD TABLE OF ty_s_elemsequence .
TYPES:
BEGIN OF ty_s_coordinates ,
beg_y TYPE i ,
beg_x TYPE i ,
end_y TYPE i ,
end_x TYPE i ,
END OF ty_s_coordinates .
TYPES:
BEGIN OF ty_s_sharedstrings ,
value TYPE string ,
key TYPE i ,
si_node TYPE REF TO if_ixml_node , " -->> if extended cell
formatting occurs
END OF ty_s_sharedstrings ,
ty_t_sharedstrings TYPE HASHED TABLE OF ty_s_sharedstrings
WITH UNIQUE KEY value .
TYPES:
BEGIN OF ty_s_mergecells .
INCLUDE TYPE ty_s_coordinates .
TYPES:
autofit_rows TYPE flag ,
autofit_cols TYPE flag ,
END OF ty_s_mergecells ,
ty_t_mergecells TYPE STANDARD TABLE OF ty_s_mergecells
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_relstab ,
target TYPE string ,
type TYPE string ,
id TYPE string ,
END OF ty_s_relstab ,
ty_t_relstab TYPE STANDARD TABLE OF ty_s_relstab
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_datavalidation ,
allowblank TYPE string ,
error TYPE string ,
errorstyle TYPE string ,
errortitle TYPE string ,
imemode TYPE string ,
operator TYPE string ,
prompt TYPE string ,
prompttitle TYPE string ,
showdropdown TYPE string ,
showerrormessage TYPE string ,
showinputmessage TYPE string ,
type TYPE string ,
formula1 TYPE string ,
formula1_dataset_id TYPE snodetext-id ,
formula1_dataset_fld TYPE string ,
formula1_dataset_rt_path_1 TYPE string ,
formula2 TYPE string ,
END OF ty_s_datavalidation .
TYPES:
BEGIN OF ty_s_datavalid_rt .
INCLUDE TYPE ty_s_datavalidation .
TYPES:
t_coordinates TYPE STANDARD TABLE OF ty_s_coordinates WITH DEFAULT
KEY ,
END OF ty_s_datavalid_rt ,
ty_t_datavalid_rt TYPE SORTED TABLE OF ty_s_datavalid_rt
WITH UNIQUE KEY allowblank
error
errorstyle
errortitle
imemode
operator
prompt
prompttitle
showdropdown
showerrormessage
showinputmessage
TYPE
formula1
formula1_dataset_id
formula1_dataset_fld
formula1_dataset_rt_path_1
formula2 .
TYPES:
BEGIN OF ty_s_datavalid_seqnr ,
id TYPE snodetext-id ,
dataset_seqnr TYPE i ,
END OF ty_s_datavalid_seqnr ,
ty_t_datavalid_seqnr TYPE HASHED TABLE OF ty_s_datavalid_seqnr
WITH UNIQUE KEY id .
TYPES:
BEGIN OF ty_s_cells ,
y TYPE i ,
x TYPE i ,
style TYPE string ,
type TYPE string ,
value TYPE string ,
value_s TYPE string , " -->> respecting shared strings
formula TYPE string ,
textformat_style TYPE flag ,
dateformat_style TYPE flag ,
tmp_flag TYPE flag ,
tmp_value_s TYPE string ,
tmp_si_node TYPE REF TO if_ixml_node ,
datavalidation TYPE ty_s_datavalidation ,
END OF ty_s_cells ,
ty_t_cells TYPE SORTED TABLE OF ty_s_cells
WITH UNIQUE KEY y x .
TYPES:
BEGIN OF ty_s_calcchain ,
sheet_index TYPE i ,
y TYPE i ,
x TYPE i ,
END OF ty_s_calcchain ,
ty_t_calcchain TYPE STANDARD TABLE OF ty_s_calcchain
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_colprop ,
x TYPE i ,
width TYPE string ,
style TYPE string ,
hidden TYPE string ,
bestfit TYPE string ,
customwidth TYPE string ,
outlinelevel TYPE string ,
collapsed TYPE string ,
END OF ty_s_colprop ,
ty_t_colprop TYPE SORTED TABLE OF ty_s_colprop
WITH UNIQUE KEY x .
TYPES:
BEGIN OF ty_s_rowprop ,
y TYPE i ,
s TYPE string ,
customformat TYPE string ,
ht TYPE string ,
customheight TYPE string ,
hidden TYPE string ,
outlinelevel TYPE string ,
collapsed TYPE string ,
is_empty TYPE flag ,
END OF ty_s_rowprop ,
ty_t_rowprop TYPE HASHED TABLE OF ty_s_rowprop
WITH UNIQUE KEY y .
TYPES:
BEGIN OF ty_s_patterns ,
id TYPE snode-id ,
outlinelevel_row TYPE i ,
outlinelevel_col TYPE i ,
t_cells TYPE ty_t_cells ,
t_mergecells TYPE ty_t_mergecells_rel ,
t_colprop TYPE ty_t_colprop ,
t_rowprop TYPE ty_t_rowprop .
INCLUDE TYPE soi_area_item .
TYPES:
END OF ty_s_patterns ,
ty_t_patterns TYPE STANDARD TABLE OF ty_s_patterns
WITH KEY id .
TYPES:
BEGIN OF ty_s_nopgbrk_range ,
top TYPE flag ,
left TYPE flag .
INCLUDE TYPE ty_s_coordinates .
TYPES:
END OF ty_s_nopgbrk_range ,
ty_t_nopgbrk_range TYPE STANDARD TABLE OF ty_s_nopgbrk_range
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_manual_pgbrk ,
id TYPE i ,
END OF ty_s_manual_pgbrk ,
ty_t_manual_pgbrk TYPE STANDARD TABLE OF ty_s_manual_pgbrk
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_chart_series ,
idx TYPE string ,
caption TYPE string ,
END OF ty_s_chart_series ,
ty_t_chart_series TYPE STANDARD TABLE OF ty_s_chart_series
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_drawings_tmp ,
name TYPE string ,
drawing_type TYPE i ,
twocellanchor_node TYPE REF TO if_ixml_node ,
media_rawdata TYPE xstring ,
dataset_id TYPE snodetext-id ,
dataset_rt_path_1 TYPE string , " -->> runtime path (for dataset
subordination)
dataset_series_tab TYPE ty_t_dataset_series_tab ,
dataset_series_captyp TYPE i ,
chart_id TYPE snodetext-id ,
chart_series TYPE ty_t_chart_series ,
chart_series_title TYPE flag ,
chart_title TYPE flag ,
chart_title_tx TYPE string ,
chart_catax_title TYPE flag ,
chart_catax_title_tx TYPE string ,
chart_valax_title TYPE flag ,
chart_valax_title_tx TYPE string ,
chart_ixml_doc TYPE REF TO if_ixml_document ,
chartcolors_ixml_doc TYPE REF TO if_ixml_document ,
chartstyle_ixml_doc TYPE REF TO if_ixml_document ,
drawing_size_h TYPE i ,
drawing_size_w TYPE i .
INCLUDE TYPE soi_area_item .
TYPES:
END OF ty_s_drawings_tmp ,
ty_t_drawings_tmp TYPE HASHED TABLE OF ty_s_drawings_tmp
WITH UNIQUE KEY name .
TYPES:
BEGIN OF ty_s_drawings ,
drawing_type TYPE i ,
twocellanchor_node TYPE REF TO if_ixml_node ,
refer_id TYPE string ,
drawing_size_h TYPE i ,
drawing_size_w TYPE i .
INCLUDE TYPE ty_s_coordinates .
TYPES:
END OF ty_s_drawings ,
ty_t_drawings TYPE STANDARD TABLE OF ty_s_drawings
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_media ,
media_rawdata TYPE xstring ,
id TYPE string ,
END OF ty_s_media ,
ty_t_media TYPE HASHED TABLE OF ty_s_media
WITH UNIQUE KEY media_rawdata .
TYPES:
BEGIN OF ty_s_charts ,
id TYPE string ,
chart_ixml_doc TYPE REF TO if_ixml_document ,
chart_path TYPE string ,
chart_path_ TYPE string ,
chartcolors_ixml_doc TYPE REF TO if_ixml_document ,
chartcolors_path TYPE string ,
chartstyle_ixml_doc TYPE REF TO if_ixml_document ,
chartstyle_path TYPE string ,
chart_series_title TYPE flag ,
chart_title TYPE flag ,
chart_title_tx TYPE string ,
chart_catax_title TYPE flag ,
chart_catax_title_tx TYPE string ,
chart_valax_title TYPE flag ,
chart_valax_title_tx TYPE string ,
dataset_id TYPE snodetext-id ,
dataset_rt_path_1 TYPE string ,
dataset_series_tab TYPE ty_t_dataset_series_tab ,
dataset_series_captyp TYPE i ,
END OF ty_s_charts ,
ty_t_charts TYPE HASHED TABLE OF ty_s_charts
WITH UNIQUE KEY id .
TYPES:
BEGIN OF ty_s_dataset_ref_fields ,
field TYPE string ,
ref TYPE string ,
ref_2 TYPE string ,
beg_x TYPE i ,
end_x TYPE i ,
beg_y TYPE i ,
end_y TYPE i ,
caption_x TYPE i ,
caption_y TYPE i ,
caption_ref TYPE string ,
END OF ty_s_dataset_ref_fields ,
ty_t_dataset_ref_fields TYPE STANDARD TABLE OF ty_s_dataset_ref_fields
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_dataset_refs ,
rt_path_1 TYPE string , " -->> runtime path (for dataset
subordination)
sheetname TYPE string ,
t_fields TYPE ty_t_dataset_ref_fields ,
END OF ty_s_dataset_refs ,
ty_t_dataset_refs TYPE HASHED TABLE OF ty_s_dataset_refs
WITH UNIQUE KEY rt_path_1 .
TYPES:
BEGIN OF ty_s_datasets ,
id TYPE snodetext-id ,
t_refs TYPE ty_t_dataset_refs ,
END OF ty_s_datasets ,
ty_t_datasets TYPE HASHED TABLE OF ty_s_datasets
WITH UNIQUE KEY id .
TYPES:
BEGIN OF ty_s_cellrng_name ,
name TYPE string .
INCLUDE TYPE ty_s_coordinates .
TYPES:
END OF ty_s_cellrng_name ,
ty_t_cellrng_name TYPE STANDARD TABLE OF ty_s_cellrng_name
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_vmldrawings_rels .
INCLUDE TYPE ty_s_relstab .
TYPES:
media_path TYPE string ,
media_rawdata TYPE xstring ,
END OF ty_s_vmldrawings_rels ,
ty_t_vmldrawings_rels TYPE STANDARD TABLE OF ty_s_vmldrawings_rels WITH
DEFAULT KEY .
TYPES:
BEGIN OF ty_s_vmldrawings ,
id TYPE string ,
path TYPE string ,
ixml_doc TYPE REF TO if_ixml_document ,
rels_path TYPE string ,
t_rels TYPE ty_t_vmldrawings_rels ,
END OF ty_s_vmldrawings ,
ty_t_vmldrawings TYPE HASHED TABLE OF ty_s_vmldrawings
WITH UNIQUE KEY id .
TYPES:
BEGIN OF ty_s_sheetdata_template ,
t_patterns TYPE ty_t_patterns ,
t_sheetrels TYPE ty_t_relstab ,
t_drawings TYPE ty_t_drawings_tmp ,
vmldrawings TYPE ty_s_vmldrawings ,
END OF ty_s_sheetdata_template .
TYPES:
BEGIN OF ty_s_sheetdata_runtime .
INCLUDE TYPE ty_s_coordinates .
TYPES:
t_cells TYPE ty_t_cells ,
t_mergecells TYPE ty_t_mergecells ,
t_colprop TYPE ty_t_colprop ,
t_rowprop TYPE ty_t_rowprop ,
t_sheetrels TYPE ty_t_relstab ,
t_drawings TYPE ty_t_drawings ,
t_datavalid TYPE ty_t_datavalid_rt ,
drawing_path TYPE string ,
outlinelevelrow TYPE i ,
outlinelevelcol TYPE i ,
printtitles TYPE ty_s_coordinates ,
sheetprotection TYPE ty_s_sheetprotection ,
t_cellrng_name TYPE ty_t_cellrng_name ,
t_nopgbrk_range TYPE ty_t_nopgbrk_range ,
t_manual_pgbrk_col TYPE ty_t_manual_pgbrk ,
t_manual_pgbrk_row TYPE ty_t_manual_pgbrk ,
hidden TYPE flag ,
postprocessing_autofit TYPE flag ,
postprocessing_nopgbrk TYPE flag ,
END OF ty_s_sheetdata_runtime .
TYPES:
BEGIN OF ty_s_sheets ,
name TYPE ty_char31 ,
name_int TYPE ty_char100 ,
id TYPE ty_char100 ,
num TYPE ty_char100 ,
index TYPE i ,
ixml_doc TYPE REF TO if_ixml_document ,
summarybelow TYPE flag ,
summaryright TYPE flag ,
chartsheet TYPE flag ,
active TYPE flag ,
sheetdata_template TYPE ty_s_sheetdata_template ,
sheetdata_runtime TYPE ty_s_sheetdata_runtime ,
END OF ty_s_sheets ,
ty_t_sheets TYPE STANDARD TABLE OF ty_s_sheets
WITH KEY name .
TYPES:
BEGIN OF ty_s_textformat_styles ,
s TYPE i ,
END OF ty_s_textformat_styles ,
ty_t_textformat_styles TYPE HASHED TABLE OF ty_s_textformat_styles
WITH UNIQUE KEY s .
TYPES:
BEGIN OF ty_s_dateformat_styles ,
s TYPE i ,
END OF ty_s_dateformat_styles ,
ty_t_dateformat_styles TYPE HASHED TABLE OF ty_s_dateformat_styles
WITH UNIQUE KEY s .
TYPES:
BEGIN OF ty_s_model ,
ixml_doc_contenttypes TYPE REF TO if_ixml_document ,
ixml_doc_core TYPE REF TO if_ixml_document ,
ixml_doc_app TYPE REF TO if_ixml_document ,
ixml_doc_workbook TYPE REF TO if_ixml_document ,
ixml_doc_sharedstrings TYPE REF TO if_ixml_document ,
ixml_doc_calcchain TYPE REF TO if_ixml_document ,
ixml_doc_styles TYPE REF TO if_ixml_document ,
t_contentrels TYPE ty_t_relstab ,
t_workbookrels TYPE ty_t_relstab ,
t_sheets TYPE ty_t_sheets ,
t_sharedstrings TYPE ty_t_sharedstrings ,
t_calcchain TYPE ty_t_calcchain ,
t_media TYPE ty_t_media ,
t_charts TYPE ty_t_charts ,
t_datasets TYPE ty_t_datasets ,
t_textformat_styles TYPE ty_t_textformat_styles ,
t_dateformat_styles TYPE ty_t_dateformat_styles ,
t_vmldrawings TYPE ty_t_vmldrawings ,
v_refer_id TYPE ty_char10 ,
v_active_sheet_id TYPE ty_char100 ,
END OF ty_s_model .

DATA:
s_model TYPE ty_s_model READ-ONLY ,
r_zipfolder TYPE REF TO cl_abap_zip READ-ONLY ,
v_runtime TYPE flag ,
v_extension TYPE ty_char10 ,
t_elemsequence_worksheet TYPE ty_t_elemsequence ,
t_elemsequence_workbook TYPE ty_t_elemsequence .
CONSTANTS:
BEGIN OF c_tag ,
a TYPE string VALUE 'a' ,
p TYPE string VALUE 'p' ,
r TYPE string VALUE 'r' ,
s TYPE string VALUE 's' ,
t TYPE string VALUE 't' ,
c TYPE string VALUE 'c' ,
v TYPE string VALUE 'v' ,
table TYPE string VALUE 'table' ,
basetype TYPE string VALUE 'baseType' ,
drawing TYPE string VALUE 'drawing' ,
legacydrawing TYPE string VALUE 'legacyDrawing' ,
override TYPE string VALUE 'Override' ,
default TYPE string VALUE 'Default' ,
contenttype TYPE string VALUE 'ContentType' ,
extension TYPE string VALUE 'Extension' ,
partname TYPE string VALUE 'PartName' ,
relationships TYPE string VALUE 'Relationships' ,
relationship TYPE string VALUE 'Relationship' ,
type TYPE string VALUE 'Type' ,
types TYPE string VALUE 'Types' ,
target TYPE string VALUE 'Target' ,
twocellanchor TYPE string VALUE 'twoCellAnchor' ,
onecellanchor TYPE string VALUE 'oneCellAnchor' ,
headingpairs TYPE string VALUE 'HeadingPairs' ,
titlesofparts TYPE string VALUE 'TitlesOfParts' ,
vt TYPE string VALUE 'vt' ,
lpstr TYPE string VALUE 'lpstr' ,
i4 TYPE string VALUE 'i4' ,
i TYPE string VALUE 'i' ,
vector TYPE string VALUE 'vector' ,
variant TYPE string VALUE 'variant' ,
size TYPE string VALUE 'size' ,
id TYPE string VALUE 'id' ,
id_ TYPE string VALUE 'Id' ,
name TYPE string VALUE 'name' ,
sheet TYPE string VALUE 'sheet' ,
sheets TYPE string VALUE 'sheets' ,
sheetid TYPE string VALUE 'sheetId' ,
row TYPE string VALUE 'row' ,
rowoff TYPE string VALUE 'rowOff' ,
definednames TYPE string VALUE 'definedNames' ,
definedname TYPE string VALUE 'definedName' ,
localsheetid TYPE string VALUE 'localSheetId' ,
xlnmprinttitles TYPE string VALUE '_xlnm.Print_Titles' ,
si TYPE string VALUE 'si' ,
sst TYPE string VALUE 'sst' ,
space_ TYPE string VALUE 'space' ,
xml TYPE string VALUE 'xml' ,
xmlns TYPE string VALUE 'xmlns' ,
count TYPE string VALUE 'count' ,
uniquecount TYPE string VALUE 'uniqueCount' ,
workbookview TYPE string VALUE 'workbookView' ,
workbook TYPE string VALUE 'workbook' ,
activetab TYPE string VALUE 'activeTab' ,
mergecell TYPE string VALUE 'mergeCell' ,
mergecells TYPE string VALUE 'mergeCells' ,
ref TYPE string VALUE 'ref' ,
sheetdata TYPE string VALUE 'sheetData' ,
spans TYPE string VALUE 'spans' ,
worksheet TYPE string VALUE 'worksheet' ,
dimension TYPE string VALUE 'dimension' ,
selection TYPE string VALUE 'selection' ,
sheetformatpr TYPE string VALUE 'sheetFormatPr' ,
outlinelevelrow TYPE string VALUE 'outlineLevelRow' ,
outlinelevelcol TYPE string VALUE 'outlineLevelCol' ,
cols TYPE string VALUE 'cols' ,
col TYPE string VALUE 'col' ,
coloff TYPE string VALUE 'colOff' ,
calcchain TYPE string VALUE 'calcChain' ,
width TYPE string VALUE 'width' ,
style TYPE string VALUE 'style' ,
state TYPE string VALUE 'state' ,
hidden TYPE string VALUE 'hidden' ,
bestfit TYPE string VALUE 'bestfit' ,
customwidth TYPE string VALUE 'customWidth' ,
customheight TYPE string VALUE 'customHeight' ,
outlinelevel TYPE string VALUE 'outlineLevel' ,
customformat TYPE string VALUE 'customFormat' ,
collapsed TYPE string VALUE 'collapsed' ,
ht TYPE string VALUE 'ht' ,
min TYPE string VALUE 'min' ,
max TYPE string VALUE 'max' ,
xdr TYPE string VALUE 'xdr' ,
cnvpr TYPE string VALUE 'cNvPr' ,
pic TYPE string VALUE 'pic' ,
blip TYPE string VALUE 'blip' ,
embed TYPE string VALUE 'embed' ,
from TYPE string VALUE 'from' ,
to TYPE string VALUE 'to' ,
wsdr TYPE string VALUE 'wsDr' ,
editas TYPE string VALUE 'editAs' ,
onecell TYPE string VALUE 'oneCell' ,
clientdata TYPE string VALUE 'clientData' ,
nvpicpr TYPE string VALUE 'nvPicPr' ,
cnvpicpr TYPE string VALUE 'cNvPicPr' ,
descr TYPE string VALUE 'descr' ,
piclocks TYPE string VALUE 'picLocks' ,
nochangeaspect TYPE string VALUE 'noChangeAspect' ,
blipfill TYPE string VALUE 'blipFill' ,
stretch TYPE string VALUE 'stretch' ,
fillrect TYPE string VALUE 'fillRect' ,
sppr TYPE string VALUE 'spPr' ,
xfrm TYPE string VALUE 'xfrm' ,
off TYPE string VALUE 'off' ,
ext TYPE string VALUE 'ext' ,
x TYPE string VALUE 'x' ,
y TYPE string VALUE 'y' ,
cx TYPE string VALUE 'cx' ,
cy TYPE string VALUE 'cy' ,
prstgeom TYPE string VALUE 'prstGeom' ,
prst TYPE string VALUE 'prst' ,
rect TYPE string VALUE 'rect' ,
avlst TYPE string VALUE 'avLst' ,
jpeg TYPE string VALUE 'jpeg' ,
imagejpeg TYPE string VALUE 'image/jpeg' ,
emf TYPE string VALUE 'emf' ,
imageemf TYPE string VALUE 'image/x-emf' ,
outlinepr TYPE string VALUE 'outlinePr' ,
summarybelow TYPE string VALUE 'summaryBelow' ,
summaryright TYPE string VALUE 'summaryRight' ,
sheetprotection TYPE string VALUE 'sheetProtection' ,
password TYPE string VALUE 'password' ,
selectlockedcells TYPE string VALUE 'selectLockedCells' ,
selectunlockedcells TYPE string VALUE 'selectUnlockedCells' ,
formatcells TYPE string VALUE 'formatCells' ,
formatcolumns TYPE string VALUE 'formatColumns' ,
formatrows TYPE string VALUE 'formatRows' ,
insertcolumns TYPE string VALUE 'insertColumns' ,
insertrows TYPE string VALUE 'insertRows' ,
inserthyperlinks TYPE string VALUE 'insertHyperlinks' ,
deletecolumns TYPE string VALUE 'deleteColumns' ,
deleterows TYPE string VALUE 'deleteRows' ,
sort TYPE string VALUE 'sort' ,
autofilter TYPE string VALUE 'autoFilter' ,
pivottables TYPE string VALUE 'pivotTables' ,
objects TYPE string VALUE 'objects' ,
scenarios TYPE string VALUE 'scenarios' ,
cellxfs TYPE string VALUE 'cellXfs' ,
xf TYPE string VALUE 'xf' ,
numfmtid TYPE string VALUE 'numFmtId' ,
preserve TYPE string VALUE 'preserve' ,
properties TYPE string VALUE 'Properties' ,
coreproperties TYPE string VALUE 'coreProperties' ,
manager TYPE string VALUE 'Manager' ,
company TYPE string VALUE 'Company' ,
hyperlinkbase TYPE string VALUE 'HyperlinkBase' ,
contentstatus TYPE string VALUE 'contentStatus' ,
category TYPE string VALUE 'category' ,
description TYPE string VALUE 'description' ,
creator TYPE string VALUE 'creator' ,
subject TYPE string VALUE 'subject' ,
title TYPE string VALUE 'title' ,
keywords TYPE string VALUE 'keywords' ,
lastmodifiedby TYPE string VALUE 'lastModifiedBy' ,
dc TYPE string VALUE 'dc' ,
cp TYPE string VALUE 'cp' ,
rowbreaks TYPE string VALUE 'rowBreaks' ,
colbreaks TYPE string VALUE 'colBreaks' ,
manualbreakcount TYPE string VALUE 'manualBreakCount' ,
brk TYPE string VALUE 'brk' ,
man TYPE string VALUE 'man' ,
graphicframe TYPE string VALUE 'graphicFrame' ,
chart TYPE string VALUE 'chart' ,
plotarea TYPE string VALUE 'plotArea' ,
ser TYPE string VALUE 'ser' ,
val TYPE string VALUE 'val' ,
xval TYPE string VALUE 'xVal' ,
yval TYPE string VALUE 'yVal' ,
cat TYPE string VALUE 'cat' ,
idx TYPE string VALUE 'idx' ,
catax TYPE string VALUE 'catAx' ,
valax TYPE string VALUE 'valAx' ,
rich TYPE string VALUE 'rich' ,
tx TYPE string VALUE 'tx' ,
txpr TYPE string VALUE 'txPr' ,
strcache TYPE string VALUE 'strCache' ,
numcache TYPE string VALUE 'numCache' ,
pt TYPE string VALUE 'pt' ,
numref TYPE string VALUE 'numRef' ,
strref TYPE string VALUE 'strRef' ,
f TYPE string VALUE 'f' ,
layout TYPE string VALUE 'layout' ,
sheetview TYPE string VALUE 'sheetView' ,
tabselected TYPE string VALUE 'tabSelected' ,
endpararpr TYPE string VALUE 'endParaRPr' ,
datavalidation TYPE string VALUE 'dataValidation' ,
datavalidations TYPE string VALUE 'dataValidations' ,
sqref TYPE string VALUE 'sqref' ,
formula1 TYPE string VALUE 'formula1' ,
formula2 TYPE string VALUE 'formula2' ,
allowblank TYPE string VALUE 'allowBlank' ,
error TYPE string VALUE 'error' ,
errorstyle TYPE string VALUE 'errorStyle' ,
errortitle TYPE string VALUE 'errorTitle' ,
imemode TYPE string VALUE 'imeMode' ,
operator TYPE string VALUE 'operator' ,
prompt TYPE string VALUE 'prompt' ,
prompttitle TYPE string VALUE 'promptTitle' ,
showdropdown TYPE string VALUE 'showDropDown' ,
showerrormessage TYPE string VALUE 'showErrorMessage' ,
showinputmessage TYPE string VALUE 'showInputMessage' ,
type_ TYPE string VALUE 'type' ,
END OF c_tag .
CONSTANTS:
BEGIN OF c_contenttype ,
app TYPE string VALUE 'application/vnd.openxmlformats-
officedocument.extended-properties+xml' ,
workbook TYPE string VALUE 'application/vnd.openxmlformats-
officedocument.spreadsheetml.sheet.main+xml' ,
workbook_macro TYPE string VALUE 'application/vnd.ms-
excel.sheet.macroEnabled.main+xml' ,
workbook_macro12 TYPE string VALUE 'application/vnd.ms-
excel.sheet.macroEnabled.12.main+xml' ,
sharedstrings TYPE string VALUE 'application/vnd.openxmlformats-
officedocument.spreadsheetml.sharedStrings+xml' ,
calcchain TYPE string VALUE 'application/vnd.openxmlformats-
officedocument.spreadsheetml.calcChain+xml' ,
sheet TYPE string VALUE 'application/vnd.openxmlformats-
officedocument.spreadsheetml.worksheet+xml' ,
drawing TYPE string VALUE 'application/vnd.openxmlformats-
officedocument.drawing+xml' ,
chart TYPE string VALUE 'application/vnd.openxmlformats-
officedocument.drawingml.chart+xml' ,
chartstyle TYPE string VALUE 'application/vnd.ms-
office.chartstyle+xml' ,
chartcolors TYPE string VALUE 'application/vnd.ms-
office.chartcolorstyle+xml' ,
relationships TYPE string VALUE
'http://schemas.openxmlformats.org/package/2006/relationships' ,
thumbnail TYPE string VALUE
'http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail' ,
wb TYPE string VALUE
'http://schemas.openxmlformats.org/officeDocument/2006/relationships' ,
wb_sheet TYPE string VALUE
'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet' ,
wb_chartsheet TYPE string VALUE
'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet' ,
wb_sharedstrings TYPE string VALUE
'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings'
,
wb_calcchain TYPE string VALUE
'http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain' ,
wb_drawing TYPE string VALUE
'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing' ,
wb_vmldrawing TYPE string VALUE
'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing' ,
wb_image TYPE string VALUE
'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image' ,
wb_chart TYPE string VALUE
'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart' ,
wb_chartstyle TYPE string VALUE
'http://schemas.microsoft.com/office/2011/relationships/chartStyle' ,
wb_chartcolors TYPE string VALUE
'http://schemas.microsoft.com/office/2011/relationships/chartColorStyle' ,
wb_main TYPE string VALUE
'http://schemas.openxmlformats.org/spreadsheetml/2006/main' ,
wb_drawings TYPE string VALUE
'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing' ,
wb_drawings_main TYPE string VALUE
'http://schemas.openxmlformats.org/drawingml/2006/main' ,
END OF c_contenttype .
CONSTANTS:
BEGIN OF c_path ,
contenttypes TYPE string VALUE '[Content_Types].xml' ,
app TYPE string VALUE '/docProps/app.xml' ,
core TYPE string VALUE '/docProps/core.xml' ,
workbook TYPE string VALUE '/xl/workbook.xml' ,
sharedstrings TYPE string VALUE '/xl/sharedStrings.xml' ,
calcchain TYPE string VALUE '/xl/calcChain.xml' ,
styles TYPE string VALUE '/xl/styles.xml' ,
sheetsfolder TYPE string VALUE '/xl/worksheets' ,
drawingsfolder TYPE string VALUE '/xl/drawings' ,
drawingsfolder_ TYPE string VALUE '../drawings' ,
mediafolder TYPE string VALUE '/xl/media' ,
mediafolder_ TYPE string VALUE '../media' ,
chartsfolder TYPE string VALUE '/xl/charts' ,
chartsfolder_ TYPE string VALUE '../charts' ,
formparameters TYPE string VALUE '/FormParameters' ,
formhead TYPE string VALUE '/FormParameters/head.xml' ,
formproperties TYPE string VALUE '/FormParameters/properties.xml' ,
formhierarchy TYPE string VALUE '/FormParameters/hierarchy.xml' ,
END OF c_path .
CONSTANTS:
BEGIN OF c_drawing_type ,
vector TYPE i VALUE 1 ,
bitmap TYPE i VALUE 2 ,
chart TYPE i VALUE 3 ,
END OF c_drawing_type .
CONSTANTS:
c_numbers TYPE ty_char10 VALUE '0123456789' ,
c_numbers__ TYPE ty_char15 VALUE ' 0123456789' ,
c_numbers_ TYPE ty_char15 VALUE '-0123456789.' ,
c_character_set TYPE string VALUE 'UTF-8' .

METHODS:
constructor
IMPORTING iv_rawdata TYPE any OPTIONAL
it_document_table TYPE tsfmime OPTIONAL
iv_document_size TYPE i OPTIONAL
EXCEPTIONS error_file_reading ,
free ,
bufferization_baseinfo ,
rawdata_set
IMPORTING iv_rawdata TYPE any ,
rawdata_set_as_table
IMPORTING it_document_table TYPE tsfmime
iv_document_size TYPE i ,
rawdata_get
RETURNING value(rv_rawdata) TYPE ty_rawdata,
rawdata_get_as_table
EXPORTING et_document_table TYPE tsfmime
ev_document_size TYPE i ,
conv_nc
IMPORTING iv_number TYPE any
EXPORTING ev_char TYPE any ,
conv_cn
IMPORTING iv_char TYPE any
EXPORTING ev_number TYPE any ,
conv_ref_nc
IMPORTING iv_beg_x TYPE any OPTIONAL
iv_beg_y TYPE any OPTIONAL
iv_end_x TYPE any OPTIONAL
iv_end_y TYPE any OPTIONAL
iv_prefix TYPE any OPTIONAL
iv_prefix_x TYPE any OPTIONAL
iv_prefix_y TYPE any OPTIONAL
iv_sheetname TYPE any OPTIONAL
EXPORTING ev_ref TYPE any
ev_ref_2 TYPE any ,
conv_ref_nc_2
IMPORTING iv_beg_x TYPE any OPTIONAL
iv_beg_y TYPE any OPTIONAL
iv_end_x TYPE any OPTIONAL
iv_end_y TYPE any OPTIONAL
iv_prefix TYPE any OPTIONAL
iv_sheetname TYPE any
EXPORTING ev_ref TYPE any ,
conv_ref_cn
IMPORTING iv_ref TYPE any
EXPORTING ev_beg_x TYPE any
ev_beg_y TYPE any
ev_end_x TYPE any
ev_end_y TYPE any ,
conv_formula_r1c1_a1
IMPORTING iv_y TYPE any
iv_x TYPE any
CHANGING cv_formula TYPE any ,
conv_formula_r1c1_a1_getshift
CHANGING cv_substring TYPE any
cv_shift TYPE i .

PROTECTED SECTION .
METHODS:
xml_attrib_get
IMPORTING ir_node TYPE REF TO if_ixml_node
iv_attrib_name1 TYPE any OPTIONAL
iv_attrib_name2 TYPE any OPTIONAL
iv_attrib_name3 TYPE any OPTIONAL
iv_attrib_name4 TYPE any OPTIONAL
EXPORTING ev_attrib_value1 TYPE any
ev_attrib_value2 TYPE any
ev_attrib_value3 TYPE any
ev_attrib_value4 TYPE any ,
xml_load
IMPORTING iv_path TYPE any
iv_preserve TYPE flag OPTIONAL
RETURNING value(rv_ixml_doc) TYPE REF TO if_ixml_document ,
xml_save
IMPORTING iv_ixml_doc TYPE REF TO if_ixml_document
value(iv_path) TYPE any
iv_show TYPE flag OPTIONAL
RETURNING value(rv_xml_xstring) TYPE xstring ,
xml_string_to_dom
IMPORTING iv_string TYPE string
iv_preserve TYPE flag OPTIONAL
RETURNING value(rv_ixml_doc) TYPE REF TO if_ixml_document ,
xml_xstring_to_dom
IMPORTING iv_xstring TYPE xstring
iv_preserve TYPE flag OPTIONAL
RETURNING value(rv_ixml_doc) TYPE REF TO if_ixml_document ,
xml_insert_element
IMPORTING iv_name_element TYPE any
ir_ixml_element TYPE REF TO if_ixml_element
it_elemsequence TYPE ty_t_elemsequence
CHANGING cr_ixml_parent TYPE REF TO if_ixml_element ,
xml_relstab_get
IMPORTING iv_path TYPE any
RETURNING value(rt_relstab) TYPE ty_t_relstab ,
xml_relstab_set
IMPORTING iv_path TYPE any
it_relstab TYPE ty_t_relstab ,
xml_remove_nodes
IMPORTING iv_ixml_doc TYPE REF TO if_ixml_document
iv_name TYPE any
iv_namespace TYPE any OPTIONAL ,
template_getfrom_hardcode
RETURNING value(rv_rawdata) TYPE xstring .

ENDCLASS . "lcl_excel DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_excel IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_excel IMPLEMENTATION .
METHOD constructor .
super->constructor( ) .
CREATE OBJECT r_zipfolder .

IF it_document_table IS NOT SUPPLIED


AND iv_document_size IS NOT SUPPLIED
AND iv_rawdata IS NOT SUPPLIED .
v_runtime = abap_on .
ENDIF .
CHECK v_runtime IS INITIAL .

msg_init( ) .
IF it_document_table IS NOT INITIAL
AND iv_document_size IS NOT INITIAL .
rawdata_set_as_table( it_document_table = it_document_table
iv_document_size = iv_document_size ) .
ELSEIF iv_rawdata IS NOT INITIAL .
rawdata_set( iv_rawdata ) .

ELSE .
DATA lv_rawdata TYPE xstring .
lv_rawdata = template_getfrom_hardcode( ) .
rawdata_set( lv_rawdata ) .
ENDIF .
IF v_retcode EQ c_retcode-error .
MESSAGE e000(lp) WITH v_text-t336 " text: Error while reading
template file
RAISING error_file_reading .
ENDIF .
ENDMETHOD . "constructor
METHOD free .
CLEAR s_model .
FREE s_model .

IF r_zipfolder IS BOUND .
FREE r_zipfolder .
ENDIF .
ENDMETHOD . "free
METHOD conv_nc .
DATA:
lv_number TYPE i ,
lv_flt TYPE f ,
lv_int TYPE i ,
lv_tail TYPE i ,
lv_symbol TYPE ty_char1 .

lv_number = iv_number .

*-->> improve performance (set direct value without calculations)


CASE lv_number .
WHEN 1 . ev_char = 'A' . EXIT .
WHEN 2 . ev_char = 'B' . EXIT .
WHEN 3 . ev_char = 'C' . EXIT .
WHEN 4 . ev_char = 'D' . EXIT .
WHEN 5 . ev_char = 'E' . EXIT .
WHEN 6 . ev_char = 'F' . EXIT .
WHEN 7 . ev_char = 'G' . EXIT .
WHEN 8 . ev_char = 'H' . EXIT .
WHEN 9 . ev_char = 'I' . EXIT .
WHEN 10. ev_char = 'J' . EXIT .
WHEN 11. ev_char = 'K' . EXIT .
WHEN 12. ev_char = 'L' . EXIT .
WHEN 13. ev_char = 'M' . EXIT .
WHEN 14. ev_char = 'N' . EXIT .
WHEN 15. ev_char = 'O' . EXIT .
WHEN 16. ev_char = 'P' . EXIT .
WHEN 17. ev_char = 'Q' . EXIT .
WHEN 18. ev_char = 'R' . EXIT .
WHEN 19. ev_char = 'S' . EXIT .
WHEN 20. ev_char = 'T' . EXIT .
WHEN 21. ev_char = 'U' . EXIT .
WHEN 22. ev_char = 'V' . EXIT .
WHEN 23. ev_char = 'W' . EXIT .
WHEN 24. ev_char = 'X' . EXIT .
WHEN 25. ev_char = 'Y' . EXIT .
WHEN 26. ev_char = 'Z' . EXIT .
ENDCASE .
*<<-- improve performance (set direct value without calculations)

CLEAR ev_char .

WHILE lv_number GT 0 .
lv_flt = lv_number / 26 .
lv_int = TRUNC( lv_flt ).
lv_tail = lv_number - lv_int * 26 .

CASE lv_tail .
WHEN 1 . lv_symbol = 'A' .
WHEN 2 . lv_symbol = 'B' .
WHEN 3 . lv_symbol = 'C' .
WHEN 4 . lv_symbol = 'D' .
WHEN 5 . lv_symbol = 'E' .
WHEN 6 . lv_symbol = 'F' .
WHEN 7 . lv_symbol = 'G' .
WHEN 8 . lv_symbol = 'H' .
WHEN 9 . lv_symbol = 'I' .
WHEN 10. lv_symbol = 'J' .
WHEN 11. lv_symbol = 'K' .
WHEN 12. lv_symbol = 'L' .
WHEN 13. lv_symbol = 'M' .
WHEN 14. lv_symbol = 'N' .
WHEN 15. lv_symbol = 'O' .
WHEN 16. lv_symbol = 'P' .
WHEN 17. lv_symbol = 'Q' .
WHEN 18. lv_symbol = 'R' .
WHEN 19. lv_symbol = 'S' .
WHEN 20. lv_symbol = 'T' .
WHEN 21. lv_symbol = 'U' .
WHEN 22. lv_symbol = 'V' .
WHEN 23. lv_symbol = 'W' .
WHEN 24. lv_symbol = 'X' .
WHEN 25. lv_symbol = 'Y' .
WHEN 0 . lv_symbol = 'Z' . SUBTRACT 1 FROM lv_int .
ENDCASE .

CONCATENATE lv_symbol ev_char INTO ev_char .

lv_number = lv_int .
ENDWHILE .

ENDMETHOD . "conv_nc
METHOD conv_cn .
DATA:
lv_char TYPE ty_char1024 ,
lv_tail TYPE i ,
lv_strlen TYPE i ,
lv_offset TYPE i ,
lv_exponent TYPE i .
FIELD-SYMBOLS:
<symbol> TYPE ty_char1 .

lv_char = iv_char .

*-->> improve performance (direct value without calculations)


CASE lv_char.
WHEN 'A' . ev_number = 1 . EXIT .
WHEN 'B' . ev_number = 2 . EXIT .
WHEN 'C' . ev_number = 3 . EXIT .
WHEN 'D' . ev_number = 4 . EXIT .
WHEN 'E' . ev_number = 5 . EXIT .
WHEN 'F' . ev_number = 6 . EXIT .
WHEN 'G' . ev_number = 7 . EXIT .
WHEN 'H' . ev_number = 8 . EXIT .
WHEN 'I' . ev_number = 9 . EXIT .
WHEN 'J' . ev_number = 10. EXIT .
WHEN 'K' . ev_number = 11. EXIT .
WHEN 'L' . ev_number = 12. EXIT .
WHEN 'M' . ev_number = 13. EXIT .
WHEN 'N' . ev_number = 14. EXIT .
WHEN 'O' . ev_number = 15. EXIT .
WHEN 'P' . ev_number = 16. EXIT .
WHEN 'Q' . ev_number = 17. EXIT .
WHEN 'R' . ev_number = 18. EXIT .
WHEN 'S' . ev_number = 19. EXIT .
WHEN 'T' . ev_number = 20. EXIT .
WHEN 'U' . ev_number = 21. EXIT .
WHEN 'V' . ev_number = 22. EXIT .
WHEN 'W' . ev_number = 23. EXIT .
WHEN 'X' . ev_number = 24. EXIT .
WHEN 'Y' . ev_number = 25. EXIT .
WHEN 'Z' . ev_number = 26. EXIT .
ENDCASE .
*<<-- improve performance (direct value without calculations)

CLEAR ev_number .

IF lv_char CA c_numbers .
CLEAR lv_char+sy-fdpos .
ENDIF .
CONDENSE lv_char NO-GAPS .

lv_strlen = STRLEN( lv_char ) .


lv_offset = -1 .

DO lv_strlen TIMES .
lv_exponent = lv_strlen - sy-index .
ADD 1 TO lv_offset .

ASSIGN lv_char+lv_offset(1)
TO <symbol> .

CASE <symbol>.
WHEN 'A' . lv_tail = 1 .
WHEN 'B' . lv_tail = 2 .
WHEN 'C' . lv_tail = 3 .
WHEN 'D' . lv_tail = 4 .
WHEN 'E' . lv_tail = 5 .
WHEN 'F' . lv_tail = 6 .
WHEN 'G' . lv_tail = 7 .
WHEN 'H' . lv_tail = 8 .
WHEN 'I' . lv_tail = 9 .
WHEN 'J' . lv_tail = 10.
WHEN 'K' . lv_tail = 11.
WHEN 'L' . lv_tail = 12.
WHEN 'M' . lv_tail = 13.
WHEN 'N' . lv_tail = 14.
WHEN 'O' . lv_tail = 15.
WHEN 'P' . lv_tail = 16.
WHEN 'Q' . lv_tail = 17.
WHEN 'R' . lv_tail = 18.
WHEN 'S' . lv_tail = 19.
WHEN 'T' . lv_tail = 20.
WHEN 'U' . lv_tail = 21.
WHEN 'V' . lv_tail = 22.
WHEN 'W' . lv_tail = 23.
WHEN 'X' . lv_tail = 24.
WHEN 'Y' . lv_tail = 25.
WHEN 'Z' . lv_tail = 26.
WHEN OTHERS. CLEAR ev_number. EXIT .
ENDCASE .

ev_number = ev_number + lv_tail * ( 26 ** lv_exponent ) .


ENDDO .

ENDMETHOD . "conv_cn
METHOD conv_ref_nc .
DATA:
lv_beg_x_char TYPE ty_char100 ,
lv_beg_y_char TYPE ty_char100 ,
lv_end_x_char TYPE ty_char100 ,
lv_end_y_char TYPE ty_char100 ,
lv_ref TYPE ty_char1024 .

IF iv_beg_x IS NOT INITIAL


AND iv_beg_y IS NOT INITIAL .
lv_beg_y_char = iv_beg_y .
CONDENSE lv_beg_y_char .

conv_nc( EXPORTING iv_number = iv_beg_x


IMPORTING ev_char = lv_beg_x_char ) .
CONCATENATE iv_prefix iv_prefix_x lv_beg_x_char iv_prefix iv_prefix_y
lv_beg_y_char INTO lv_ref .
ENDIF .

IF iv_end_x IS NOT INITIAL


AND iv_end_y IS NOT INITIAL .
lv_end_y_char = iv_end_y .
CONDENSE lv_end_y_char .

conv_nc( EXPORTING iv_number = iv_end_x


IMPORTING ev_char = lv_end_x_char ) .
CONCATENATE lv_ref ':' iv_prefix iv_prefix_x lv_end_x_char iv_prefix
iv_prefix_y lv_end_y_char INTO lv_ref .
ENDIF .

ev_ref_2 = lv_ref .

IF iv_sheetname IS NOT INITIAL .


CONCATENATE '''' iv_sheetname '''' '!' lv_ref INTO lv_ref .
ENDIF .

ev_ref = lv_ref .
ENDMETHOD . "conv_ref_nc
METHOD conv_ref_nc_2 .
DATA:
lv_beg_x_char TYPE ty_char100 ,
lv_beg_y_char TYPE ty_char100 ,
lv_end_x_char TYPE ty_char100 ,
lv_end_y_char TYPE ty_char100 ,
lv_ref TYPE ty_char1024 .
CLEAR ev_ref .

IF iv_beg_x IS NOT INITIAL


AND iv_end_x IS NOT INITIAL .
conv_nc( EXPORTING iv_number = iv_beg_x
IMPORTING ev_char = lv_beg_x_char ) .
conv_nc( EXPORTING iv_number = iv_end_x
IMPORTING ev_char = lv_end_x_char ) .
CONCATENATE '''' iv_sheetname '''' '!'
iv_prefix lv_beg_x_char ':' iv_prefix lv_end_x_char INTO lv_ref .
ENDIF .

IF iv_beg_y IS NOT INITIAL


AND iv_end_y IS NOT INITIAL .
lv_beg_y_char = iv_beg_y .
CONDENSE lv_beg_y_char NO-GAPS .

lv_end_y_char = iv_end_y .
CONDENSE lv_end_y_char NO-GAPS .

IF lv_ref IS NOT INITIAL .


CONCATENATE lv_ref ',' INTO lv_ref .
ENDIF .
CONCATENATE '''' iv_sheetname '''' '!'
iv_prefix lv_beg_y_char ':' iv_prefix lv_end_y_char INTO lv_ref .
ENDIF .

ev_ref = lv_ref .

ENDMETHOD . "conv_ref_nc_2
METHOD conv_ref_cn .
DATA:
lv_ref TYPE ty_char1024 ,
lv_ref_beg TYPE ty_char100 ,
lv_ref_end TYPE ty_char100 ,
lv_beg_x_char TYPE ty_char100 ,
lv_beg_y_char TYPE ty_char100 ,
lv_end_x_char TYPE ty_char100 ,
lv_end_y_char TYPE ty_char100 .
CLEAR:
ev_beg_x ,
ev_beg_y ,
ev_end_x ,
ev_end_y .
CHECK iv_ref IS NOT INITIAL .

lv_ref = iv_ref .
SPLIT lv_ref AT ':' INTO lv_ref_beg lv_ref_end .

IF lv_ref_beg IS NOT INITIAL .


IF lv_ref_beg CA c_numbers .
lv_beg_x_char = lv_ref_beg(sy-fdpos).
lv_beg_y_char = lv_ref_beg+sy-fdpos .

conv_cn( EXPORTING iv_char = lv_beg_x_char


IMPORTING ev_number = ev_beg_x ) .
ev_beg_y = lv_beg_y_char .
ENDIF .
ENDIF .

IF lv_ref_end IS NOT INITIAL .


IF lv_ref_end CA c_numbers .
lv_end_x_char = lv_ref_end(sy-fdpos).
lv_end_y_char = lv_ref_end+sy-fdpos .

conv_cn( EXPORTING iv_char = lv_end_x_char


IMPORTING ev_number = ev_end_x ) .
ev_end_y = lv_end_y_char .
ENDIF .
ENDIF .

ENDMETHOD . "conv_ref_cn
METHOD conv_formula_r1c1_a1 .

*======================================================================
* convert R1C1 notation to A1
*======================================================================

DATA:
lt_result_tab TYPE match_result_tab ,
lv_i TYPE i ,
lv_i2 TYPE i ,
lv_x TYPE i ,
lv_x_prefix TYPE string ,
lv_y TYPE i ,
lv_y_prefix TYPE string ,
lv_shift TYPE i ,
lv_substring TYPE c LENGTH 10000 ,
lv_sub_r TYPE c LENGTH 10000 ,
lv_sub_c TYPE c LENGTH 10000 ,
lv_formula_a1 TYPE string .
FIELD-SYMBOLS:
<ls_result_tab> TYPE match_result ,
<ls_submatches> TYPE submatch_result .

* check: does formula use R1C1 notation ?


TRY.
FIND ALL OCCURRENCES OF REGEX 'R((\[-?\d+\])|(\d+))C((\[-?\d+\])|(\d+))|
R((\[-?\d+\])|(\d+))C|RC((\[-?\d+\])|(\d+))'
IN cv_formula
RESULTS lt_result_tab .
CATCH cx_sy_regex
cx_sy_regex_too_complex .
RETURN .
ENDTRY .

CHECK lt_result_tab IS NOT INITIAL .

* Yes, R1C1 notation!


SORT lt_result_tab BY offset .

LOOP AT lt_result_tab ASSIGNING <ls_result_tab> .

* ===========
IF <ls_result_tab>-offset > lv_i .
lv_i2 = <ls_result_tab>-offset - lv_i .
CONCATENATE lv_formula_a1
cv_formula+lv_i(lv_i2)
INTO lv_formula_a1 .
ENDIF .
lv_i = <ls_result_tab>-offset + <ls_result_tab>-length .

lv_substring = cv_formula+<ls_result_tab>-offset(<ls_result_tab>-length) .

DO 1 TIMES .
CHECK lv_substring(1) EQ 'R' .
CHECK lv_substring CS 'C' .
lv_sub_r = lv_substring(sy-fdpos) .
lv_sub_c = lv_substring+sy-fdpos .

* Row
SHIFT lv_sub_r LEFT DELETING LEADING 'R' .
IF lv_sub_r IS INITIAL .
lv_y = iv_y .
lv_y_prefix = space .

ELSEIF lv_sub_r CP '[*]' .


conv_formula_r1c1_a1_getshift( CHANGING cv_substring = lv_sub_r
cv_shift = lv_shift ) .
lv_y = iv_y + lv_shift .
lv_y_prefix = space .
ELSE .
CHECK lv_sub_r CO c_numbers__ .
lv_y = lv_sub_r .
lv_y_prefix = '$' .
ENDIF .

* Column
SHIFT lv_sub_c LEFT DELETING LEADING 'C' .
IF lv_sub_c IS INITIAL .
lv_x = iv_x .
lv_x_prefix = space .

ELSEIF lv_sub_c CP '[*]' .


conv_formula_r1c1_a1_getshift( CHANGING cv_substring = lv_sub_c
cv_shift = lv_shift ) .
lv_x = iv_x + lv_shift .
lv_x_prefix = space .

ELSE .
CHECK lv_sub_c CO c_numbers__ .
lv_x = lv_sub_c .
lv_x_prefix = '$' .
ENDIF .

* convert to 'A1' notation


conv_ref_nc( EXPORTING iv_beg_x = lv_x
iv_beg_y = lv_y
iv_prefix_x = lv_x_prefix
iv_prefix_y = lv_y_prefix
IMPORTING ev_ref = lv_substring ) .
ENDDO .

* ===========
CONCATENATE lv_formula_a1
lv_substring
INTO lv_formula_a1 .

AT LAST .
CHECK STRLEN( cv_formula ) > lv_i .
CONCATENATE lv_formula_a1
cv_formula+lv_i
INTO lv_formula_a1 .
ENDAT .
ENDLOOP .

* replace R1C1-style formula with A1-style


cv_formula = lv_formula_a1 .

ENDMETHOD . "conv_formula_r1c1_a1
METHOD conv_formula_r1c1_a1_getshift .
* get relative shift: number inside the square brackets (for example [-5] )
DATA:
lv_negative TYPE flag ,
lv_length TYPE i .

CLEAR cv_shift .

CHECK cv_substring IS NOT INITIAL .


CHECK cv_substring(1) EQ '[' .

cv_substring = cv_substring+1 .

IF cv_substring(1) EQ '-' .
cv_substring = cv_substring+1 .
lv_negative = abap_on .
ELSE .
lv_negative = space .
ENDIF .

CHECK cv_substring CS ']' .

lv_length = sy-fdpos .
cv_shift = cv_substring(lv_length) .

ADD 1 TO lv_length .
cv_substring = cv_substring+lv_length .

CHECK lv_negative IS NOT INITIAL .


cv_shift = - cv_shift .
ENDMETHOD . "conv_formula_r1c1_a1_getshift
METHOD xml_attrib_get .
DATA:
lr_ndmap TYPE REF TO if_ixml_named_node_map ,
lr_nditerator TYPE REF TO if_ixml_node_iterator ,
lr_attrib TYPE REF TO if_ixml_node ,
lv_attrib_name TYPE string ,
lv_attrib_value TYPE string .

CLEAR ev_attrib_value1 .
CLEAR ev_attrib_value2 .
CLEAR ev_attrib_value3 .
CLEAR ev_attrib_value4 .

lr_ndmap = ir_node->get_attributes( ) .
lr_nditerator = lr_ndmap->create_iterator( ) .
lr_attrib = lr_nditerator->get_next( ) .

WHILE lr_attrib IS NOT INITIAL .


lv_attrib_name = lr_attrib->get_name( ) .
lv_attrib_value = lr_attrib->get_value( ) .

CASE lv_attrib_name .
WHEN iv_attrib_name1 . ev_attrib_value1 = lv_attrib_value .
WHEN iv_attrib_name2 . ev_attrib_value2 = lv_attrib_value .
WHEN iv_attrib_name3 . ev_attrib_value3 = lv_attrib_value .
WHEN iv_attrib_name4 . ev_attrib_value4 = lv_attrib_value .
WHEN OTHERS .
ENDCASE .

lr_attrib = lr_nditerator->get_next( ) .
ENDWHILE .

ENDMETHOD . "xml_attrib_get
METHOD xml_load .
DATA:
lv_name TYPE string ,
lv_content TYPE xstring .
lv_name = iv_path .
SHIFT lv_name LEFT DELETING LEADING '/' .

r_zipfolder->get( EXPORTING name = lv_name


IMPORTING content = lv_content
EXCEPTIONS OTHERS = 1 ) .
CHECK sy-subrc EQ 0 .

rv_ixml_doc = xml_xstring_to_dom( iv_xstring = lv_content iv_preserve =


iv_preserve ) .
ENDMETHOD . "xml_load
METHOD xml_string_to_dom .
DATA lv_xstring TYPE xstring .
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = iv_string
IMPORTING
buffer = lv_xstring
EXCEPTIONS
OTHERS = 2.
CHECK sy-subrc EQ 0 .

rv_ixml_doc = xml_xstring_to_dom( iv_xstring = lv_xstring iv_preserve =


iv_preserve ) .
ENDMETHOD . "xml_string_to_dom
METHOD xml_xstring_to_dom .
DATA:
lr_ixml TYPE REF TO if_ixml ,
lr_istream TYPE REF TO if_ixml_istream ,
lr_parser TYPE REF TO if_ixml_parser ,
lr_parse_error TYPE REF TO if_ixml_parse_error ,
lr_stream_factory TYPE REF TO if_ixml_stream_factory ,
lv_err_count TYPE i ,
lv_err_index TYPE i ,
lv_err_reason TYPE string .
lr_ixml = cl_ixml=>create( ) .
rv_ixml_doc = lr_ixml->create_document( ) .
lr_stream_factory = lr_ixml->create_stream_factory( ) .
lr_istream = lr_stream_factory->create_istream_xstring( iv_xstring ) .

lr_parser = lr_ixml->create_parser( stream_factory = lr_stream_factory


istream = lr_istream
document = rv_ixml_doc ) .
IF iv_preserve IS NOT INITIAL .
lr_parser->add_preserve_space_element( ) .
ENDIF .

IF lr_parser->parse( ) NE 0
AND lr_parser->num_errors( ) NE 0 .
lv_err_count = lr_parser->num_errors( ) .
WHILE lv_err_index < lv_err_count .
lr_parse_error = lr_parser->get_error( index = lv_err_index ) .
lv_err_reason = lr_parse_error->get_reason( ) .
MESSAGE i000(lp) WITH lv_err_reason .
ADD 1 TO lv_err_index .
ENDWHILE .
ENDIF .

lr_istream->close( ) .
ENDMETHOD . "xml_xstring_to_dom
METHOD xml_save .
DATA:
lr_ixml TYPE REF TO if_ixml ,
lr_streamfactory TYPE REF TO if_ixml_stream_factory ,
lr_ostream TYPE REF TO if_ixml_ostream ,
lr_encoding TYPE REF TO if_ixml_encoding ,
lr_renderer TYPE REF TO if_ixml_renderer .

CHECK iv_ixml_doc IS NOT INITIAL .

iv_ixml_doc->set_standalone( standalone = abap_true ) .

lr_ixml = cl_ixml=>create( ) .
lr_streamfactory = lr_ixml->create_stream_factory( ) .

*----------render XML into xstring


lr_ostream = lr_streamfactory->create_ostream_xstring( string =
rv_xml_xstring ) .
lr_encoding = lr_ixml->create_encoding( character_set = c_character_set
byte_order = 0 ) .
lr_ostream->set_encoding( encoding = lr_encoding ) .
* lr_ostream->set_pretty_print( pretty_print = abap_on ) .

lr_renderer = lr_ixml->create_renderer( ostream = lr_ostream


document = iv_ixml_doc ) .
lr_renderer->render( ) .

*----------save content into ZIP-folder


SHIFT iv_path LEFT DELETING LEADING '/' .

r_zipfolder->delete( EXPORTING name = iv_path


EXCEPTIONS OTHERS = 0 ) .

r_zipfolder->add( name = iv_path


content = rv_xml_xstring ) .

IF iv_show IS NOT INITIAL .


DATA lv_title TYPE ty_char100 .
lv_title = iv_path .
CALL FUNCTION 'DISPLAY_XML_STRING'
EXPORTING
title = lv_title
xml_string = rv_xml_xstring
EXCEPTIONS
OTHERS = 0.
ENDIF .
ENDMETHOD . "xml_save
METHOD xml_insert_element .

DATA:
lv_tabix TYPE sytabix ,
lv_index TYPE syindex ,
ls_elemsequence TYPE ty_s_elemsequence ,
lr_ixml_node TYPE REF TO if_ixml_node ,
lr_ixml_node_any TYPE REF TO if_ixml_node ,
lr_ixml_node_next TYPE REF TO if_ixml_node ,
lr_ixml_ncol TYPE REF TO if_ixml_node_collection .

* lookup a previous element (according the sequence)


READ TABLE it_elemsequence TRANSPORTING NO FIELDS
WITH KEY element = iv_name_element .
lv_tabix = sy-tabix + 1 .
LOOP AT it_elemsequence INTO ls_elemsequence FROM lv_tabix .
FREE lr_ixml_ncol .
lr_ixml_ncol = cr_ixml_parent->get_elements_by_tag_name( name =
ls_elemsequence-element depth = 1 ) .
CHECK lr_ixml_ncol IS BOUND .

lv_index = lr_ixml_ncol->get_length( ) - 1 .
CHECK lv_index GE 0 .

lr_ixml_node_any = lr_ixml_ncol->get_item( index = lv_index ) .


EXIT .
ENDLOOP .

* insert the new node exactly AFTER node that has been found
CHECK lr_ixml_node_any IS BOUND .
lr_ixml_node_next = lr_ixml_node_any->get_next( ) .
lr_ixml_node ?= ir_ixml_element .

IF lr_ixml_node_next IS BOUND .
cr_ixml_parent->insert_child( new_child = lr_ixml_node
ref_child = lr_ixml_node_next ) .
ELSE .
cr_ixml_parent->append_child( new_child = lr_ixml_node ) .
ENDIF .

ENDMETHOD . "xml_insert_element
METHOD xml_relstab_get .
DATA:
lr_document TYPE REF TO if_ixml_document ,
lr_ncol TYPE REF TO if_ixml_node_collection ,
lr_node TYPE REF TO if_ixml_node ,
lv_index TYPE syindex ,
lv_fullpath_rels TYPE string ,
lv_path TYPE string ,
lv_file TYPE string ,
ls_relstab TYPE ty_s_relstab .

CLEAR rt_relstab .
FREE rt_relstab .

* split source fullpath


path_file_split( EXPORTING iv_fullpath = iv_path
IMPORTING ev_path = lv_path
ev_file = lv_file ) .

* build new fullpath for RELS


CONCATENATE lv_path '_rels/' lv_file '.rels' INTO lv_fullpath_rels .
lr_document = xml_load( iv_path = lv_fullpath_rels ).

CHECK lr_document IS BOUND .


lr_ncol = lr_document->get_elements_by_tag_name( name = c_tag-relationship
depth = 2 ) .
CHECK lr_ncol IS BOUND .
DO .
lv_index = sy-index - 1.
lr_node = lr_ncol->get_item( index = lv_index ).
IF lr_node IS INITIAL. EXIT. ENDIF.

xml_attrib_get( EXPORTING ir_node = lr_node


iv_attrib_name1 = c_tag-target
iv_attrib_name2 = c_tag-type
iv_attrib_name3 = c_tag-id_
IMPORTING ev_attrib_value1 = ls_relstab-target
ev_attrib_value2 = ls_relstab-type
ev_attrib_value3 = ls_relstab-id ) .
APPEND ls_relstab TO rt_relstab .
ENDDO .
ENDMETHOD . "xml_relstab_get
METHOD xml_relstab_set .
DATA:
lv_fullpath_rels TYPE string ,
lv_path TYPE string ,
lv_file TYPE string ,
ls_relstab TYPE ty_s_relstab ,
lr_ixml TYPE REF TO if_ixml ,
lr_ixml_doc TYPE REF TO if_ixml_document .
DATA:
BEGIN OF lr_element ,
relationships TYPE REF TO if_ixml_element ,
relationship TYPE REF TO if_ixml_element ,
END OF lr_element .

CHECK it_relstab[] IS NOT INITIAL .

* compose XML
lr_ixml = cl_ixml=>create( ) .
lr_ixml_doc = lr_ixml->create_document( ) .

lr_element-relationships = " Root-node


lr_ixml_doc->create_simple_element(
name = c_tag-relationships
parent = lr_ixml_doc ) .
lr_element-relationships->set_attribute(
name = c_tag-xmlns
value = c_contenttype-relationships ).

LOOP AT it_relstab INTO ls_relstab .


lr_element-relationship =
lr_ixml_doc->create_simple_element(
name = c_tag-relationship
parent = lr_element-relationships ).
lr_element-relationship->set_attribute(
name = c_tag-id_
value = ls_relstab-id ).
lr_element-relationship->set_attribute(
name = c_tag-type
value = ls_relstab-type ).
lr_element-relationship->set_attribute(
name = c_tag-target
value = ls_relstab-target ).
ENDLOOP .

* split source fullpath


path_file_split( EXPORTING iv_fullpath = iv_path
IMPORTING ev_path = lv_path
ev_file = lv_file ) .

* build new fullpath for RELS


CONCATENATE lv_path '_rels/' lv_file '.rels' INTO lv_fullpath_rels .

* send XML to ZIP-folder


xml_save( iv_ixml_doc = lr_ixml_doc
iv_path = lv_fullpath_rels ) .

ENDMETHOD . "xml_relstab_set
METHOD xml_remove_nodes .
DATA:
lr_ncol TYPE REF TO if_ixml_node_collection ,
lr_node TYPE REF TO if_ixml_node ,
lv_index TYPE sy-index .

IF iv_namespace IS INITIAL .
lr_ncol = iv_ixml_doc->get_elements_by_tag_name(
name = iv_name ) .
ELSE .
lr_ncol = iv_ixml_doc->get_elements_by_tag_name(
name = iv_name
namespace = iv_namespace ) .
ENDIF .
IF lr_ncol IS BOUND .
DO .
lv_index = sy-index - 1 .
lr_node = lr_ncol->get_item( index = lv_index ) .
IF lr_node IS NOT BOUND. EXIT. ENDIF .
lr_node->remove_node( ) .
ENDDO .
ENDIF .
ENDMETHOD . "xml_remove_nodes
METHOD bufferization_baseinfo .
CHECK r_zipfolder->save( ) IS NOT INITIAL .

*======================================================================
* bufferization header data
*======================================================================
s_model-ixml_doc_contenttypes = xml_load( iv_path = c_path-contenttypes ) .
s_model-ixml_doc_core = xml_load( iv_path = c_path-core ) .
s_model-ixml_doc_app = xml_load( iv_path = c_path-app ) .
s_model-ixml_doc_workbook = xml_load( iv_path = c_path-workbook ) .
s_model-ixml_doc_sharedstrings = xml_load( iv_path = c_path-sharedstrings
iv_preserve = abap_on ) .
s_model-ixml_doc_styles = xml_load( iv_path = c_path-styles ) .
s_model-t_contentrels = xml_relstab_get( c_path-contenttypes ) .
s_model-t_workbookrels = xml_relstab_get( c_path-workbook ) .

*======================================================================
* bufferization sheets data
*======================================================================
FIELD-SYMBOLS:
<sheets> TYPE ty_s_sheets ,
<chart_series> TYPE ty_s_chart_series .
TYPES:
BEGIN OF ty_s_images ,
id TYPE string ,
value TYPE xstring ,
END OF ty_s_images ,
ty_t_images TYPE HASHED TABLE OF ty_s_images
WITH UNIQUE KEY id .
DATA:
ls_textformat_styles TYPE ty_s_textformat_styles ,
ls_dateformat_styles TYPE ty_s_dateformat_styles ,
lv_string_tmp TYPE string ,
lv_index TYPE sy-index ,
lv_path_sheet TYPE string ,
lv_path TYPE string ,
lv_id TYPE string ,
lv_id_drawings TYPE string ,
ls_drawings TYPE ty_s_drawings_tmp ,
lv_numfmtid TYPE i ,
lv_partname TYPE string ,
lv_contenttype TYPE string ,
lr_ncol TYPE REF TO if_ixml_node_collection ,
lr_node TYPE REF TO if_ixml_node ,
lr_twocellanchor_ncol TYPE REF TO if_ixml_node_collection ,
lr_twocellanchor_node TYPE REF TO if_ixml_node ,
lr_ser_ncol TYPE REF TO if_ixml_node_collection ,
lr_ser_node TYPE REF TO if_ixml_node ,
ls_sheetrels TYPE ty_s_relstab ,
ls_drawingrels TYPE ty_s_relstab ,
lt_drawingrels TYPE ty_t_relstab ,
ls_vmldrawing_rels TYPE ty_s_vmldrawings_rels ,
ls_vmldrawingrels TYPE ty_s_relstab ,
lt_vmldrawingrels TYPE ty_t_relstab ,
ls_chartrels TYPE ty_s_relstab ,
lt_chartrels TYPE ty_t_relstab ,
lr_drawing_doc TYPE REF TO if_ixml_document ,
ls_workbookrels TYPE ty_s_relstab .
DATA:
BEGIN OF lr_element ,
any TYPE REF TO if_ixml_element ,
twocellanchor TYPE REF TO if_ixml_element ,
drawing TYPE REF TO if_ixml_element ,
legacydrawing TYPE REF TO if_ixml_element ,
cnvpr TYPE REF TO if_ixml_element ,
pic TYPE REF TO if_ixml_element ,
blip TYPE REF TO if_ixml_element ,
cellxfs TYPE REF TO if_ixml_element ,
outlinepr TYPE REF TO if_ixml_element ,
graphicframe TYPE REF TO if_ixml_element ,
chart TYPE REF TO if_ixml_element ,
plotarea TYPE REF TO if_ixml_element ,
ser TYPE REF TO if_ixml_element ,
idx TYPE REF TO if_ixml_element ,
tx TYPE REF TO if_ixml_element ,
strcache TYPE REF TO if_ixml_element ,
pt TYPE REF TO if_ixml_element ,
v TYPE REF TO if_ixml_element ,
sheetview TYPE REF TO if_ixml_element ,
END OF lr_element .

IF s_model-ixml_doc_workbook IS NOT BOUND


OR s_model-ixml_doc_styles IS NOT BOUND .
MESSAGE e000(lp) WITH v_text-t336 " text: Error while reading
template file
INTO v_dummy .
msg_syst_catch( ) .
RETURN .
ENDIF .

*======================================================================
* format definition (analyze [Content_Types].xml)
*======================================================================
DO 1 TIMES .
CLEAR v_extension .
lr_ncol =
s_model-ixml_doc_contenttypes->get_elements_by_tag_name(
name = c_tag-override ) .
CHECK lr_ncol IS BOUND .
DO .
lv_index = sy-index - 1 .
lr_node = lr_ncol->get_item( index = lv_index ) .
IF lr_node IS INITIAL. EXIT. ENDIF .

xml_attrib_get( EXPORTING ir_node = lr_node


iv_attrib_name1 = c_tag-partname
iv_attrib_name2 = c_tag-contenttype
IMPORTING ev_attrib_value1 = lv_partname
ev_attrib_value2 = lv_contenttype ) .
CHECK lv_partname EQ c_path-workbook .
CASE lv_contenttype .
WHEN c_contenttype-workbook_macro
OR c_contenttype-workbook_macro12 .
v_extension = c_extension_xlsm .
WHEN c_contenttype-workbook .
v_extension = c_extension_xlsx .
ENDCASE .
ENDDO .

CHECK v_extension IS INITIAL .


v_extension = c_extension_xlsx .
ENDDO .

*======================================================================
* bufferization styles (get styles with text format)
*======================================================================
DO 1 TIMES .
lr_element-cellxfs =
s_model-ixml_doc_styles->find_from_name( name = c_tag-cellxfs depth = 1 ) .
CHECK lr_element-cellxfs IS BOUND .

lr_ncol =
lr_element-cellxfs->get_elements_by_tag_name(
name = c_tag-xf
depth = 1 ) .
CHECK lr_ncol IS BOUND .
DO .
lv_index = sy-index - 1 .
lr_node = lr_ncol->get_item( index = lv_index ) .
IF lr_node IS INITIAL. EXIT. ENDIF .

xml_attrib_get( EXPORTING ir_node = lr_node


iv_attrib_name1 = c_tag-numfmtid
IMPORTING ev_attrib_value1 = lv_numfmtid ) .
IF lv_numfmtid EQ 49 . " -->> Text
ls_textformat_styles-s = lv_index .
INSERT ls_textformat_styles INTO TABLE s_model-t_textformat_styles .

ELSEIF lv_numfmtid BETWEEN 14 AND 22 " -->> Date


OR lv_numfmtid BETWEEN 165 AND 180 .
ls_dateformat_styles-s = lv_index .
INSERT ls_dateformat_styles INTO TABLE s_model-t_dateformat_styles .
ENDIF .
ENDDO .
ENDDO .

*======================================================================
* analyze xl/workbook.xml
* and add sheets into buffer
*======================================================================
lr_ncol =
s_model-ixml_doc_workbook->get_elements_by_tag_name(
name = c_tag-sheet
depth = 3 ) .
CHECK lr_ncol IS BOUND .
DO .
lv_index = sy-index - 1 .
lr_node = lr_ncol->get_item( index = lv_index ) .
IF lr_node IS INITIAL. EXIT. ENDIF .

APPEND INITIAL LINE TO s_model-t_sheets


ASSIGNING <sheets> .

xml_attrib_get( EXPORTING ir_node = lr_node


iv_attrib_name1 = c_tag-name
iv_attrib_name2 = c_tag-id
IMPORTING ev_attrib_value1 = <sheets>-name
ev_attrib_value2 = <sheets>-id ) .
ENDDO .

*======================================================================
* loop at worksheets
*======================================================================
LOOP AT s_model-t_sheets ASSIGNING <sheets> .

FREE lr_drawing_doc . CLEAR lr_drawing_doc .


FREE lt_drawingrels . CLEAR lt_drawingrels .

READ TABLE s_model-t_workbookrels INTO ls_workbookrels


WITH KEY type = c_contenttype-wb_sheet
id = <sheets>-id .
IF sy-subrc NE 0 .
DELETE s_model-t_sheets .
CONTINUE .
* READ TABLE s_model-t_workbookrels INTO ls_workbookrels
* WITH KEY type = c_contenttype-wb_chartsheet
* id = <sheets>-id .
* CHECK sy-subrc EQ 0 .
* <sheets>-chartsheet = abap_on .
ENDIF .

*======================================================================
*======================================================================
* read /xl/worksheets/sheet.xml
*======================================================================
*======================================================================
CONCATENATE '/xl/' ls_workbookrels-target INTO lv_path_sheet .
<sheets>-ixml_doc = xml_load( iv_path = lv_path_sheet ) .

* read relations with Sheet [ xl/worksheets/_rels/sheet.xml.rels ]


<sheets>-sheetdata_template-t_sheetrels = xml_relstab_get( lv_path_sheet ) .

* read 'summarybelow' and 'summaryRight' properties


DO 1 TIMES .
<sheets>-summarybelow = abap_on . " -->> preset values
<sheets>-summaryright = abap_on .

lr_element-outlinepr =
<sheets>-ixml_doc->find_from_name( name = c_tag-outlinepr depth = 2 ) .
CHECK lr_element-outlinepr IS BOUND .

CLEAR lv_string_tmp .
lv_string_tmp = lr_element-outlinepr->get_attribute( name = c_tag-
summarybelow ) .
IF lv_string_tmp EQ '0' .
CLEAR <sheets>-summarybelow .
ENDIF .
CLEAR lv_string_tmp .
lv_string_tmp = lr_element-outlinepr->get_attribute( name = c_tag-
summaryright ) .
IF lv_string_tmp EQ '0' .
CLEAR <sheets>-summaryright .
ENDIF .
ENDDO .

* read 'tabSelected' propertiy


DO 1 TIMES .
lr_element-sheetview =
<sheets>-ixml_doc->find_from_name( name = c_tag-sheetview depth = 3 ) .
CHECK lr_element-sheetview IS BOUND .

CLEAR lv_string_tmp .
lv_string_tmp = lr_element-sheetview->get_attribute( name = c_tag-
tabselected ) .
IF lv_string_tmp EQ '1' .
<sheets>-active = abap_on .
ENDIF .
ENDDO .

*======================================================================
*======================================================================
* DRAWING
*======================================================================
*======================================================================
DO 1 TIMES .
* in the sheet we lookup an ID, that refer the document with Drawing
lr_element-drawing =
<sheets>-ixml_doc->find_from_name(
name = c_tag-drawing
depth = 1 ) .
CHECK lr_element-drawing IS BOUND .

lv_id_drawings = lr_element-drawing->get_attribute(
name = c_tag-id
namespace = c_tag-r ) .
CHECK lv_id_drawings IS NOT INITIAL . " -->> id was found

*======================================================================
* xl/worksheets/sheet1.xml
* --> xl/worksheets/_rels/sheet.xml.rels
* --> xl/drawings/drawing.xml
* --> xl/drawings/_rels/drawing.xml.rels
*======================================================================
READ TABLE <sheets>-sheetdata_template-t_sheetrels INTO ls_sheetrels
WITH KEY type = c_contenttype-wb_drawing
id = lv_id_drawings .
CHECK sy-subrc EQ 0.

* read Drawings [ xl/drawings/drawing.xml ]


SHIFT ls_sheetrels-target LEFT DELETING LEADING '.' .
CONCATENATE '/xl' ls_sheetrels-target INTO lv_path .
lr_drawing_doc = xml_load( iv_path = lv_path ) .

* read relations of Drawings [ xl/drawing/_rels/drawing.xml.rels ]


lt_drawingrels = xml_relstab_get( lv_path ) .

*======================================================================
* analyze xl/drawings/drawing.xml :
* and fill general buffer of drawings
*======================================================================
lr_twocellanchor_ncol =
lr_drawing_doc->get_elements_by_tag_name(
name = c_tag-twocellanchor
namespace = c_tag-xdr
depth = 2 ) .
CHECK lr_twocellanchor_ncol IS BOUND .
DO .
lv_index = sy-index - 1 .
lr_twocellanchor_node = lr_twocellanchor_ncol->get_item( index = lv_index
) .
IF lr_twocellanchor_node IS INITIAL. EXIT. ENDIF .

lr_element-twocellanchor ?= lr_twocellanchor_node-
>query_interface( ixml_iid_element ) .

FREE lr_element-cnvpr . CLEAR lr_element-cnvpr .


lr_element-cnvpr =
lr_element-twocellanchor->find_from_name( name = c_tag-cnvpr namespace =
c_tag-xdr depth = 3 ) .
CHECK lr_element-cnvpr IS BOUND .

CLEAR ls_drawings .
ls_drawings-name = lr_element-cnvpr->get_attribute( name = c_tag-name ) .
ls_drawings-twocellanchor_node = lr_twocellanchor_node->clone( ) .

DO 1 TIMES .
CHECK ls_drawings-drawing_type IS INITIAL .

FREE lr_element-pic . CLEAR lr_element-pic .


lr_element-pic = lr_element-twocellanchor->find_from_name( name =
c_tag-pic namespace = c_tag-xdr depth = 3 ) .
CHECK lr_element-pic IS BOUND . " -->> bitmap
lr_element-blip = lr_element-pic->find_from_name( name = c_tag-blip
namespace = c_tag-a ) .
CHECK lr_element-blip IS BOUND .
lv_id = lr_element-blip->get_attribute( name = c_tag-embed namespace =
c_tag-r ) .
READ TABLE lt_drawingrels INTO ls_drawingrels WITH KEY id = lv_id .
CHECK sy-subrc EQ 0 .
CHECK ls_drawingrels-type EQ c_contenttype-wb_image .

SHIFT ls_drawingrels-target LEFT DELETING LEADING '.' .


CONCATENATE 'xl' ls_drawingrels-target INTO lv_path .

r_zipfolder->get( EXPORTING name = lv_path


IMPORTING content = ls_drawings-media_rawdata
EXCEPTIONS OTHERS = 1 ) .
CHECK sy-subrc EQ 0 .
ls_drawings-drawing_type = c_drawing_type-bitmap . " -->> raster image
ENDDO .

DO 1 TIMES .
CHECK ls_drawings-drawing_type IS INITIAL .

FREE lr_element-graphicframe . CLEAR lr_element-graphicframe .


lr_element-graphicframe = lr_element-twocellanchor-
>find_from_name( name = c_tag-graphicframe namespace = c_tag-xdr depth = 3 ) .
CHECK lr_element-graphicframe IS BOUND .
FREE lr_element-chart . CLEAR lr_element-chart .
lr_element-chart = lr_element-graphicframe->find_from_name( name =
c_tag-chart namespace = c_tag-c ) .
CHECK lr_element-chart IS BOUND .

lv_id = lr_element-chart->get_attribute( name = c_tag-id namespace =


c_tag-r ) .
READ TABLE lt_drawingrels INTO ls_drawingrels WITH KEY id = lv_id .
CHECK sy-subrc EQ 0 .
CHECK ls_drawingrels-type EQ c_contenttype-wb_chart .

SHIFT ls_drawingrels-target LEFT DELETING LEADING '.' .


CONCATENATE 'xl' ls_drawingrels-target INTO lv_path .

ls_drawings-chart_ixml_doc = xml_load( iv_path = lv_path ) .


CHECK ls_drawings-chart_ixml_doc IS BOUND .
FREE lr_element-chart . CLEAR lr_element-chart .
lr_element-chart = ls_drawings-chart_ixml_doc->find_from_name( name =
c_tag-chart namespace = c_tag-c depth = 2 ) .
CHECK lr_element-chart IS BOUND .
FREE lr_element-plotarea . CLEAR lr_element-plotarea .
lr_element-plotarea = lr_element-chart->find_from_name( name = c_tag-
plotarea namespace = c_tag-c depth = 1 ) .
CHECK lr_element-plotarea IS BOUND .

lr_ser_ncol =
lr_element-plotarea->get_elements_by_tag_name(
name = c_tag-ser
namespace = c_tag-c
depth = 2 ) .
CHECK lr_ser_ncol IS BOUND .
DO .
lv_index = sy-index - 1 .
lr_ser_node = lr_ser_ncol->get_item( index = lv_index ) .
IF lr_ser_node IS INITIAL. EXIT. ENDIF .
lr_element-ser ?= lr_ser_node->query_interface( ixml_iid_element ) .
FREE lr_element-idx . CLEAR lr_element-idx .
lr_element-idx = lr_element-ser->find_from_name( name = c_tag-idx
namespace = c_tag-c depth = 1 ) .
CHECK lr_element-idx IS BOUND .
APPEND INITIAL LINE TO ls_drawings-chart_series ASSIGNING
<chart_series> .
<chart_series>-idx = lr_element-idx->get_attribute( name = c_tag-
val ) .
FREE lr_element-tx . CLEAR lr_element-tx .
lr_element-tx = lr_element-ser->find_from_name( name = c_tag-tx
namespace = c_tag-c depth = 1 ) .
CHECK lr_element-tx IS BOUND .

FREE lr_element-v . CLEAR lr_element-v .


lr_element-v = lr_element-tx->find_from_name( name = c_tag-v
namespace = c_tag-c depth = 1 ) .
IF lr_element-v IS BOUND .
<chart_series>-caption = lr_element-v->get_value( ) .
ENDIF .
CHECK <chart_series>-caption IS INITIAL .
FREE lr_element-strcache . CLEAR lr_element-strcache .
lr_element-strcache = lr_element-tx->find_from_name( name = c_tag-
strcache namespace = c_tag-c depth = 2 ) .
CHECK lr_element-strcache IS BOUND .
FREE lr_element-pt . CLEAR lr_element-pt .
lr_element-pt = lr_element-strcache->find_from_name( name = c_tag-pt
namespace = c_tag-c depth = 1 ) .
CHECK lr_element-pt IS BOUND .
FREE lr_element-v . CLEAR lr_element-v .
lr_element-v = lr_element-pt->find_from_name( name = c_tag-v
namespace = c_tag-c depth = 1 ) .
CHECK lr_element-v IS BOUND .
<chart_series>-caption = lr_element-v->get_value( ) .
ENDDO .

* read relations of Charts [ xl/charts/_rels/chartXXX.xml.rels ]


CLEAR lt_chartrels .
lt_chartrels = xml_relstab_get( lv_path ) .

LOOP AT lt_chartrels INTO ls_chartrels .


CONCATENATE c_path-chartsfolder '/' ls_chartrels-target INTO
lv_path .
CASE ls_chartrels-type .
WHEN c_contenttype-wb_chartstyle . ls_drawings-chartstyle_ixml_doc
= xml_load( iv_path = lv_path ) .
WHEN c_contenttype-wb_chartcolors . ls_drawings-
chartcolors_ixml_doc = xml_load( iv_path = lv_path ) .
ENDCASE .
ENDLOOP .
* CHECK ls_drawings-chartstyle_ixml_doc IS BOUND .
* CHECK ls_drawings-chartcolors_ixml_doc IS BOUND .

ls_drawings-drawing_type = c_drawing_type-chart . " -->> chart


ENDDO .

DO 1 TIMES .
CHECK ls_drawings-drawing_type IS INITIAL .

ls_drawings-drawing_type = c_drawing_type-vector . " -->> vector


graphics
ENDDO .

CHECK ls_drawings-drawing_type IS NOT INITIAL .


INSERT ls_drawings INTO TABLE <sheets>-sheetdata_template-t_drawings .
ENDDO .
ENDDO .

*======================================================================
*======================================================================
* LEGACY DRAWING (whole copy with all related objects)
*======================================================================
*======================================================================
DO 1 TIMES .
* in the sheet we lookup an ID, that refer the document with Legacy Drawing
lr_element-legacydrawing =
<sheets>-ixml_doc->find_from_name(
name = c_tag-legacydrawing
depth = 1 ) .
CHECK lr_element-legacydrawing IS BOUND .
<sheets>-sheetdata_template-vmldrawings-id = lr_element-legacydrawing-
>get_attribute(
name = c_tag-id
namespace = c_tag-r ) .
CHECK <sheets>-sheetdata_template-vmldrawings-id IS NOT INITIAL . " -->> id
was found

*======================================================================
* xl/worksheets/sheet1.xml
* --> xl/worksheets/_rels/sheet.xml.rels
* --> xl/drawings/vmlDrawing.xml
* --> xl/drawings/_rels/vmlDrawing.vml.rels
*======================================================================
READ TABLE <sheets>-sheetdata_template-t_sheetrels INTO ls_sheetrels
WITH KEY type = c_contenttype-wb_vmldrawing
id = <sheets>-sheetdata_template-vmldrawings-id .
CHECK sy-subrc EQ 0.

* read Drawings [ xl/drawings/vmlDrawing.vml ]


SHIFT ls_sheetrels-target LEFT DELETING LEADING '.' .
CONCATENATE '/xl' ls_sheetrels-target INTO <sheets>-sheetdata_template-
vmldrawings-path .
<sheets>-sheetdata_template-vmldrawings-ixml_doc = xml_load( iv_path =
<sheets>-sheetdata_template-vmldrawings-path ) .

* read relations of vmlDrawing [ xl/drawings/_rels/vmlDrawing.vml.rels ]


lt_vmldrawingrels = xml_relstab_get( <sheets>-sheetdata_template-
vmldrawings-path ) .

LOOP AT lt_vmldrawingrels INTO ls_vmldrawingrels


WHERE type EQ c_contenttype-wb_image .

* get ...xl\media\imageXXX.emf
CLEAR ls_vmldrawing_rels .
MOVE-CORRESPONDING ls_vmldrawingrels TO ls_vmldrawing_rels .

SHIFT ls_vmldrawingrels-target LEFT DELETING LEADING '.' .


CONCATENATE 'xl' ls_vmldrawingrels-target INTO ls_vmldrawing_rels-
media_path .

r_zipfolder->get( EXPORTING name = ls_vmldrawing_rels-media_path


IMPORTING content = ls_vmldrawing_rels-media_rawdata
EXCEPTIONS OTHERS = 1 ) .
APPEND ls_vmldrawing_rels TO <sheets>-sheetdata_template-vmldrawings-
t_rels .
ENDLOOP .
ENDDO .

ENDLOOP . " t_sheets

ENDMETHOD . " bufferization_baseinfo


METHOD rawdata_set .
free( ).

CREATE OBJECT r_zipfolder .


r_zipfolder->load( iv_rawdata ) .
bufferization_baseinfo( ) .
ENDMETHOD . "rawdata_set
METHOD rawdata_set_as_table .
DATA lv_rawdata TYPE ty_rawdata .
CHECK iv_document_size GT 0 .

CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'


EXPORTING
input_length = iv_document_size
IMPORTING
buffer = lv_rawdata
TABLES
binary_tab = it_document_table.

rawdata_set( lv_rawdata ) .
ENDMETHOD . "rawdata_set_as_table
METHOD rawdata_get .
rv_rawdata = r_zipfolder->save( ) .
IF rv_rawdata EQ '504B0506000000000000000000000000000000000000' .
CLEAR rv_rawdata .
FREE rv_rawdata .
ENDIF .
ENDMETHOD . "rawdata_get
METHOD rawdata_get_as_table .
DATA lv_rawdata TYPE ty_rawdata .
lv_rawdata = rawdata_get( ) .

CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'


EXPORTING
buffer = lv_rawdata
IMPORTING
output_length = ev_document_size
TABLES
binary_tab = et_document_table.
ENDMETHOD . "rawdata_get_as_table
METHOD template_getfrom_hardcode .
DATA:
lv_doctab TYPE thespacex ,
lt_doctab TYPE STANDARD TABLE OF thespacex ,
lv_docsize TYPE i VALUE 7821 .
DEFINE mk_append .
lv_doctab = &1 .
append lv_doctab to lt_doctab .
END-OF-DEFINITION .

mk_append:

'504B030414000600080000002100CC7EE6A14E010000080400001300DF015B436F6E74656E745F5479
7065735D2E786D6C20A2DB0128A00002000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,
'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'00000000000000000000000000000000000000000000000000000000AC93CB4EC3301045F748FC83E5
2D8ADDB2400835ED82C712BA281F60EC4963D52F79DCD2FE3D938422814A455536B1226BEE9D39733D9
96DBD631BC86863A8F9588C3883A0A3B161' ,

'59F3D7C55375CB1916158C723140CD77807C36BDBC982C7609905175C09AB7A5A43B2951B7E0158A98
20D04D13B357857EF35226A5576A09F27A34BA913A8602A154A5D3E0D3C90B3590AD013657B93C2B4F3
E72EB64213518BE63417A9CDD0F859D77CD' ,

'554ACE6A55A873B909E6876B159BC66A3051AF3D79895EECAA5391BF1A62D939C0B3AD306550065B80
E29D1844F7CE0FD0A8B52BEC714B0406E8191C9E36DA274C4195FDF8D8DA84471C8EB33BCEE43DE6D55
B8CABFFA6D2D1115ED9B0EFFB5008687BF3' ,

'1C134ADAF5D90D4087DC80A91249422E16BE981DF2A60076B3F76B44D91FE7A7F07B34BEF4FFC440C7
0CA743D867A5AB3E30B9ECDFF1F4030000FFFF0300504B030414000600080000002100B5553023F5000
0004C0200000B00CE015F72656C732F2E72' ,

'656C7320A2CA0128A00002000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000008C92CF4EC3300CC6EF48BC43E4FBEA6E480
8A1A5BB4C48BB21541EC024EE1FB58DA324' ,

'40F7F68403824A63DBD1F6E7CF3F5BDEEEE669541F1C622F4EC3BA2841B133627BD76A78AD9F560FA0
6222676914C71A8E1C6157DDDE6C5F78A4949B62D7FBA8B28B8B1ABA94FC2362341D4F140BF1EC72A59
13051CA6168D19319A865DC94E53D86BF1E' ,

'502D3CD5C16A08077B07AA3EFA3CF9B2B7344D6F782FE67D62974E8C409E133BCB76E543660BA9CFDB
A89A42CB498315F39CD311C9FB2263039E26DA5C4FF4FFB63871224B89D048E0F33CDF8A7340EBEB812
E9F68A9F8BDCE3CE2A784E14D64F861C1C5' ,

'0F545F000000FFFF0300504B0304140006000800000021008D87DA70E00000002D0200001A00080178
6C2F5F72656C732F776F726B626F6F6B2E786D6C2E72656C7320A2040128A0000100000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,
'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'000000000000000000000000000000000000000000000000000000000000AC91CB6AC3301045F785FE
83987D3D760AA594C8D99442B6C5FD00218F1FC496846692D67F5FE182DD404836D908AE06DD73246D7
73FE3A04E14B9F74E4391E5A0C8595FF7AE' ,

'D5F0557D3CBD826231AE368377A46122865DF9F8B0FDA4C1483AC45D1F58A516C71A3A91F086C8B6A3
D170E603B934697C1C8DA4185B0CC61E4C4BB8C9F3178CFF3BA03CEB54FB5A43DCD7CFA0AA2924F2ED6
EDF34BDA5776F8F2339B980409669481750' ,

'95892D8986BF9C2547C0CBF8CD3DF1929E8556FA1C715E8B6B0EC53D1DBE7D3C704724ABC7B2C5384F
16193CFBE4F2170000FFFF0300504B0304140000000800C8665944FA26B7975C0100005B0200000F000
000786C2F776F726B626F6F6B2E786D6C8D' ,

'914D6E83301085F7957A07CBFB0670429A469048512B359BAA52A364EDE221583136B24D49CED6458F
D42B7400919F5D579E37E06FDE1BFF7EFF24CB63A9C81758278D4E69340A29019D1921F53EA5B5CF1F6
69438CFB5E0CA6848E9091C5D2EEEEF92C6' ,

'D8C3A731078200ED525A785FCD83C0650594DC8D4C051ABFE4C696DCA3B4FBC05516B87005802F55C0
C2701A945C6ADA13E6F63F0C93E732836793D52568DF432C28EED1BE2B64E5287A2324C9A5826D9F8AF
0AA7AE3257A3F2A4A1477FE45480F22A513' ,

'94A6819B86ADAB552D552BE230A624E87943DA774B7039D0F33685742B6C522220E7B5F21BF43D8CC5
65B20963D333A2BDBE95D0B84E5E31DB2639EEA416A649E9231BE31B9C06396368A2E9C44E0A5F20761
C5D7AAF20F7854F298B2F5E83DB4949B7F1' ,

'F3D44E11DD05F868EB081FB83DD798196B3B9758D8B5882EC02B42927195B55BC0A3BBC12671F4D4FF
9A0443A4C51F504B0304140006000800000021001D21165BC5010000800300000D000000786C2F73747
96C65732E786D6CA4934D8ADC301085F781' ,

'B983D07E466E930C49B03D8B4043600602D3816C654BB605FA3152B969E70259CC1D72872CB3C81DBA
6F9492EC7177AFB2C8C62E3D557D7AAE928B8783D1642F7D50CE9674739751226DE384B25D49BFEEB6B
7EF2909C0ADE0DA5959D24906FA50DDBC29' ,

'024C5A3EF7520241840D25ED01868F8C85A69786873B37488B3BADF386032E7DC7C2E02517211619CD
F22CBB67862B4BABA275160269DC68015D2C425584EF64CF352A1BCAAAA271DA790288472349B1DCC83
9E313D7AAF62AA6B5DC283DCD729EEA7AEE' ,

'03FA4CA83C7B1BB5E472A935CA3A1F45166D2CAF8020A5F56A2A8FA650A88A8103486FB7B8204BBC9B
06B464B1433326E5FD23BBF37CDAE4EF2E0A583AB02A6AE7054EE4B21DB354155AB68046BDEAFAF8063
7E0B37600CE602014EF9CE51A43F65AB104' ,

'F8398DD4FA394EED5B7BC53EB4C48E666BE0B32829CE3F36E135C40F59C299372F22FF9236B3FF1B4B
0EED351F8917B6AF4CAFC79378074A7AFC79FC757A39FD38FE39BD1C7FD31545EA516950F61A9CDA806
C7138B7228B93005EE3AD8E4D5A4FC38E08' ,

'D9F251C36EDD2CE9397E92428DE6C39AF545ED1D244449CFF1639CD8E63E4D3BACBF4EF5170000FFFF
0300504B030414000600080000002100DAEB1BFFA0060000861B000013000000786C2F7468656D652F7
468656D65312E786D6CEC59CF6E1B4518BF' ,

'23F10EA3BDB7B6133B8DA33A55ECD804DAB451EC16F5385E8F77A799DD59CD8C93FA56A5472410A220
2E48C085030222B5884BFA0EEE33048AA0487D05BE99D9B577E20D49DA08043487D83BFBFBFEFF996FC
657AFDD8F18DA2542521E37BCCAE5B28748' ,

'ECF3018D838677BBD7B9B4EC21A9703CC08CC7A4E18D89F4AEADBEFDD655BCA242121104F4B15CC10D
2F542A592995A40FCB585EE60989E1DD908B082B7814416920F01EF08D5869A15C5E2A4598C61E8A710
46C275F4F7E9C1C4E0ED0ADE190FAC45BCD' ,

'F8B719088995D40B3E135DCD9D64445F3DDB9F1C4C9E4E9E4C0E9E3D80EF4FE1F323433BD8A9680A39
962D26D02E660D0F440FF85E8FDC571E62582A78D1F0CAE6CF2BAD5E2DE1959488A9136873741DF397D
2A504839D05235304FDA9D04AA75ABFB23E' ,

'E56F004CCDE3DAED76AB5D99F23300ECFB60B9D525CFB3DA59AE34339E3990FD3ACFBB55AE95AB2E3E
C77F714EE77AB3D9ACD5535D2C5303B25FAB73F8E5F252756DC1C11B90C5D7E6F0D5E65AABB5E4E00DC
8E297E6F09D2BF5A5AA8B37A090D178670E' ,

'AD03DAE9A4DCA79021671B85F065802F9753F80C05D930CD362D62C86375D6DC8BF03D2E3A40A00919
5634466A9C9021F621D15B38EA0B8AB540BC4270EE8D5DF2E5DC92968DA42F68A21ADE7B0986A299F17
B79F8DDCBC3C7E8E5E1C1D1FE93A3FD9F8E' ,

'1E3E3CDAFFC1F2720837701CE4095F7CF3F11F5F3C40BF3FFEF2C5A34F8BF1328FFFE5FB0F7E7EFA49
31102A6AA6D1F3CF0E7E7D72F0FCF30F7FFBF651017C4DE07E1EDEA31191E826D943DB3C02DB8C635CC
D495F9C8FA21762EA50E0107817B06EABD0' ,

'01DE1C6356846B12D7797704349322E03BA37B8EAEDD508C142D907C3D8C1CE026E7ACC945A103AE6B
59390FF74671502C5C8CF2B86D8C778B64B770EC84B63D4AA0AB6649E9F8BE151247CD2D86638503121
385F43BBE43488175772975FCBA497DC125' ,

'1F2A7497A226A6852EE9D1BE934833A20D1A415CC6453643A81DDF6CDE414DCE8AAC5E27BB2E120A02
B302E57B84396E7C078F148E8A58F670C4F20EBF815558A464772CFC3CAE2D15443A208CA3F68048594
4734B80BDB9A05FC7D0BF0AC3BEC9C6918B' ,

'148AEE14F1BC8139CF23D7F94E2BC4515284EDD238CC63DF953B90A2186D715504DFE46E85E8678803
8E4F0CF71D4A9C709FDE086ED3C051699620FACD48E85842E376FA6F44E3BF6AC68C4237B639F0A6193
7BC35D89A8A4A62E3580B3E09F72F6CBCEB' ,

'78146F11C8F5F98DE74DDF7DD377BDFF7CDF3DA996CFDA6D670D167AAF1E1EEC9C6CA6E6E8CC43F390
32D65563466E4833374BD83C061D58D47CCC99924C0F5549085FD366EFE002810D0D125CBD4F55D80D7
1023377C5D34C0299B20E244AB884B39F59' ,

'2EE4ADF130B72B7B72ACE93385ED0F12AB4D3EB0CB8B7A393B3A4CD9982D2830E7D54CD0A266705661
8B5752A660F6AB08AB68A5CE2CAD625433ADCF91363519623A6F1A2C4EBD095309825906BCBC04A77A2
D1ACE2A989181F6BBDD90B3B098285C6488' ,

'648807248D91B67B3E461513A42C57CCE501E44E418CF439F014AFE5A4D535DBD790769620E5C5554F
109745EF75A29465F02C4ABA8E8F95238BF3C5C962B4D7F0EAB5859A877C9C34BC211C73E16B9440D4A
51E04310BE03AC957C2A6FDA9C56CAA7C16' ,

'CD7A66985B0415B8C9B07E9F33D8E90389906A1DCBD0A6867995A6008BB524ABFF420DDC7A5106D84C
7F052D16972119FE312DC08F6E68C970487C950F766E45FBCE3EA6AD948F1411DD70B087FA6C24B6318
45FA72AD833A0126E2B4C47D00F70D5A6BD' ,

'6D5EB9CD392DBAFC0597C1D975CC9210A7ED56976856C9166EEA78AA8379CAA907B615EA6E8C3BBF29
A6E42FC8947C1AFFCF4CD1FB095C1F2C0E74047CB8FC1518E97A6D785CA89043174A42EA77040C12A67
740B6C0752DBC86A4822B68F329C8AEFEB4' ,

'35677998B28653A0DAA6011214F623150A42B6A02D99EC3B855925DDBB2C4B963232199553572656ED
3ED925ACA77BE092DEDB3D1442AA9B6E92B601833B9E7FEE735A41FD400F39F97A737AC874EFB535F07
74F3EB698C128B70F9B8126F3FF54C5825D' ,

'D5D21BF26CEFCD1BA25FCCC6AC6A5615202CB715D4D3B27F4515CEB9D5DA8E3567F1422D530EA2386F
312C4E07A2042E8190FE07FB1F153EB33F66E80DB5C7B7A1B722F82D423383B481ACBE64070FA41BA45
DECC3E064176D326956D6B5E9E8A4BD966D' ,

'D6173CE94EE51E73B6D6EC2CF13EA7B3A7C3992BCEA9C58B7476EA61C7D776ED445743648F97282C0D
B3838D098CF9212CFF4315EFDF8340AFC395FF88296992097E76121846CFAEA903287E2BD190AEFE090
000FFFF0300504B03041400000008003681' ,

'4148C357C7AD510100005102000018000000786C2F776F726B7368656574732F7368656574312E786D
6C8D52CB4EC33010BC23F10F96EFD40D8887AAA415A8427000A156E2EE26EBC4AAED8DEC0DA1DFC6814
FE217B093B60871E1E6995DCFCE8EFDF5F1' ,

'992FDEAD616FE0834657F06C32E50C5C89957675C13B5267379C0592AE92061D147C07812FE6A72779
8F7E1B1A006251C185823744ED4C885036606598600B2E56147A2B29425F8BD07A90D570C91A713E9D5
E092BB5E3A3C2CCFF470395D2252CB1EC2C' ,

'381A453C1849D17F68741B7834C7583E4C79F12CAE02CFD246E7EBC4646339366047463B882DA1B356
FADD1D18EC0B1E03D8132B5D37341062D4147BD111553A3A48B1310FAAE0B7D9B16F687BD5D087C3B02
3C3486ED660A024A862DC9CA5183788DB54' ,

'7CACFE4EFB911945EE872CA2EB0A94EC0CADB07F80D16876F9DBC152923C10ADACE149FA5ABBC00CA8
B4D6E49A33BF5F319D09DBE11455364884F6809AF868E013BAE04C21D21124F15C1C7FC2FC1B504B030
41400000008002D6659445FA65CD1440100' ,

'007C02000011000000646F6350726F70732F636F72652E786D6C8D92DF4AC3301487EF05DFA1E4BE4D
D3E970A1ED608A2038101414EF4272D6159B3F2499DD9ECD0B1FC95730EDB6BAB15D08B9497E5FBE9C7
3C8CFD7773E5DCB26FA04EB6AAD0A449214' ,

'45A0B816B5AA0AB4F28BF80645CE332558A3151468030E4DCBCB8B9C1BCAB58527AB0D585F838B8249
39CA4D8196DE1B8AB1E34B90CC258150215C682B990F5B5B61C3F807AB0067693AC6123C13CC33DC096
33318D14E29F8A0342BDBF402C131342041' ,

'79874942F01FEBC14A77F6429F1C90B2F61B0367D17D38D06B570F60DBB6493BEAD1503FC16FF3C7E7
BED5B856DDAC38A030A128CA05A7DC02F3DA960F95B6336DBBC1E6F8E0BCE7C22C1BE6FC3CA48B1AC46
C738C9FC63B7BDFD05605220A25D26D43FB' ,

'E475747BF7728FCA2C25A398A461BD90945E8DE9F5E4BDABE2E8FEB154EE1EFBA795D06C42497660DD
0BBABF824F3E4BF90B504B030414000000080019665944DE01D331A80100009A03000010000000646F6
350726F70732F6170702E786D6C9D53C18E' ,

'D33010BD23F10F96EF5B271542A872BC5A75913880A8D4B277E34C1A0BC7B6EC69D472832B9FC08F20
71E017B65FB2BF809B6CB25D85E5B03ED96F669EDFF378EE7EFFE197FBC6901642D4CE16349F6594805
5AED4765BD01D56176F2889286D298DB350' ,

'D003447A295EBEE0ABE03C04D41049A2B0B1A035A25F3016550D8D8CB314B62952B9D0484CC7B065AE
AAB4826BA7760D5864F32C7BCD608F604B282FFC48487BC6458BCF252D9D3AE98B379B834F7C492F21F
CCA7BA395C4E4547CD02AB8E82A246FF70A' ,

'0C67E7C12E3B11AE41ED82C683C8383B3F76F1B5920696E91251491381B307A08BBF03797AC495D421
7648C25A5CB4A0D00512F5D7F498734A3ECB082791056D65D0D222BD4FBE4FEFC111EB51E3230671FBF
3F6D7F1DBF1FBF10767233816B37F543FCD' ,

'A85F89BC2B499BFF50F45067A177C92636F946A381F8B15AC9804F3ACFCF9D77CA1FFBEECDAC6B00CC
27EEA62AA677F2A56BBCB407C1D9B0EBE0F7DA7E899FFCC65D4B84A1758FC1BEBDB50C50A6AE8FED1D8
1BEBD497930A7BA652DED16CA216F1A183E' ,

'DF4D3F65229FCFB2B4BA3F376069A0D8C34489BF504B0102130014000600080000002100CC7EE6A14E
010000080400001300DF0100000000000000000000000000005B436F6E74656E745F54797065735D2E7
86D6C20A2DB0128A0000200000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,
'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000504B0102130014000600080000002100B5553
023F50000004C0200000B00CE0100000000' ,

'0000000000005E0300005F72656C732F2E72656C7320A2CA0128A00002000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
0504B01021300140006000800000021008D' ,

'87DA70E00000002D0200001A000801000000000000000000004A060000786C2F5F72656C732F776F72
6B626F6F6B2E786D6C2E72656C7320A2040128A00001000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'0000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' ,

'00000000000000000000000000000000000000504B01021400140000000800C8665944FA26B7975C01
00005B0200000F000000000000000100200000006A080000786C2F776F726B626F6F6B2E786D6C504B0
1021300140006000800000021001D21165B' ,

'C5010000800300000D00000000000000000000000000F3090000786C2F7374796C65732E786D6C504B
0102130014000600080000002100DAEB1BFFA0060000861B00001300000000000000000000000000E30
B0000786C2F7468656D652F7468656D6531' ,

'2E786D6C504B0102140014000000080036814148C357C7AD5101000051020000180000000000000001
0020000000B4120000786C2F776F726B7368656574732F7368656574312E786D6C504B0102140014000
00008002D6659445FA65CD1440100007C02' ,
'000011000000000000000100200000003B140000646F6350726F70732F636F72652E786D6C504B0102
140014000000080019665944DE01D331A80100009A0300001000000000000000010020000000AE15000
0646F6350726F70732F6170702E786D6C50' ,

'4B05060000000009000900F30600008417000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000' .

CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'


EXPORTING
input_length = lv_docsize
IMPORTING
buffer = rv_rawdata
TABLES
binary_tab = lt_doctab.

ENDMETHOD . "template_getfrom_hardcode
ENDCLASS . "lcl_excel IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_excelruntime DEFINITION
*----------------------------------------------------------------------*
* runtime excel buffer
*----------------------------------------------------------------------*
CLASS lcl_excelruntime DEFINITION INHERITING FROM lcl_excel .

PUBLIC SECTION .
DATA:
v_summarybelow TYPE flag READ-ONLY ,
v_summaryright TYPE flag READ-ONLY .

METHODS:
constructor
EXCEPTIONS error_file_reading ,
free REDEFINITION ,
begin_model
IMPORTING is_model TYPE ty_s_model
iv_extension TYPE ty_char10
ir_zipfolder TYPE REF TO cl_abap_zip
iv_protect TYPE flag
iv_definednames_dont_remove TYPE flag OPTIONAL ,
finalize_model
IMPORTING it_docproperties TYPE ckf_field_value_table
EXCEPTIONS process_terminated ,
begin_sheet
IMPORTING iv_sheetname TYPE any OPTIONAL
iv_hidden TYPE any
iv_active TYPE any
iv_ixml_doc TYPE REF TO if_ixml_document
it_sheetrels TYPE ty_t_relstab
iv_summarybelow TYPE flag
iv_summaryright TYPE flag
is_sheetprotection TYPE ty_s_sheetprotection
is_vmldrawings TYPE ty_s_vmldrawings
RETURNING value(rv_sheet_name) TYPE string ,
finalize_sheet ,
sheet_name_validate
CHANGING cv_sheetname TYPE any ,
begin_folder ,
finalize_folder
IMPORTING iv_left TYPE any
iv_top TYPE any
iv_rows TYPE any
iv_columns TYPE any
iv_rowgroup_level TYPE any
iv_colgroup_level TYPE any
iv_rowgroup_clp TYPE any
iv_colgroup_clp TYPE any
iv_nopgbrk_top TYPE any OPTIONAL
iv_nopgbrk_left TYPE any OPTIONAL
iv_nopgbrk_beg_x TYPE any OPTIONAL
iv_nopgbrk_end_x TYPE any OPTIONAL
iv_nopgbrk_beg_y TYPE any OPTIONAL
iv_nopgbrk_end_y TYPE any OPTIONAL
iv_pgbrk_top TYPE any OPTIONAL
iv_pgbrk_left TYPE any OPTIONAL
iv_cellrng_name TYPE any OPTIONAL ,
begin_field
IMPORTING iv_value TYPE any
iv_top TYPE any
iv_left TYPE any
iv_formula TYPE flag OPTIONAL
iv_rt_path_1 TYPE any OPTIONAL " -->> runtime path (for
dataset subordination)
it_valvld_attr_table TYPE ANY TABLE OPTIONAL
iv_valvld_for1_dataset_id TYPE any OPTIONAL
iv_valvld_for1_dataset_fld TYPE any OPTIONAL
iv_valvld_for1_value TYPE any OPTIONAL
iv_valvld_for1_value_x TYPE flag OPTIONAL
iv_valvld_for2_value TYPE any OPTIONAL
iv_valvld_for2_value_x TYPE flag OPTIONAL ,
begin_field_textmark
IMPORTING iv_value TYPE any
iv_textmark TYPE any
iv_formula TYPE flag OPTIONAL
iv_rt_path_1 TYPE any OPTIONAL " -->> runtime path (for
dataset subordination)
it_valvld_attr_table TYPE ANY TABLE OPTIONAL
iv_valvld_for1_dataset_id TYPE any OPTIONAL
iv_valvld_for1_dataset_fld TYPE any OPTIONAL
iv_valvld_for1_value TYPE any OPTIONAL
iv_valvld_for1_value_x TYPE flag OPTIONAL
iv_valvld_for2_value TYPE any OPTIONAL
iv_valvld_for2_value_x TYPE flag OPTIONAL ,
begin_drawing
IMPORTING is_drawings_tmp TYPE ty_s_drawings_tmp ,
begin_chart
IMPORTING is_drawings_tmp TYPE ty_s_drawings_tmp ,
begin_pattern
IMPORTING is_patterns TYPE ty_s_patterns ,
finalize_pattern
IMPORTING iv_printtitles_r TYPE flag
iv_printtitles_c TYPE flag
iv_autofitmerged_r TYPE flag DEFAULT space
iv_autofitmerged_c TYPE flag DEFAULT space
CHANGING cv_top TYPE i
cv_left TYPE i ,
finalize_respattern
IMPORTING iv_rowspan TYPE flag OPTIONAL
iv_colspan TYPE flag OPTIONAL
iv_top TYPE i
iv_left TYPE i
iv_rows TYPE i
iv_columns TYPE i
iv_autofitmerged_r TYPE flag DEFAULT space
iv_autofitmerged_c TYPE flag DEFAULT space
it_autofitmerged_r TYPE ty_t_int_tab OPTIONAL
it_autofitmerged_c TYPE ty_t_int_tab OPTIONAL ,
finalize_grid
IMPORTING iv_form_id TYPE any
it_ref_fields TYPE ty_t_dataset_ref_fields
iv_rt_path_1 TYPE any , " -->> runtime path (for dataset
subordination)
value_describe
IMPORTING iv_value TYPE any
iv_cell_dateformat_style TYPE flag
EXPORTING ev_number_flag TYPE flag
ev_date_flag TYPE flag
ev_date_excel TYPE ty_char100 ,
is_number
IMPORTING value(iv_value) TYPE any
RETURNING value(rv_number) TYPE flag ,
postprocessing
IMPORTING iv_startup_macro TYPE any
CHANGING cv_vbs_code TYPE any
ct_vbs_tables_tab TYPE ty_t_vbs_tables_tab ,
postpr_ole_nopgbrk ,
postpr_ole_autofit ,
postpr_vbs_autofit ,
postpr_vbs_autofit_macros_add ,
postpr_vbs_nopgbrk ,
postpr_vbs_nopgbrk_macros_add ,
postpr_vbs_final
CHANGING cv_vbs_code TYPE any
ct_vbs_tables_tab TYPE ty_t_vbs_tables_tab .

PRIVATE SECTION .
TYPES:
BEGIN OF ty_s_sheetnamesuffix ,
sheetname TYPE ty_char31 ,
suffix_index TYPE sy-index ,
END OF ty_s_sheetnamesuffix ,
ty_t_sheetnamesuffix TYPE HASHED TABLE OF ty_s_sheetnamesuffix
WITH UNIQUE KEY sheetname .

DATA:
v_postprocessing_autofit TYPE flag ,
v_postprocessing_nopgbrk TYPE flag ,
v_protect TYPE flag ,
s_sheets TYPE ty_s_sheets ,
s_patterns TYPE ty_s_patterns ,
t_drawings_tmp TYPE STANDARD TABLE OF ty_s_drawings_tmp ,
t_sheetnamesuffix TYPE ty_t_sheetnamesuffix ,
r_ole TYPE REF TO lcl_ole ,
BEGIN OF s_ole_variables ,
ref TYPE string ,
ref1 TYPE string ,
ref2 TYPE string ,
index TYPE sy-index ,
height TYPE i ,
width TYPE i ,
cur_rows_height TYPE i ,
cur_rows_count TYPE i ,
cur_cols_width TYPE i ,
cur_cols_count TYPE i ,
cur_wraptext TYPE i ,
vbscode TYPE string ,
END OF s_ole_variables .

ENDCLASS . "lcl_excelruntime DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_excelruntime IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_excelruntime IMPLEMENTATION .
METHOD constructor .
super->constructor( EXCEPTIONS error_file_reading = 1 ) .
IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t336 " text: Error while reading
template file
RAISING error_file_reading .
ENDIF .

DATA ls_elemsequence TYPE ty_s_elemsequence .


DEFINE mk_elemsequence_add .
clear ls_elemsequence .
ls_elemsequence-order = lines( &1 ) + 1 .
ls_elemsequence-element = &2 .
append ls_elemsequence to &1 .
END-OF-DEFINITION .

mk_elemsequence_add
t_elemsequence_worksheet :
'sheetPr' ,
'dimension' ,
'sheetViews' ,
'sheetFormatPr' ,
'cols' ,
'sheetData' ,
'sheetCalcPr' ,
'sheetProtection' ,
'protectedRanges' ,
'scenarios' ,
'autoFilter' ,
'sortState' ,
'dataConsolidate' ,
'customSheetViews' ,
'mergeCells' ,
'phoneticPr' ,
'conditionalFormatting' ,
'dataValidations' ,
'hyperlinks' ,
'printOptions' ,
'pageMargins' ,
'pageSetup' ,
'headerFooter' ,
'rowBreaks' ,
'colBreaks' ,
'customProperties' ,
'cellWatches' ,
'ignoredErrors' ,
'smartTags' ,
'drawing' ,
'drawingHF' ,
'picture' ,
'oleObjects' ,
'controls' ,
'webPublishItems' ,
'tableParts' ,
'extLst' .
SORT t_elemsequence_worksheet BY order DESCENDING .

mk_elemsequence_add
t_elemsequence_workbook :
'fileVersion' ,
'fileSharing' ,
'workbookPr' ,
'workbookProtection' ,
'bookViews' ,
'sheets' ,
'functionGroups' ,
'externalReferences' ,
'definedNames' ,
'calcPr' ,
'oleSize' ,
'customWorkbookViews' ,
'pivotCaches' ,
'smartTagPr' ,
'smartTagTypes' ,
'webPublishing' ,
'fileRecoveryPr' ,
'webPublishObjects' ,
'extLst' .
SORT t_elemsequence_workbook BY order DESCENDING .

ENDMETHOD . "constructor
METHOD free .
super->free( ).
ENDMETHOD . " FREE
METHOD begin_model .
s_model-ixml_doc_contenttypes = is_model-ixml_doc_contenttypes .
s_model-ixml_doc_core = is_model-ixml_doc_core .
s_model-ixml_doc_app = is_model-ixml_doc_app .
s_model-ixml_doc_workbook = is_model-ixml_doc_workbook .
s_model-t_contentrels = is_model-t_contentrels .
s_model-t_workbookrels = is_model-t_workbookrels .
s_model-t_sharedstrings = is_model-t_sharedstrings .

v_protect = iv_protect .
v_extension = iv_extension .
r_zipfolder = ir_zipfolder .

DATA:
lr_ncol TYPE REF TO if_ixml_node_collection ,
lr_node TYPE REF TO if_ixml_node ,
lr_elem TYPE REF TO if_ixml_element ,
lv_index TYPE sy-index ,
lv_contenttype TYPE string ,
lv_activetab TYPE string ,
ls_contentrels TYPE ty_s_relstab .

*======================================================================
* Clear [Content_Types].xml
*======================================================================
lr_ncol =
s_model-ixml_doc_contenttypes->get_elements_by_tag_name(
name = c_tag-override ) .
IF lr_ncol IS BOUND .
DO .
lv_index = sy-index - 1 .
lr_node = lr_ncol->get_item( index = lv_index ) .
IF lr_node IS NOT BOUND. EXIT. ENDIF .
CLEAR lv_contenttype .
xml_attrib_get( EXPORTING ir_node = lr_node
iv_attrib_name1 = c_tag-contenttype
IMPORTING ev_attrib_value1 = lv_contenttype ) .
CASE lv_contenttype .
WHEN c_contenttype-sheet
OR c_contenttype-sharedstrings
OR c_contenttype-calcchain
OR c_contenttype-drawing
OR c_contenttype-chart
OR c_contenttype-chartstyle
OR c_contenttype-chartcolors .
lr_node->remove_node( ) .
ENDCASE .
ENDDO .
ENDIF .

lr_ncol =
s_model-ixml_doc_contenttypes->get_elements_by_tag_name(
name = c_tag-default ) .
IF lr_ncol IS BOUND .
DO .
lv_index = sy-index - 1 .
lr_node = lr_ncol->get_item( index = lv_index ) .
IF lr_node IS NOT BOUND. EXIT. ENDIF .
CLEAR lv_contenttype .
xml_attrib_get( EXPORTING ir_node = lr_node
iv_attrib_name1 = c_tag-contenttype
IMPORTING ev_attrib_value1 = lv_contenttype ) .
CHECK lv_contenttype CP 'image/*' .
lr_node->remove_node( ) .
ENDDO .
ENDIF .

*======================================================================
* Clear \docProps\app.xml
*======================================================================
xml_remove_nodes(
iv_ixml_doc = s_model-ixml_doc_app
iv_name = c_tag-vector
iv_namespace = c_tag-vt ) .
*======================================================================
* Clear \xl\_rels\workbook.xml.rels
*======================================================================
DELETE s_model-t_workbookrels
WHERE type EQ c_contenttype-wb_sheet
OR type EQ c_contenttype-wb_sharedstrings
OR type EQ c_contenttype-wb_calcchain
.

*======================================================================
* Clear \xl\workbook.xml
*======================================================================
xml_remove_nodes(
iv_ixml_doc = s_model-ixml_doc_workbook
iv_name = c_tag-sheet ) .

IF iv_definednames_dont_remove IS INITIAL .
xml_remove_nodes(
iv_ixml_doc = s_model-ixml_doc_workbook
iv_name = c_tag-definednames ) .
ENDIF .

* lr_ncol =
* s_model-ixml_doc_workbook->get_elements_by_tag_name(
* name = c_tag-workbookview ) .
* IF lr_ncol IS BOUND .
* DO .
* lv_index = sy-index - 1 .
* lr_node = lr_ncol->get_item( index = lv_index ) .
* IF lr_node IS NOT BOUND. EXIT. ENDIF .
* xml_attrib_get( EXPORTING ir_node = lr_node
* iv_attrib_name1 = c_tag-activetab
* IMPORTING ev_attrib_value1 = lv_activetab ) .
* CHECK lv_activetab IS NOT INITIAL
* AND lv_activetab NE 0 .
*
* lr_elem ?= lr_node->query_interface( ixml_iid_element ) .
* lr_elem->remove_attribute( name = c_tag-activetab ) .
* ENDDO .
* ENDIF .

*======================================================================
* Remove XML-docs from ZIP-folder
*======================================================================
FIELD-SYMBOLS <files> TYPE r_zipfolder->t_file .

DEFINE mk_delete_files .
loop at r_zipfolder->files assigning <files> where name cs &1+1 .

r_zipfolder->delete( exporting name = <files>-name


exceptions others = 0 ) .
endloop .
END-OF-DEFINITION .

mk_delete_files:
c_path-sharedstrings ,
c_path-calcchain ,
c_path-sheetsfolder ,
c_path-mediafolder ,
c_path-drawingsfolder ,
c_path-formparameters ,
c_path-chartsfolder .

*======================================================================
* Clear \.rels
*======================================================================
LOOP AT s_model-t_contentrels INTO ls_contentrels
WHERE type EQ c_contenttype-thumbnail .
mk_delete_files ls_contentrels-target .

DELETE s_model-t_contentrels .
ENDLOOP .

ENDMETHOD . " begin_model


METHOD finalize_model .
DATA:
BEGIN OF lr_element ,
types TYPE REF TO if_ixml_element ,
override TYPE REF TO if_ixml_element ,
default TYPE REF TO if_ixml_element ,
headingpairs TYPE REF TO if_ixml_element ,
properties TYPE REF TO if_ixml_element ,
titlesofparts TYPE REF TO if_ixml_element ,
vector TYPE REF TO if_ixml_element ,
variant TYPE REF TO if_ixml_element ,
lpstr TYPE REF TO if_ixml_element ,
i4 TYPE REF TO if_ixml_element ,
relationships TYPE REF TO if_ixml_element ,
relationship TYPE REF TO if_ixml_element ,
workbook TYPE REF TO if_ixml_element ,
definednames TYPE REF TO if_ixml_element ,
definedname TYPE REF TO if_ixml_element ,
sheets TYPE REF TO if_ixml_element ,
sheet TYPE REF TO if_ixml_element ,
sst TYPE REF TO if_ixml_element ,
calcchain TYPE REF TO if_ixml_element ,
si TYPE REF TO if_ixml_element ,
t TYPE REF TO if_ixml_element ,
p TYPE REF TO if_ixml_element ,
r TYPE REF TO if_ixml_element ,
c TYPE REF TO if_ixml_element ,
company TYPE REF TO if_ixml_element ,
chart TYPE REF TO if_ixml_element ,
title TYPE REF TO if_ixml_element ,
layout TYPE REF TO if_ixml_element ,
plotarea TYPE REF TO if_ixml_element ,
strref TYPE REF TO if_ixml_element ,
ser TYPE REF TO if_ixml_element ,
idx TYPE REF TO if_ixml_element ,
val TYPE REF TO if_ixml_element ,
cat TYPE REF TO if_ixml_element ,
axis TYPE REF TO if_ixml_element ,
tx TYPE REF TO if_ixml_element ,
txpr TYPE REF TO if_ixml_element ,
rich TYPE REF TO if_ixml_element ,
ref TYPE REF TO if_ixml_element ,
sppr TYPE REF TO if_ixml_element ,
any TYPE REF TO if_ixml_element ,
END OF lr_element ,
BEGIN OF lr_node ,
tx TYPE REF TO if_ixml_node ,
layout TYPE REF TO if_ixml_node ,
ser TYPE REF TO if_ixml_node ,
r TYPE REF TO if_ixml_node ,
val TYPE REF TO if_ixml_node ,
cat TYPE REF TO if_ixml_node ,
sppr TYPE REF TO if_ixml_node ,
workbookview TYPE REF TO if_ixml_node ,
txpr TYPE REF TO if_ixml_node ,
rich TYPE REF TO if_ixml_node ,
strref TYPE REF TO if_ixml_node ,
any TYPE REF TO if_ixml_node ,
END OF lr_node ,
BEGIN OF lr_ncol ,
ser TYPE REF TO if_ixml_node_collection ,
r TYPE REF TO if_ixml_node_collection ,
workbookview TYPE REF TO if_ixml_node_collection ,
END OF lr_ncol ,
lv_activetab TYPE i ,
lv_string_tmp TYPE string ,
lv_idx TYPE string ,
lv_index TYPE syindex ,
lv_localsheetid TYPE string ,
lv_definednames_occurs TYPE flag ,
lv_char1 TYPE ty_char1 ,
lv_name TYPE string ,
lv_namespace TYPE string ,
lt_sharedstrings TYPE STANDARD TABLE OF ty_s_sharedstrings ,
ls_docproperties TYPE ckf_field_value ,
lt_chartrels TYPE ty_t_relstab ,
ls_vmldrawingsrels TYPE ty_s_relstab ,
lt_vmldrawingsrels TYPE ty_t_relstab ,
lv_x_char TYPE ty_char15 ,
lv_y_char TYPE ty_char15 ,
lv_axis_title TYPE flag ,
lv_axis_title_tx TYPE string ,
lr_ixml TYPE REF TO if_ixml ,
lr_ixml_doc TYPE REF TO if_ixml_document ,
lr_text TYPE REF TO if_ixml_text ,
lr_streamfactory TYPE REF TO if_ixml_stream_factory ,
lr_ostream TYPE REF TO if_ixml_ostream ,
lr_encoding TYPE REF TO if_ixml_encoding ,
lv_emf TYPE flag .
DATA:
lv_bookmark_string TYPE string ,
lv_bookmark_xstring TYPE xstring ,
lv_bookmark_offset TYPE i ,
lv_xml_xstring TYPE xstring ,
BEGIN OF ls_ostream_xstring ,
beg TYPE xstring ,
mid TYPE xstring ,
end TYPE xstring ,
END OF ls_ostream_xstring .
CONSTANTS:
lc_tag_bookmark TYPE string VALUE 'DummySstr' . " '<DummySstr/>'
FIELD-SYMBOLS:
<sheets> TYPE ty_s_sheets ,
<drawings> TYPE ty_s_drawings ,
<sharedstrings> TYPE ty_s_sharedstrings ,
<calcchain> TYPE ty_s_calcchain ,
<media> TYPE ty_s_media ,
<charts> TYPE ty_s_charts ,
<datasets> TYPE ty_s_datasets ,
<dataset_refs> TYPE ty_s_dataset_refs ,
<cellrng_name> TYPE ty_s_cellrng_name ,
<dataset_ref_fields> TYPE ty_s_dataset_ref_fields ,
<dataset_series_tab> TYPE ty_s_dataset_series_tab ,
<vmldrawings> TYPE ty_s_vmldrawings ,
<vmldrawings_rels> TYPE ty_s_vmldrawings_rels .

*======================================================================
* Fill [Content_Types].xml
*======================================================================
lr_element-types =
s_model-ixml_doc_contenttypes->find_from_name(
name = c_tag-types
depth = 1 ) .
IF lr_element-types IS BOUND .

* sheets
IF s_model-t_sheets[] IS NOT INITIAL .
LOOP AT s_model-t_sheets ASSIGNING <sheets> .

* drawing
IF <sheets>-sheetdata_runtime-t_drawings[] IS NOT INITIAL .
lr_element-override = s_model-ixml_doc_contenttypes-
>create_simple_element(
name = c_tag-override parent =
lr_element-types ) .
lr_element-override->set_attribute( name = c_tag-partname value =
<sheets>-sheetdata_runtime-drawing_path ) .
lr_element-override->set_attribute( name = c_tag-contenttype value =
c_contenttype-drawing ) .

LOOP AT <sheets>-sheetdata_runtime-t_drawings ASSIGNING <drawings>


WHERE drawing_type EQ c_drawing_type-chart .
READ TABLE s_model-t_charts ASSIGNING <charts> WITH TABLE KEY id =
<drawings>-refer_id .
CHECK sy-subrc EQ 0 .
lr_element-override = s_model-ixml_doc_contenttypes-
>create_simple_element(
name = c_tag-override parent =
lr_element-types ) .
lr_element-override->set_attribute( name = c_tag-partname value =
<charts>-chart_path ) .
lr_element-override->set_attribute( name = c_tag-contenttype value =
c_contenttype-chart ) .

lr_element-override = s_model-ixml_doc_contenttypes-
>create_simple_element(
name = c_tag-override parent =
lr_element-types ) .
lr_element-override->set_attribute( name = c_tag-partname value =
<charts>-chartstyle_path ) .
lr_element-override->set_attribute( name = c_tag-contenttype value =
c_contenttype-chartstyle ) .

lr_element-override = s_model-ixml_doc_contenttypes-
>create_simple_element(
name = c_tag-override parent =
lr_element-types ) .
lr_element-override->set_attribute( name = c_tag-partname value =
<charts>-chartcolors_path ) .
lr_element-override->set_attribute( name = c_tag-contenttype value =
c_contenttype-chartcolors ) .
ENDLOOP .
ENDIF .

* sheet
lr_element-override = s_model-ixml_doc_contenttypes-
>create_simple_element(
name = c_tag-override parent =
lr_element-types ) .
CONCATENATE c_path-sheetsfolder '/' <sheets>-name_int '.xml' INTO
lv_string_tmp .
lr_element-override->set_attribute( name = c_tag-partname value =
lv_string_tmp ) .
lr_element-override->set_attribute( name = c_tag-contenttype value =
c_contenttype-sheet ) .
ENDLOOP .
ENDIF .

* shared strings
IF s_model-t_sharedstrings[] IS NOT INITIAL .
lr_element-override = s_model-ixml_doc_contenttypes->create_simple_element(
name = c_tag-override parent =
lr_element-types ) .
lr_element-override->set_attribute( name = c_tag-partname value =
c_path-sharedstrings ) .
lr_element-override->set_attribute( name = c_tag-contenttype value =
c_contenttype-sharedstrings ) .
ENDIF .

* calculation chain
IF s_model-t_calcchain[] IS NOT INITIAL .
lr_element-override = s_model-ixml_doc_contenttypes->create_simple_element(
name = c_tag-override parent =
lr_element-types ) .
lr_element-override->set_attribute( name = c_tag-partname value =
c_path-calcchain ) .
lr_element-override->set_attribute( name = c_tag-contenttype value =
c_contenttype-calcchain ) .
ENDIF .

* bitmaps
IF s_model-t_media[] IS NOT INITIAL .
lr_element-default = s_model-ixml_doc_contenttypes->create_simple_element(
name = c_tag-default parent =
lr_element-types ) .
lr_element-default->set_attribute( name = c_tag-extension value =
c_tag-jpeg ) .
lr_element-default->set_attribute( name = c_tag-contenttype value =
c_tag-imagejpeg ) .
ENDIF .

* vmlDrawings
LOOP AT s_model-t_vmldrawings ASSIGNING <vmldrawings> .
LOOP AT <vmldrawings>-t_rels ASSIGNING <vmldrawings_rels>
WHERE media_path CP '*.emf' .
lv_emf = abap_on .
ENDLOOP .
ENDLOOP .
IF lv_emf IS NOT INITIAL .
lr_element-default = s_model-ixml_doc_contenttypes->create_simple_element(
name = c_tag-default parent =
lr_element-types ) .
lr_element-default->set_attribute( name = c_tag-extension value =
c_tag-emf ) .
lr_element-default->set_attribute( name = c_tag-contenttype value =
c_tag-imageemf ) .
ENDIF .
ENDIF .

xml_save( iv_ixml_doc = s_model-ixml_doc_contenttypes


iv_path = c_path-contenttypes ) .

*======================================================================
* Fill /.rels
*======================================================================
xml_relstab_set( iv_path = c_path-contenttypes
it_relstab = s_model-t_contentrels[] ) .

*======================================================================
* Fill \docProps\core.xml
*======================================================================
DO 1 TIMES .
lr_element-properties =
s_model-ixml_doc_core->find_from_name( name = c_tag-coreproperties
namespace = c_tag-cp ) .
CHECK lr_element-properties IS BOUND .

lr_element-any =
s_model-ixml_doc_core->find_from_name( name = c_tag-lastmodifiedby
namespace = c_tag-cp ) .
IF lr_element-any IS BOUND .
lr_element-any->remove_node( ) .
ENDIF .

LOOP AT it_docproperties INTO ls_docproperties .


SET LOCALE LANGUAGE sy-langu .
TRANSLATE ls_docproperties-fieldname TO LOWER CASE .
CASE ls_docproperties-fieldname .
WHEN 'title' . lv_name = c_tag-title . lv_namespace =
c_tag-dc .
WHEN 'subject' . lv_name = c_tag-subject . lv_namespace =
c_tag-dc .
WHEN 'author' . lv_name = c_tag-creator . lv_namespace =
c_tag-dc .
WHEN 'keywords' . lv_name = c_tag-keywords . lv_namespace =
c_tag-cp .
WHEN 'comments' . lv_name = c_tag-description . lv_namespace =
c_tag-dc .
WHEN 'status' . lv_name = c_tag-contentstatus . lv_namespace =
c_tag-cp .
WHEN 'category' . lv_name = c_tag-category . lv_namespace =
c_tag-cp .
WHEN 'lastmodifiedby' . lv_name = c_tag-lastmodifiedby . lv_namespace =
c_tag-cp .
WHEN OTHERS . CONTINUE .
ENDCASE .

lr_element-any =
s_model-ixml_doc_core->find_from_name( name = lv_name
namespace = lv_namespace ) .
IF lr_element-any IS BOUND .
lr_element-any->remove_node( ) .
ENDIF .

lv_string_tmp = ls_docproperties-value .
s_model-ixml_doc_core->create_simple_element(
name = lv_name
namespace = lv_namespace
value = lv_string_tmp
parent = lr_element-properties ) .
ENDLOOP .
ENDDO .

xml_save( iv_ixml_doc = s_model-ixml_doc_core


iv_path = c_path-core ) .

*======================================================================
* Fill \docProps\app.xml
*======================================================================
DO 1 TIMES .
lr_element-headingpairs =
s_model-ixml_doc_app->find_from_name( name = c_tag-headingpairs ).
CHECK lr_element-headingpairs IS BOUND .

lr_element-vector =
s_model-ixml_doc_app->create_simple_element(
namespace = c_tag-vt name = c_tag-vector
parent = lr_element-headingpairs ).

lr_element-vector->set_attribute( name = c_tag-size value = '2' ) .


lr_element-vector->set_attribute( name = c_tag-basetype value = c_tag-
variant ) .

lr_element-variant =
s_model-ixml_doc_app->create_simple_element(
namespace = c_tag-vt name = c_tag-variant
parent = lr_element-vector ) .
lr_element-lpstr =
s_model-ixml_doc_app->create_simple_element(
namespace = c_tag-vt name = c_tag-lpstr
parent = lr_element-variant ) .

lv_string_tmp = v_text-t007 . " text: Sheets


lr_element-lpstr->set_value( lv_string_tmp ) .

lr_element-variant =
s_model-ixml_doc_app->create_simple_element(
namespace = c_tag-vt name = c_tag-variant
parent = lr_element-vector ) .
lr_element-i4 =
s_model-ixml_doc_app->create_simple_element(
namespace = c_tag-vt name = c_tag-i4
parent = lr_element-variant ) .

lv_string_tmp = LINES( s_model-t_sheets ) . CONDENSE lv_string_tmp NO-GAPS .


lr_element-i4->set_value( lv_string_tmp ) .

ENDDO .

DO 1 TIMES .
lr_element-titlesofparts =
s_model-ixml_doc_app->find_from_name( name = c_tag-titlesofparts ).
CHECK lr_element-titlesofparts IS BOUND .

lr_element-vector =
s_model-ixml_doc_app->create_simple_element(
namespace = c_tag-vt name = c_tag-vector
parent = lr_element-titlesofparts ) .

lv_string_tmp = LINES( s_model-t_sheets ) . CONDENSE lv_string_tmp NO-GAPS .


lr_element-vector->set_attribute( name = c_tag-size value = lv_string_tmp )
.
lr_element-vector->set_attribute( name = c_tag-basetype value = c_tag-
lpstr ) .

LOOP AT s_model-t_sheets ASSIGNING <sheets> .


lr_element-lpstr =
s_model-ixml_doc_app->create_simple_element(
namespace = c_tag-vt name = c_tag-lpstr
parent = lr_element-vector ).

lv_string_tmp = <sheets>-name .
lr_element-lpstr->set_value( lv_string_tmp ) .
ENDLOOP .
ENDDO .

DO 1 TIMES .
lr_element-company =
s_model-ixml_doc_app->find_from_name( name = c_tag-company ) .
CHECK lr_element-company IS BOUND .

CONCATENATE v_title 'for SAP (' v_text-url0 ')'


INTO lv_string_tmp SEPARATED BY space .

lr_element-company->set_value( lv_string_tmp ) .
ENDDO .

DO 1 TIMES .
lr_element-properties =
s_model-ixml_doc_app->find_from_name( name = c_tag-properties ) .
CHECK lr_element-properties IS BOUND .
LOOP AT it_docproperties INTO ls_docproperties .
SET LOCALE LANGUAGE sy-langu .
TRANSLATE ls_docproperties-fieldname TO LOWER CASE .
CASE ls_docproperties-fieldname .
WHEN 'manager' . lv_name = c_tag-manager .
WHEN 'company' . lv_name = c_tag-company .
WHEN 'hyperlinkbase' . lv_name = c_tag-hyperlinkbase .
WHEN OTHERS . CONTINUE .
ENDCASE .

lr_element-any =
s_model-ixml_doc_app->find_from_name( name = lv_name ) .
IF lr_element-any IS BOUND .
lr_element-any->remove_node( ) .
ENDIF .

lv_string_tmp = ls_docproperties-value .
s_model-ixml_doc_app->create_simple_element(
name = lv_name
value = lv_string_tmp
parent = lr_element-properties ) .
ENDLOOP .
ENDDO .

xml_save( iv_ixml_doc = s_model-ixml_doc_app


iv_path = c_path-app ) .

*======================================================================
* Fill /xl/_rels/workbook.xml.rels
*======================================================================
DATA ls_relstab TYPE ty_s_relstab .

LOOP AT s_model-t_sheets ASSIGNING <sheets> .


CLEAR ls_relstab .
CONCATENATE 'worksheets/' <sheets>-name_int '.xml'
INTO ls_relstab-target .
ls_relstab-type = c_contenttype-wb_sheet .
ls_relstab-id = <sheets>-id .
APPEND ls_relstab TO s_model-t_workbookrels .
ENDLOOP .

IF s_model-t_sharedstrings[] IS NOT INITIAL .


CLEAR ls_relstab .
ls_relstab-target = 'sharedStrings.xml' .
ls_relstab-type = c_contenttype-wb_sharedstrings .
ls_relstab-id = 'rId547' .
APPEND ls_relstab TO s_model-t_workbookrels .
ENDIF .

IF s_model-t_calcchain[] IS NOT INITIAL .


CLEAR ls_relstab .
ls_relstab-target = 'calcChain.xml' .
ls_relstab-type = c_contenttype-wb_calcchain .
ls_relstab-id = 'rId548' .
APPEND ls_relstab TO s_model-t_workbookrels .
ENDIF .

xml_relstab_set( iv_path = c_path-workbook


it_relstab = s_model-t_workbookrels[] ) .

*======================================================================
* Fill \xl\workbook.xml
*======================================================================
DO 1 TIMES .
* sheets
lr_element-sheets =
s_model-ixml_doc_workbook->find_from_name( name = c_tag-sheets ) .
CHECK lr_element-sheets IS BOUND .

READ TABLE s_model-t_sheets ASSIGNING <sheets> WITH KEY active = abap_on .


IF sy-subrc EQ 0 .
lv_activetab = <sheets>-index .
ENDIF .

LOOP AT s_model-t_sheets ASSIGNING <sheets> .


lr_element-sheet =
s_model-ixml_doc_app->create_simple_element(
name = c_tag-sheet
parent = lr_element-sheets ) .

lv_string_tmp = <sheets>-name .
lr_element-sheet->set_attribute( name = c_tag-name value =
lv_string_tmp ) .

lv_string_tmp = <sheets>-index . CONDENSE lv_string_tmp .


lr_element-sheet->set_attribute( name = c_tag-sheetid value =
lv_string_tmp ) .

IF <sheets>-sheetdata_runtime-hidden IS INITIAL .
IF lv_activetab IS INITIAL .
lv_activetab = <sheets>-index .
ENDIF .
ELSE .
lr_element-sheet->set_attribute( name = c_tag-state value = c_tag-hidden
) .
ENDIF .

lv_string_tmp = <sheets>-id .
lr_element-sheet->set_attribute( namespace = c_tag-r name = c_tag-id
value = lv_string_tmp ) .
ENDLOOP .
ENDDO .

DO 1 TIMES .

IF lv_activetab IS INITIAL .
MESSAGE e000(lp) WITH v_text-t023 " text: Workbook must have at least one
visible Worksheet
RAISING process_terminated .
ENDIF .
SUBTRACT 1 FROM lv_activetab .

lr_ncol-workbookview =
s_model-ixml_doc_workbook->get_elements_by_tag_name( name = c_tag-
workbookview ) .
IF lr_ncol-workbookview IS BOUND .
DO .
lv_index = sy-index - 1 .
lr_node-workbookview = lr_ncol-workbookview->get_item( index = lv_index )
.
IF lr_node-workbookview IS NOT BOUND. EXIT. ENDIF .
lr_element-any ?= lr_node-workbookview->query_interface( ixml_iid_element
) .
lr_element-any->remove_attribute( name = c_tag-activetab ) .
CHECK lv_activetab GT 0 .
lv_string_tmp = lv_activetab . CONDENSE lv_string_tmp NO-GAPS .
lr_element-any->set_attribute( name = c_tag-activetab value =
lv_string_tmp ) .
ENDDO .
ENDIF .
ENDDO .

DO 1 TIMES .
CLEAR lv_definednames_occurs .
* compose a 'definedNames' node
lr_element-definednames =
s_model-ixml_doc_workbook->create_element( name = c_tag-definednames ) .

* names of cell range


LOOP AT s_model-t_sheets ASSIGNING <sheets> .
lv_localsheetid = <sheets>-index - 1 .
CONDENSE lv_localsheetid NO-GAPS .

SORT <sheets>-sheetdata_runtime-t_cellrng_name BY name .


DELETE ADJACENT DUPLICATES FROM <sheets>-sheetdata_runtime-t_cellrng_name
COMPARING name .

SORT <sheets>-sheetdata_runtime-t_cellrng_name BY beg_y beg_x end_y end_x .


DELETE ADJACENT DUPLICATES FROM <sheets>-sheetdata_runtime-t_cellrng_name
COMPARING beg_y beg_x end_y end_x .

LOOP AT <sheets>-sheetdata_runtime-t_cellrng_name ASSIGNING


<cellrng_name> .
lr_element-definedname =
s_model-ixml_doc_workbook->create_simple_element(
name = c_tag-definedname parent = lr_element-definednames ) .
lr_element-definedname->set_attribute( name = c_tag-name value =
<cellrng_name>-name ) .

conv_ref_nc( EXPORTING iv_beg_x = <cellrng_name>-beg_x


iv_beg_y = <cellrng_name>-beg_y
iv_end_x = <cellrng_name>-end_x
iv_end_y = <cellrng_name>-end_y
iv_prefix = '$'
iv_sheetname = <sheets>-name
IMPORTING ev_ref = lv_string_tmp ) .
lr_text = s_model-ixml_doc_workbook->create_text( lv_string_tmp ) .
lr_element-definedname->append_child( lr_text ) .

lv_definednames_occurs = abap_on .
ENDLOOP .
ENDLOOP .

** no-Page-Break ranges
* LOOP AT s_model-t_sheets ASSIGNING <sheets> .
* LOOP AT <sheets>-sheetdata_runtime-t_nopgbrk_range ASSIGNING
<nopgbrk_range> .
* lr_element-definedname =
* s_model-ixml_doc_workbook->create_simple_element(
* name = c_tag-definedname parent = lr_element-definednames ) .
* CALL FUNCTION 'GUID_CREATE'
* IMPORTING
* ev_guid_32 = lv_guid.
* IF <nopgbrk_range>-top IS NOT INITIAL .
* lv_shift = 'T' .
* ELSEIF NOT <nopgbrk_range>-left IS NOT INITIAL .
* lv_shift = 'L' .
* ENDIF.
* CONCATENATE c_preventpagebreak lv_shift lv_guid INTO lv_string_tmp .
* lr_element-definedname->set_attribute( name = c_tag-name value =
lv_string_tmp ) .
*
* conv_ref_nc_2( EXPORTING iv_beg_x = <nopgbrk_range>-beg_x
* iv_beg_y = <nopgbrk_range>-beg_y
* iv_end_x = <nopgbrk_range>-end_x
* iv_end_y = <nopgbrk_range>-end_y
* iv_prefix = '$'
* iv_sheetname = <sheets>-name
* IMPORTING ev_ref = lv_string_tmp ) .
* lr_text = s_model-ixml_doc_workbook->create_text( lv_string_tmp ) .
* lr_element-definedname->append_child( lr_text ) .
*
* lv_definednames_occurs = abap_on .
* ENDLOOP .
* ENDLOOP .

* print titles
LOOP AT s_model-t_sheets ASSIGNING <sheets> .
lv_localsheetid = <sheets>-index - 1 .
CONDENSE lv_localsheetid NO-GAPS .

CHECK <sheets>-sheetdata_runtime-printtitles-beg_x IS NOT INITIAL


OR <sheets>-sheetdata_runtime-printtitles-beg_y IS NOT INITIAL .

lr_element-definedname =
s_model-ixml_doc_workbook->create_simple_element(
name = c_tag-definedname parent = lr_element-definednames ) .
lr_element-definedname->set_attribute( name = c_tag-name value = c_tag-
xlnmprinttitles ) .
lr_element-definedname->set_attribute( name = c_tag-localsheetid value =
lv_localsheetid ) .

conv_ref_nc_2( EXPORTING iv_beg_x = <sheets>-sheetdata_runtime-


printtitles-beg_x
iv_beg_y = <sheets>-sheetdata_runtime-
printtitles-beg_y
iv_end_x = <sheets>-sheetdata_runtime-
printtitles-end_x
iv_end_y = <sheets>-sheetdata_runtime-
printtitles-end_y
iv_prefix = '$'
iv_sheetname = <sheets>-name
IMPORTING ev_ref = lv_string_tmp ) .
lr_text = s_model-ixml_doc_workbook->create_text( lv_string_tmp ) .
lr_element-definedname->append_child( lr_text ) .

lv_definednames_occurs = abap_on .
ENDLOOP .

* insert composed element


CHECK lv_definednames_occurs IS NOT INITIAL .
lr_element-workbook =
s_model-ixml_doc_workbook->find_from_name( name = c_tag-workbook ) .
CHECK lr_element-workbook IS BOUND .

xml_insert_element(
EXPORTING iv_name_element = c_tag-definednames
ir_ixml_element = lr_element-definednames
it_elemsequence = t_elemsequence_workbook
CHANGING cr_ixml_parent = lr_element-workbook ) .
ENDDO .

xml_save( iv_ixml_doc = s_model-ixml_doc_workbook


iv_path = c_path-workbook ) .

*======================================================================
* Fill /xl/charts/chartXXX.xml
* /xl/charts/colorsXXX.xml
* /xl/charts/styleXXX.xml
* /xl/charts/_rels/chartXXX.xml.rels
*======================================================================

LOOP AT s_model-t_sheets ASSIGNING <sheets> .


LOOP AT <sheets>-sheetdata_runtime-t_drawings[] ASSIGNING <drawings>
WHERE drawing_type EQ c_drawing_type-chart .

READ TABLE s_model-t_charts ASSIGNING <charts> WITH TABLE KEY id =


<drawings>-refer_id .
CHECK sy-subrc EQ 0 .

CLEAR lt_chartrels .
DO 2 TIMES .
CASE sy-index .
WHEN 1 . " -----[ /xl/charts/colorsXXX.xml
CHECK <charts>-chartcolors_ixml_doc IS BOUND .
ls_relstab-id = 'rId546' .
ls_relstab-type = c_contenttype-wb_chartcolors .
CONCATENATE 'colors' <drawings>-refer_id '.xml' INTO ls_relstab-
target .

xml_save( iv_path = <charts>-chartcolors_path


iv_ixml_doc = <charts>-chartcolors_ixml_doc ) .
FREE <charts>-chartcolors_ixml_doc .

WHEN 2 . " -----[ /xl/charts/styleXXX.xml


CHECK <charts>-chartstyle_ixml_doc IS BOUND .
ls_relstab-id = 'rId545' .
ls_relstab-type = c_contenttype-wb_chartstyle .
CONCATENATE 'style' <drawings>-refer_id '.xml' INTO ls_relstab-
target .

xml_save( iv_path = <charts>-chartstyle_path


iv_ixml_doc = <charts>-chartstyle_ixml_doc ) .
FREE <charts>-chartstyle_ixml_doc .
ENDCASE .
COLLECT ls_relstab INTO lt_chartrels[] .
ENDDO .
* -----[ /xl/charts/_rels/chartXXX.xml.rels
xml_relstab_set( iv_path = <charts>-chart_path
it_relstab = lt_chartrels[] ) .

* -----[ /xl/charts/chartXXX.xml ]

* ---< c:title >


DO 1 TIMES .
CHECK <charts>-chart_title IS NOT INITIAL .

CHECK <charts>-chart_ixml_doc IS BOUND .


FREE lr_element-chart . CLEAR lr_element-chart .
lr_element-chart = <charts>-chart_ixml_doc->find_from_name( name = c_tag-
chart namespace = c_tag-c depth = 2 ) .
CHECK lr_element-chart IS BOUND .
FREE lr_element-title . CLEAR lr_element-title .
lr_element-title = lr_element-chart->find_from_name( name = c_tag-title
namespace = c_tag-c depth = 1 ) .
CHECK lr_element-title IS BOUND .
FREE lr_element-tx . CLEAR lr_element-tx .
lr_element-tx = lr_element-title->find_from_name( name = c_tag-tx
namespace = c_tag-c depth = 1 ) .
IF lr_element-tx IS NOT BOUND .
" prepare node < c:tx >
FREE lr_ixml_doc . CLEAR lr_ixml_doc .
CONCATENATE
'<c:tx
xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart">'
'<c:rich><a:bodyPr rot="-540000" spcFirstLastPara="1"
vertOverflow="ellipsis" wrap="square" anchor'
'="ctr" anchorCtr="1"
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" />'
'<a:lstStyle
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" />'
'<a:p
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:pPr>'
'<a:defRPr sz="1400" b="0" i="0" u="none" strike="noStrike" kern="1200"
spc="0" baseline="0"><a:solidFill>'
'<a:schemeClr val="tx1"><a:lumMod val="65000" /><a:lumOff
val="35000" /></a:schemeClr></a:solidFill>'
'<a:latin typeface="+mn-lt" /><a:ea typeface="+mn-ea" /><a:cs
typeface="+mn-cs" /></a:defRPr></a:pPr>'
'<a:r><a:rPr lang="en-US" /><a:t>DUMMY</a:t></a:r><a:endParaRPr
lang="ru-RU" /></a:p></c:rich></c:tx>'
INTO lv_string_tmp .
lr_ixml_doc = xml_string_to_dom( iv_string = lv_string_tmp ) .
CHECK lr_ixml_doc IS BOUND .
lr_element-tx = lr_ixml_doc->find_from_name( name = c_tag-tx namespace
= c_tag-c depth = 1 ) .
" insert node < c:tx > before node < c:layout >
FREE lr_element-layout . CLEAR lr_element-layout .
lr_element-layout = lr_element-title->find_from_name( name = c_tag-
layout namespace = c_tag-c depth = 1 ) .
CHECK lr_element-layout IS BOUND .
lr_node-tx ?= lr_element-tx .
lr_node-layout ?= lr_element-layout .
lr_element-title->insert_child( new_child = lr_node-tx
ref_child = lr_node-layout ) .
ENDIF .
CHECK lr_element-tx IS BOUND .
FREE lr_ncol-r . CLEAR lr_ncol-r .
lr_ncol-r = lr_element-tx->get_elements_by_tag_name( name = c_tag-r
namespace = c_tag-a ) .
CHECK lr_ncol-r IS BOUND .
DO . " -->> loop at < a:r >
lv_index = sy-index - 1 .
lr_node-r = lr_ncol-r->get_item( index = lv_index ) .
IF lr_node-r IS INITIAL. EXIT. ENDIF .
IF lv_index GT 0 .
lr_node-r->remove_node( ) .
CHECK 1 = 2 .
ENDIF .
lr_element-r ?= lr_node-r->query_interface( ixml_iid_element ) .
FREE lr_element-any . CLEAR lr_element-any .
lr_element-any = lr_element-r->find_from_name( name = c_tag-t
namespace = c_tag-a depth = 1 ) .
CHECK lr_element-any IS BOUND .
lr_element-any->set_value( <charts>-chart_title_tx ) .
ENDDO .
ENDDO .

DO 1 TIMES .
READ TABLE s_model-t_datasets ASSIGNING <datasets> WITH TABLE KEY id =
<charts>-dataset_id .
CHECK sy-subrc EQ 0 .
READ TABLE <datasets>-t_refs ASSIGNING <dataset_refs> WITH TABLE KEY
rt_path_1 = <charts>-dataset_rt_path_1 .
CHECK sy-subrc EQ 0 .

CHECK <charts>-chart_ixml_doc IS BOUND .


FREE lr_element-chart . CLEAR lr_element-chart .
lr_element-chart = <charts>-chart_ixml_doc->find_from_name( name = c_tag-
chart namespace = c_tag-c depth = 2 ) .
CHECK lr_element-chart IS BOUND .
FREE lr_element-plotarea . CLEAR lr_element-plotarea .
lr_element-plotarea = lr_element-chart->find_from_name( name = c_tag-
plotarea namespace = c_tag-c depth = 1 ) .
CHECK lr_element-plotarea IS BOUND .
FREE lr_ncol-ser . CLEAR lr_ncol-ser .
lr_ncol-ser = lr_element-plotarea->get_elements_by_tag_name( name =
c_tag-ser namespace = c_tag-c depth = 2 ) .
CHECK lr_ncol-ser IS BOUND .
DO . " -->> loop at < c:lineChart > < c:ser >
lv_index = sy-index - 1 .
lr_node-ser = lr_ncol-ser->get_item( index = lv_index ) .
IF lr_node-ser IS INITIAL. EXIT. ENDIF .
lr_element-ser ?= lr_node-ser->query_interface( ixml_iid_element ) .
FREE lr_element-idx . CLEAR lr_element-idx .
lr_element-idx = lr_element-ser->find_from_name( name = c_tag-idx
namespace = c_tag-c depth = 1 ) .
CHECK lr_element-idx IS BOUND .
lv_idx = lr_element-idx->get_attribute( name = c_tag-val ) .

READ TABLE <charts>-dataset_series_tab ASSIGNING <dataset_series_tab>


WITH KEY seridx = lv_idx .
CHECK sy-subrc EQ 0 .
READ TABLE <dataset_refs>-t_fields ASSIGNING <dataset_ref_fields> WITH
KEY field = <dataset_series_tab>-dtsfld .
CHECK sy-subrc EQ 0 .

* ---< c:tx >


DO 1 TIMES .
" find Caption node
FREE lr_element-tx . CLEAR lr_element-tx .
lr_element-tx = lr_element-ser->find_from_name( name = c_tag-tx
namespace = c_tag-c depth = 1 ) .

IF lr_element-tx IS NOT BOUND .


lr_element-sppr = lr_element-ser->find_from_name( name = c_tag-sppr
namespace = c_tag-c depth = 1 ) .
CHECK lr_element-sppr IS BOUND .
lr_element-tx = <charts>-chart_ixml_doc->create_element( name =
c_tag-tx namespace = c_tag-c ) .
CHECK lr_element-tx IS BOUND .
lr_element-ref =
<charts>-chart_ixml_doc->create_simple_element( name = c_tag-strref
namespace = c_tag-c parent = lr_element-tx ) .
<charts>-chart_ixml_doc->create_simple_element( name = c_tag-f
namespace = c_tag-c parent = lr_element-ref ) .
lr_node-sppr ?= lr_element-sppr .
lr_node-tx ?= lr_element-tx .
lr_element-ser->insert_child( new_child = lr_node-tx
ref_child = lr_node-sppr ) .
ENDIF .
CHECK lr_element-tx IS BOUND .
" remove children
DO .
lr_node-any = lr_element-tx->get_first_child( ) .
IF lr_node-any IS NOT BOUND . EXIT . ENDIF .
lr_node-any->remove_node( ) .
ENDDO .

IF <charts>-chart_series_title IS NOT INITIAL


AND <dataset_ref_fields>-caption_ref IS INITIAL .
CLEAR <charts>-chart_series_title .
ENDIF .

CASE <charts>-chart_series_title .
WHEN space .
lr_element-any =
<charts>-chart_ixml_doc->create_simple_element( name = c_tag-v
namespace = c_tag-c parent = lr_element-tx ) .
CHECK lr_element-any IS BOUND .
lr_element-any->set_value( value = <dataset_series_tab>-
sercap ) .
WHEN OTHERS .
lr_element-ref =
<charts>-chart_ixml_doc->create_simple_element( name = c_tag-
strref namespace = c_tag-c parent = lr_element-tx ) .
CHECK lr_element-ref IS BOUND .
lr_element-any =
<charts>-chart_ixml_doc->create_simple_element( name = c_tag-f
namespace = c_tag-c parent = lr_element-ref ) .
CHECK lr_element-any IS BOUND .
lr_element-any->set_value( value = <dataset_ref_fields>-
caption_ref ) .
ENDCASE .
ENDDO .

* ---< c:val >


DO 1 TIMES .
" find Value node
FREE lr_element-val . CLEAR lr_element-val .
lr_element-val = lr_element-ser->find_from_name( name = c_tag-val
namespace = c_tag-c depth = 1 ) .
IF lr_element-val IS NOT BOUND .
lr_element-val = lr_element-ser->find_from_name( name = c_tag-yval
namespace = c_tag-c depth = 1 ) .
ENDIF .
CHECK lr_element-val IS BOUND .
" set reference
FREE lr_element-ref . CLEAR lr_element-ref .
lr_element-ref = lr_element-val->find_from_name( name = c_tag-strref
namespace = c_tag-c depth = 1 ) .
IF lr_element-ref IS NOT BOUND .
lr_element-ref = lr_element-val->find_from_name( name = c_tag-
numref namespace = c_tag-c depth = 1 ) .
ENDIF .
CHECK lr_element-ref IS BOUND .
FREE lr_element-any . CLEAR lr_element-any .
lr_element-any = lr_element-ref->find_from_name( name = c_tag-f
namespace = c_tag-c depth = 1 ) .
CHECK lr_element-any IS BOUND .
lr_element-any->set_value( value = <dataset_ref_fields>-ref ) .
" delete cache
FREE lr_element-any . CLEAR lr_element-any .
lr_element-any = lr_element-ref->find_from_name( name = c_tag-
numcache namespace = c_tag-c depth = 1 ) .
IF lr_element-any IS NOT BOUND .
lr_element-any = lr_element-ref->find_from_name( name = c_tag-
strcache namespace = c_tag-c depth = 1 ) .
ENDIF .
CHECK lr_element-any IS BOUND .
lr_element-any->remove_node( ) .
ENDDO .

* ---< c:cat >


DO 1 TIMES .
READ TABLE <charts>-dataset_series_tab ASSIGNING <dataset_series_tab>
WITH KEY seridx = c_chart_category_idx .
IF sy-subrc NE 0
OR <dataset_series_tab>-dtsfld IS INITIAL .
READ TABLE <charts>-dataset_series_tab ASSIGNING
<dataset_series_tab> WITH KEY seridx = lv_idx .
CHECK sy-subrc EQ 0 .
ENDIF .
READ TABLE <dataset_refs>-t_fields ASSIGNING <dataset_ref_fields>
WITH KEY field = <dataset_series_tab>-dtsfld .
" find Category node
CHECK sy-subrc EQ 0 .
FREE lr_element-cat . CLEAR lr_element-cat .
lr_element-cat = lr_element-ser->find_from_name( name = c_tag-cat
namespace = c_tag-c depth = 1 ) .
IF lr_element-cat IS NOT BOUND .
lr_element-cat = lr_element-ser->find_from_name( name = c_tag-xval
namespace = c_tag-c depth = 1 ) .
ENDIF .
IF lr_element-cat IS NOT BOUND .
CHECK lr_element-val IS BOUND .
lr_element-cat = <charts>-chart_ixml_doc->create_element( name =
c_tag-cat namespace = c_tag-c ) .
CHECK lr_element-cat IS BOUND .
lr_element-ref =
<charts>-chart_ixml_doc->create_simple_element( name = c_tag-strref
namespace = c_tag-c parent = lr_element-cat ) .
<charts>-chart_ixml_doc->create_simple_element( name = c_tag-f
namespace = c_tag-c parent = lr_element-ref ) .
lr_node-val ?= lr_element-val .
lr_node-cat ?= lr_element-cat .
lr_element-ser->insert_child( new_child = lr_node-cat
ref_child = lr_node-val ) .
ENDIF .
CHECK lr_element-cat IS BOUND .
" set reference
FREE lr_element-ref . CLEAR lr_element-ref .
lr_element-ref = lr_element-cat->find_from_name( name = c_tag-strref
namespace = c_tag-c depth = 1 ) .
IF lr_element-ref IS NOT BOUND .
lr_element-ref = lr_element-cat->find_from_name( name = c_tag-
numref namespace = c_tag-c depth = 1 ) .
ENDIF .
CHECK lr_element-ref IS BOUND .
FREE lr_element-any . CLEAR lr_element-any .
lr_element-any = lr_element-ref->find_from_name( name = c_tag-f
namespace = c_tag-c depth = 1 ) .
CHECK lr_element-any IS BOUND .
lr_element-any->set_value( value = <dataset_ref_fields>-ref ) .
" delete cache
FREE lr_element-any . CLEAR lr_element-any .
lr_element-any = lr_element-ref->find_from_name( name = c_tag-
numcache namespace = c_tag-c depth = 1 ) .
IF lr_element-any IS NOT BOUND .
lr_element-any = lr_element-ref->find_from_name( name = c_tag-
strcache namespace = c_tag-c depth = 1 ) .
ENDIF .
CHECK lr_element-any IS BOUND .
lr_element-any->remove_node( ) .
ENDDO .
ENDDO .

* AXIS Titles
DO 2 TIMES .
CASE sy-index .
WHEN 1 . " first iteration: Category Axis Title

lv_axis_title = <charts>-chart_catax_title .
lv_axis_title_tx = <charts>-chart_catax_title_tx .
" -->> find < c:catAx >
FREE lr_element-axis . CLEAR lr_element-axis .
lr_element-axis = lr_element-plotarea->find_from_name( name =
c_tag-catax namespace = c_tag-c depth = 1 ) .

WHEN 2 . " second iteration: Value Axis Title

lv_axis_title = <charts>-chart_valax_title .
lv_axis_title_tx = <charts>-chart_valax_title_tx .
" -->> find < c:valAx >
FREE lr_element-axis . CLEAR lr_element-axis .
lr_element-axis = lr_element-plotarea->find_from_name( name =
c_tag-valax namespace = c_tag-c depth = 1 ) .
ENDCASE .

CHECK lv_axis_title IS NOT INITIAL .


CHECK lr_element-axis IS BOUND .

CASE lv_axis_title .
WHEN '1' .
READ TABLE <charts>-dataset_series_tab ASSIGNING
<dataset_series_tab> WITH KEY seridx = '9999' .
CHECK sy-subrc EQ 0 .
READ TABLE <dataset_refs>-t_fields ASSIGNING <dataset_ref_fields>
WITH KEY field = <dataset_series_tab>-dtsfld .
CHECK sy-subrc EQ 0 .
CHECK <dataset_ref_fields>-ref IS NOT INITIAL .

WHEN OTHERS .
ENDCASE .

" -->> find < c:title >


FREE lr_element-title . CLEAR lr_element-title .
lr_element-title = lr_element-axis->find_from_name( name = c_tag-title
namespace = c_tag-c depth = 1 ) .
CHECK lr_element-title IS BOUND .

" -->> try to find < c:tx >


FREE lr_element-tx . CLEAR lr_element-tx .
lr_element-tx = lr_element-title->find_from_name( name = c_tag-tx
namespace = c_tag-c depth = 1 ) .
IF lr_element-tx IS NOT BOUND .
" prepare node < c:tx >
FREE lr_ixml_doc . CLEAR lr_ixml_doc .
CONCATENATE
'<c:tx
xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart">'
'<c:rich><a:bodyPr
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" />'
'<a:lstStyle
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" />'
'<a:p
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:pPr><a:defRPr
/>'
'</a:pPr><a:r><a:rPr lang="ru-RU"
/><a:t>DUMMY</a:t></a:r></a:p></c:rich></c:tx>'
INTO lv_string_tmp .
lr_ixml_doc = xml_string_to_dom( iv_string = lv_string_tmp ) .
CHECK lr_ixml_doc IS BOUND .
lr_element-tx = lr_ixml_doc->find_from_name( name = c_tag-tx
namespace = c_tag-c depth = 1 ) .
" insert node < c:tx > before node < c:layout >
FREE lr_element-layout . CLEAR lr_element-layout .
lr_element-layout = lr_element-title->find_from_name( name = c_tag-
layout namespace = c_tag-c depth = 1 ) .
CHECK lr_element-layout IS BOUND .
lr_node-tx ?= lr_element-tx .
lr_node-layout ?= lr_element-layout .
lr_element-title->insert_child( new_child = lr_node-tx
ref_child = lr_node-layout ) .
ENDIF .
CHECK lr_element-tx IS BOUND .

" -->> try to find < c:strRef >


FREE lr_element-strref . CLEAR lr_element-strref .
lr_element-strref = lr_element-tx->find_from_name( name = c_tag-strref
namespace = c_tag-c depth = 1 ) .

CASE lv_axis_title .
WHEN '1' .
IF lr_element-strref IS BOUND . " Caption by cell reference
" we need to just overwrite value

" overwrite value of <c:f>


FREE lr_element-any . CLEAR lr_element-any .
lr_element-any = lr_element-strref->find_from_name( name = c_tag-
f namespace = c_tag-c depth = 1 ) .
IF lr_element-any IS BOUND .
lr_element-any->set_value( value = <dataset_ref_fields>-
caption_ref ) .
ENDIF .

" remove <c:strCache>


FREE lr_element-any . CLEAR lr_element-any .
lr_element-any = lr_element-strref->find_from_name( name = c_tag-
strcache namespace = c_tag-c depth = 1 ) .
IF lr_element-any IS BOUND .
lr_element-any->remove_node( ) .
ENDIF .

ELSE . " Caption is hardcoded


" we need to convert it to cell reference
" find <c:rich>
FREE lr_element-rich . CLEAR lr_element-rich .
lr_element-rich = lr_element-tx->find_from_name( name = c_tag-
rich namespace = c_tag-c depth = 1 ) .
CHECK lr_element-rich IS BOUND .

" clone <c:rich> to <c:txPr>


FREE lr_node-txpr . CLEAR lr_node-txpr .
lr_node-txpr ?= lr_element-rich->clone( ) .
CHECK lr_node-txpr IS BOUND .

FREE lr_element-txpr . CLEAR lr_element-txpr .


lr_element-txpr ?= lr_node-txpr-
>query_interface( ixml_iid_element ) .
CHECK lr_element-txpr IS BOUND .

lr_node-txpr->set_name( name = c_tag-txpr ) .


" delete <a:r> from <c:txPr>
FREE lr_element-r . CLEAR lr_element-r .
lr_element-r = lr_element-txpr->find_from_name( name = c_tag-r
namespace = c_tag-a depth = 3 ) .
CHECK lr_element-r IS BOUND .
lr_element-r->remove_node( ) .

" append <c:txPr> as child of <c:title> (under <c:spPr> )


lr_element-title->append_child( new_child = lr_node-txpr ) .

" rename <c:rich> to <c:strRef> and remove all children


lr_element-ref = lr_element-rich .
lr_element-ref->set_name( name = c_tag-strref ) .
DO .
lr_node-any = lr_element-ref->get_first_child( ) .
IF lr_node-any IS NOT BOUND . EXIT . ENDIF .
lr_node-any->remove_node( ) .
ENDDO .
" append <c:f> (with Caption ref.value) as child of <c:strRef>
<charts>-chart_ixml_doc->create_simple_element( name = c_tag-f
namespace = c_tag-c parent = lr_element-ref value = <dataset_ref_fields>-
caption_ref ) .
ENDIF .

WHEN OTHERS .
IF lr_element-strref IS BOUND . " Caption by cell reference
" we need to convert it to hardcoded value
" find <c:txPr>
FREE lr_element-txpr . CLEAR lr_element-txpr .
lr_element-txpr = lr_element-title->find_from_name( name = c_tag-
txpr namespace = c_tag-c depth = 1 ) .
CHECK lr_element-txpr IS BOUND .

" clone <c:txPr> to <c:rich>


FREE lr_node-rich . CLEAR lr_node-rich .
lr_node-rich ?= lr_element-txpr->clone( ) .
CHECK lr_node-rich IS BOUND .

FREE lr_element-rich . CLEAR lr_element-rich .


lr_element-rich ?= lr_node-rich-
>query_interface( ixml_iid_element ) .
CHECK lr_element-rich IS BOUND .

lr_node-rich->set_name( name = c_tag-rich ) .


lr_element-txpr->remove_node( ) .

* insert <c:rich> instead of <c:strRef>


lr_node-strref ?= lr_element-strref .
lr_element-tx->replace_child( new_child = lr_node-rich
old_child = lr_node-strref ) .

" find <a:p>


FREE lr_element-p . CLEAR lr_element-p .
lr_element-p = lr_element-rich->find_from_name( name = c_tag-p
namespace = c_tag-a depth = 1 ) .
CHECK lr_element-p IS BOUND .

" remove <a:endParaRPr>


FREE lr_element-any . CLEAR lr_element-any .
lr_element-any = lr_element-p->find_from_name( name = c_tag-
endpararpr namespace = c_tag-a depth = 1 ) .
IF lr_element-any IS BOUND .
lr_element-any->remove_node( ) .
ENDIF .

lr_element-r =
<charts>-chart_ixml_doc->create_simple_element( name = c_tag-r
namespace = c_tag-a parent = lr_element-p ) .
CHECK lr_element-r IS BOUND .
lr_element-t =
<charts>-chart_ixml_doc->create_simple_element( name = c_tag-t
namespace = c_tag-a parent = lr_element-r value = lv_axis_title_tx ) .

ELSE . " Caption is hardcoded


" we need to just overwrite value
FREE lr_ncol-r . CLEAR lr_ncol-r .
lr_ncol-r = lr_element-tx->get_elements_by_tag_name( name =
c_tag-r namespace = c_tag-a ) .
CHECK lr_ncol-r IS BOUND .
DO . " -->> loop at < a:r >
lv_index = sy-index - 1 .
lr_node-r = lr_ncol-r->get_item( index = lv_index ) .
IF lr_node-r IS INITIAL. EXIT. ENDIF .
IF lv_index GT 0 .
lr_node-r->remove_node( ) .
CHECK 1 = 2 .
ENDIF .
lr_element-r ?= lr_node-r-
>query_interface( ixml_iid_element ) .
FREE lr_element-any . CLEAR lr_element-any .
lr_element-any = lr_element-r->find_from_name( name = c_tag-t
namespace = c_tag-a depth = 1 ) .
CHECK lr_element-any IS BOUND .
lr_element-any->set_value( lv_axis_title_tx ) .
ENDDO .
ENDIF .
ENDCASE .
ENDDO .

ENDDO .

xml_save( iv_path = <charts>-chart_path


iv_ixml_doc = <charts>-chart_ixml_doc ) .
FREE <charts>-chart_ixml_doc .
ENDLOOP .
ENDLOOP .

*======================================================================
* save Bitmap files into '/xl/media' folder
*======================================================================
LOOP AT s_model-t_media ASSIGNING <media> .
CONCATENATE c_path-mediafolder+1 '/image' <media>-id '.jpeg'
INTO lv_string_tmp .
CONDENSE lv_string_tmp NO-GAPS .
r_zipfolder->add( name = lv_string_tmp
content = <media>-media_rawdata ) .
ENDLOOP .

*======================================================================
* save vmlDrawings
*======================================================================
LOOP AT s_model-t_vmldrawings ASSIGNING <vmldrawings> .

xml_save( iv_path = <vmldrawings>-path


iv_ixml_doc = <vmldrawings>-ixml_doc ) .

CLEAR lt_vmldrawingsrels .
LOOP AT <vmldrawings>-t_rels ASSIGNING <vmldrawings_rels> .
MOVE-CORRESPONDING <vmldrawings_rels> TO ls_vmldrawingsrels .
APPEND ls_vmldrawingsrels TO lt_vmldrawingsrels .

* -----[ /xl/media/imageXXX.emf
r_zipfolder->add( name = <vmldrawings_rels>-media_path
content = <vmldrawings_rels>-media_rawdata ) .
ENDLOOP .

* -----[ /xl/drawings/_rels/vmldrawingsXXX.vml.rels
xml_relstab_set( iv_path = <vmldrawings>-path
it_relstab = lt_vmldrawingsrels[] ) .
ENDLOOP .

*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
*======================================================================
* Fill \xl\sharedStrings.xml
*======================================================================
* According SAP NOTE 1229110 (Lack of memory when working with large amounts of
XML data),
* here we implement step-by-step (by piecemeal) rendering of XML-file
*======================================================================
*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

IF s_model-t_sharedstrings[] IS NOT INITIAL .


CLEAR lv_bookmark_string .
CLEAR lv_bookmark_xstring .
CLEAR lv_bookmark_offset .
CLEAR lv_xml_xstring .
FREE lr_streamfactory .
FREE lr_encoding .
FREE lr_ixml .

* create XML-DOM
lt_sharedstrings[] = s_model-t_sharedstrings[] .

lr_ixml = cl_ixml=>create( ) .
s_model-ixml_doc_sharedstrings = lr_ixml->create_document( ) .

lr_element-sst = " Root-node


s_model-ixml_doc_sharedstrings->create_simple_element(
name = c_tag-sst
parent = s_model-ixml_doc_sharedstrings ) .

lr_element-sst->set_attribute( name = c_tag-xmlns value = c_contenttype-


wb_main ) .
lv_string_tmp = LINES( lt_sharedstrings ) .
CONDENSE lv_string_tmp .
lr_element-sst->set_attribute( name = c_tag-count value = lv_string_tmp ) .
lr_element-sst->set_attribute( name = c_tag-uniquecount value =
lv_string_tmp ) .

* add bookmark node (for splitting XML Xstring) to XML-DOM


lr_element-si =
s_model-ixml_doc_sharedstrings->create_simple_element(
name = lc_tag_bookmark
parent = lr_element-sst ) .

* render XML-DOM to Xstring


lv_xml_xstring =
xml_save( iv_ixml_doc = s_model-ixml_doc_sharedstrings
iv_path = c_path-sharedstrings ) .

* split rendered XML Xstring at bookmark into two parts (BEGIN and END)
CONCATENATE '<' lc_tag_bookmark '/>' INTO lv_bookmark_string . " -->>
bookmark
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = lv_bookmark_string
IMPORTING
buffer = lv_bookmark_xstring
EXCEPTIONS
OTHERS = 0.

CLEAR lv_bookmark_offset .
FIND lv_bookmark_xstring IN lv_xml_xstring
MATCH OFFSET lv_bookmark_offset IN BYTE MODE .
IF sy-subrc EQ 0
AND lv_bookmark_offset NE 0 .
ls_ostream_xstring-beg = lv_xml_xstring(lv_bookmark_offset) .
ADD 12 TO lv_bookmark_offset .
ls_ostream_xstring-end = lv_xml_xstring+lv_bookmark_offset .
ENDIF .

* generate MIDDLE part Xstring: add nodes and immediately render it


lr_ixml = cl_ixml=>create( ) .
lr_streamfactory = lr_ixml->create_stream_factory( ) .
lr_ostream = lr_streamfactory->create_ostream_xstring( string =
ls_ostream_xstring-mid ) .
lr_encoding = lr_ixml->create_encoding( character_set = c_character_set
byte_order = 0 ) .
lr_ostream->set_encoding( encoding = lr_encoding ) .

LOOP AT lt_sharedstrings ASSIGNING <sharedstrings> .


IF <sharedstrings>-si_node IS BOUND .
<sharedstrings>-si_node->render( ostream = lr_ostream recursive =
abap_on ).
ELSE .
lr_element-si = s_model-ixml_doc_sharedstrings->create_element( name =
c_tag-si ) .
lr_element-t = s_model-ixml_doc_sharedstrings->create_simple_element(
name = c_tag-t
parent = lr_element-si
value = <sharedstrings>-value ) .
IF <sharedstrings>-value IS NOT INITIAL .
lv_char1 = <sharedstrings>-value .
IF lv_char1 EQ space .
lr_element-t->set_attribute(
name = c_tag-space_
namespace = c_tag-xml
value = c_tag-preserve ) .
ENDIF .
ENDIF .
lr_element-si->render( ostream = lr_ostream recursive = abap_on ) .
lr_element-si->remove_node( ) .
ENDIF .
ENDLOOP .

lr_ostream->close( ) .
FREE lr_ostream .
FREE lr_encoding .
FREE lr_streamfactory .
FREE lr_ixml .
FREE s_model-t_sharedstrings[] .

* concatenate all gotten substrings into whole XML-file Xstring


* and save it to ZIP-folder
CONCATENATE
ls_ostream_xstring-beg
ls_ostream_xstring-mid
ls_ostream_xstring-end
INTO lv_xml_xstring IN BYTE MODE .
FREE ls_ostream_xstring .

lv_string_tmp = c_path-sharedstrings .
SHIFT lv_string_tmp LEFT DELETING LEADING '/' .

r_zipfolder->delete( EXPORTING name = lv_string_tmp


EXCEPTIONS OTHERS = 0 ) .

r_zipfolder->add( name = lv_string_tmp


content = lv_xml_xstring ) .
FREE lv_xml_xstring .
ENDIF .

*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
*======================================================================
* Fill \xl\calcChain.xml
*======================================================================
* According SAP NOTE 1229110 (Lack of memory when working with large amounts of
XML data),
* here we implement step-by-step (by piecemeal) rendering of XML-file
*======================================================================
*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

IF s_model-t_calcchain[] IS NOT INITIAL .


CLEAR lv_bookmark_string .
CLEAR lv_bookmark_xstring .
CLEAR lv_bookmark_offset .
CLEAR lv_xml_xstring .
FREE lr_streamfactory .
FREE lr_encoding .
FREE lr_ixml .

* create XML-DOM
lr_ixml = cl_ixml=>create( ) .
s_model-ixml_doc_calcchain = lr_ixml->create_document( ) .

lr_element-calcchain = " Root-node


s_model-ixml_doc_calcchain->create_simple_element(
name = c_tag-calcchain
parent = s_model-ixml_doc_calcchain ) .

lr_element-calcchain->set_attribute( name = c_tag-xmlns value =


c_contenttype-wb_main ) .

* add bookmark node (for splitting XML Xstring) to XML-DOM


lr_element-si =
s_model-ixml_doc_calcchain->create_simple_element(
name = lc_tag_bookmark
parent = lr_element-calcchain ) .

* render XML-DOM to Xstring


lv_xml_xstring =
xml_save( iv_ixml_doc = s_model-ixml_doc_calcchain
iv_path = c_path-calcchain ) .

* split rendered XML Xstring at bookmark into two parts (BEGIN and END)
CONCATENATE '<' lc_tag_bookmark '/>' INTO lv_bookmark_string . " -->>
bookmark
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = lv_bookmark_string
IMPORTING
buffer = lv_bookmark_xstring
EXCEPTIONS
OTHERS = 0.

CLEAR lv_bookmark_offset .
FIND lv_bookmark_xstring IN lv_xml_xstring
MATCH OFFSET lv_bookmark_offset IN BYTE MODE .
IF sy-subrc EQ 0
AND lv_bookmark_offset NE 0 .
ls_ostream_xstring-beg = lv_xml_xstring(lv_bookmark_offset) .
ADD 12 TO lv_bookmark_offset .
ls_ostream_xstring-end = lv_xml_xstring+lv_bookmark_offset .
ENDIF .

* generate MIDDLE part Xstring: add nodes and immediately render it


lr_ixml = cl_ixml=>create( ) .
lr_streamfactory = lr_ixml->create_stream_factory( ) .
lr_ostream = lr_streamfactory->create_ostream_xstring( string =
ls_ostream_xstring-mid ) .
lr_encoding = lr_ixml->create_encoding( character_set = c_character_set
byte_order = 0 ) .
lr_ostream->set_encoding( encoding = lr_encoding ) .

LOOP AT s_model-t_calcchain ASSIGNING <calcchain> .


lr_element-c = s_model-ixml_doc_calcchain->create_element( name = c_tag-c )
.
lv_y_char = <calcchain>-y . CONDENSE lv_y_char NO-GAPS .
conv_nc( EXPORTING iv_number = <calcchain>-x
IMPORTING ev_char = lv_x_char ) .
CONCATENATE lv_x_char lv_y_char INTO lv_string_tmp .
lr_element-c->set_attribute( name = c_tag-r value = lv_string_tmp ) .

lv_string_tmp = <calcchain>-sheet_index . CONDENSE lv_string_tmp NO-GAPS .


lr_element-c->set_attribute( name = c_tag-i value = lv_string_tmp ) .

lr_element-c->render( ostream = lr_ostream recursive = abap_on ) .


lr_element-c->remove_node( ) .
ENDLOOP .

lr_ostream->close( ) .
FREE lr_ostream .
FREE lr_encoding .
FREE lr_ostream .
FREE lr_streamfactory .
FREE lr_ixml .
FREE s_model-t_calcchain[] .

* concatenate all gotten substrings into whole XML-file Xstring


* and save it to ZIP-folder
CONCATENATE
ls_ostream_xstring-beg
ls_ostream_xstring-mid
ls_ostream_xstring-end
INTO lv_xml_xstring IN BYTE MODE .
FREE ls_ostream_xstring .

lv_string_tmp = c_path-calcchain .
SHIFT lv_string_tmp LEFT DELETING LEADING '/' .

r_zipfolder->delete( EXPORTING name = lv_string_tmp


EXCEPTIONS OTHERS = 0 ) .

r_zipfolder->add( name = lv_string_tmp


content = lv_xml_xstring ) .
FREE lv_xml_xstring .
ENDIF .

ENDMETHOD . " finalize_model


METHOD begin_sheet .

CLEAR s_sheets .
FREE s_sheets .

* Prepare Name and ID the sheet


s_sheets-index = LINES( s_model-t_sheets ) + 1 .
s_sheets-num = s_sheets-index + 549 .
CONDENSE s_sheets-num .

IF iv_sheetname IS NOT INITIAL .


s_sheets-name = iv_sheetname .
ENDIF .
sheet_name_validate( CHANGING cv_sheetname = s_sheets-name ) .
rv_sheet_name = s_sheets-name .

CONCATENATE 'sheet' s_sheets-num INTO s_sheets-name_int .


CONCATENATE 'rId' s_sheets-num INTO s_sheets-id .

s_sheets-active = iv_active .
s_sheets-sheetdata_runtime-hidden = iv_hidden .
s_sheets-sheetdata_runtime-sheetprotection = is_sheetprotection .

* Prepare XML-document of the sheet


DATA:
lr_ixml TYPE REF TO if_ixml ,
lr_rootnode TYPE REF TO if_ixml_node .

lr_ixml = cl_ixml=>create( ) .
s_sheets-ixml_doc = lr_ixml->create_document( ) .
lr_rootnode = iv_ixml_doc->clone( ) .
s_sheets-ixml_doc ?= lr_rootnode->query_interface( ixml_iid_document ) .

xml_remove_nodes( iv_ixml_doc = s_sheets-ixml_doc iv_name = c_tag-col ) .


xml_remove_nodes( iv_ixml_doc = s_sheets-ixml_doc iv_name = c_tag-cols ) .
xml_remove_nodes( iv_ixml_doc = s_sheets-ixml_doc iv_name = c_tag-row ) .
xml_remove_nodes( iv_ixml_doc = s_sheets-ixml_doc iv_name = c_tag-
mergecells ) .
xml_remove_nodes( iv_ixml_doc = s_sheets-ixml_doc iv_name = c_tag-drawing ) .
xml_remove_nodes( iv_ixml_doc = s_sheets-ixml_doc iv_name = c_tag-selection )
.
xml_remove_nodes( iv_ixml_doc = s_sheets-ixml_doc iv_name = c_tag-rowbreaks )
.
xml_remove_nodes( iv_ixml_doc = s_sheets-ixml_doc iv_name = c_tag-colbreaks )
.
xml_remove_nodes( iv_ixml_doc = s_sheets-ixml_doc iv_name = c_tag-
datavalidations ) .

IF s_sheets-sheetdata_runtime-sheetprotection-mode NE c_sheetprotection_mode-
from_template .
xml_remove_nodes( iv_ixml_doc = s_sheets-ixml_doc iv_name = c_tag-
sheetprotection ) .
ENDIF .

* Prepare Relations with the sheet


s_sheets-sheetdata_runtime-t_sheetrels[] = it_sheetrels[] .

DELETE s_sheets-sheetdata_runtime-t_sheetrels
WHERE type EQ c_contenttype-wb_drawing .

* 'summarybelow' and 'summaryright' properties


v_summarybelow = iv_summarybelow .
v_summaryright = iv_summaryright .

* vmlDrawings
DO 1 TIMES .
CHECK is_vmldrawings-id IS NOT INITIAL .

READ TABLE s_model-t_vmldrawings TRANSPORTING NO FIELDS


WITH TABLE KEY id = is_vmldrawings-id .
CHECK sy-subrc NE 0 .

INSERT is_vmldrawings INTO TABLE s_model-t_vmldrawings .


ENDDO .
ENDMETHOD . "begin_sheet
METHOD finalize_sheet .

DATA:
lr_ixml TYPE REF TO if_ixml ,
lr_ixml_doc_drawing TYPE REF TO if_ixml_document ,
BEGIN OF lr_element ,
worksheet TYPE REF TO if_ixml_element ,
dimension TYPE REF TO if_ixml_element ,
sheetformatpr TYPE REF TO if_ixml_element ,
sheetdata TYPE REF TO if_ixml_element ,
sheetview TYPE REF TO if_ixml_element ,
mergecells TYPE REF TO if_ixml_element ,
mergecell TYPE REF TO if_ixml_element ,
drawing TYPE REF TO if_ixml_element ,
wsdr TYPE REF TO if_ixml_element ,
any TYPE REF TO if_ixml_element ,
row TYPE REF TO if_ixml_element ,
cols TYPE REF TO if_ixml_element ,
col TYPE REF TO if_ixml_element ,
c TYPE REF TO if_ixml_element ,
f TYPE REF TO if_ixml_element ,
twocellanchor TYPE REF TO if_ixml_element ,
from TYPE REF TO if_ixml_element ,
to TYPE REF TO if_ixml_element ,
clientdata TYPE REF TO if_ixml_element ,
blip TYPE REF TO if_ixml_element ,
cnvpr TYPE REF TO if_ixml_element ,
pic TYPE REF TO if_ixml_element ,
chart TYPE REF TO if_ixml_element ,
nvpicpr TYPE REF TO if_ixml_element ,
cnvpicpr TYPE REF TO if_ixml_element ,
piclocks TYPE REF TO if_ixml_element ,
blipfill TYPE REF TO if_ixml_element ,
stretch TYPE REF TO if_ixml_element ,
sppr TYPE REF TO if_ixml_element ,
xfrm TYPE REF TO if_ixml_element ,
off TYPE REF TO if_ixml_element ,
ext TYPE REF TO if_ixml_element ,
prstgeom TYPE REF TO if_ixml_element ,
sheetprotection TYPE REF TO if_ixml_element ,
rowbreaks TYPE REF TO if_ixml_element ,
colbreaks TYPE REF TO if_ixml_element ,
brk TYPE REF TO if_ixml_element ,
datavalidations TYPE REF TO if_ixml_element ,
datavalidation TYPE REF TO if_ixml_element ,
END OF lr_element ,
BEGIN OF lr_node ,
twocellanchor TYPE REF TO if_ixml_node ,
cnvpr TYPE REF TO if_ixml_node ,
ext TYPE REF TO if_ixml_node ,
to TYPE REF TO if_ixml_node ,
END OF lr_node ,
lr_text TYPE REF TO if_ixml_text ,
lr_cnvpr_ncol TYPE REF TO if_ixml_node_collection ,
lv_string_tmp TYPE string ,
lv_string_fname TYPE string ,
lv_string_value TYPE string ,
lv_string_sqref TYPE string ,
lv_spans TYPE string ,
lv_name TYPE string ,
lv_value TYPE string ,
lv_min TYPE string ,
lv_max TYPE string ,
lv_index TYPE syindex ,
lv_subrc TYPE sysubrc ,
lv_x_char TYPE ty_char15 ,
lv_y_char TYPE ty_char15 ,
ls_relstab TYPE ty_s_relstab ,
lv_sheetpath TYPE string ,
lt_drawingrels TYPE ty_t_relstab ,
lv_drawingnumber TYPE string ,
lt_chartrels TYPE ty_t_relstab ,
ls_cells TYPE ty_s_cells ,
ls_nopgbrk_range TYPE ty_s_nopgbrk_range ,
lt_nopgbrk_range TYPE ty_t_nopgbrk_range .
FIELD-SYMBOLS:
<cells> TYPE ty_s_cells ,
<mergecells> TYPE ty_s_mergecells ,
<drawings> TYPE ty_s_drawings ,
<charts> TYPE ty_s_charts ,
<colprop> TYPE ty_s_colprop ,
<rowprop> TYPE ty_s_rowprop ,
<nopgbrk_range> TYPE ty_s_nopgbrk_range ,
<manual_pgbrk> TYPE ty_s_manual_pgbrk ,
<datavalid> TYPE ty_s_datavalid_rt ,
<coordinates> TYPE ty_s_coordinates ,
<value> TYPE ANY ,
<datasets> TYPE ty_s_datasets ,
<dataset_refs> TYPE ty_s_dataset_refs ,
<cellrng_name> TYPE ty_s_cellrng_name ,
<dataset_ref_fields> TYPE ty_s_dataset_ref_fields .

CONCATENATE v_text-t222 " -->> text: Sheet is being prepared


'(' s_sheets-name ')' INTO lv_string_tmp SEPARATED BY space .
progressbar( iv_text = lv_string_tmp ) .

lr_element-worksheet =
s_sheets-ixml_doc->find_from_name(
name = c_tag-worksheet
depth = 1 ) .
CHECK lr_element-worksheet IS BOUND .

*======================================================================
* set data dimension
*======================================================================
DO 1 TIMES .
lr_element-dimension =
s_sheets-ixml_doc->find_from_name(
name = c_tag-dimension
depth = 2 ) .
CHECK lr_element-dimension IS BOUND .

IF s_sheets-sheetdata_runtime-beg_x IS INITIAL
AND s_sheets-sheetdata_runtime-beg_y IS INITIAL
AND s_sheets-sheetdata_runtime-end_x IS INITIAL
AND s_sheets-sheetdata_runtime-end_y IS INITIAL .
lv_string_tmp = 'A1' .
ELSE .
conv_ref_nc( EXPORTING iv_beg_x = s_sheets-sheetdata_runtime-beg_x
iv_beg_y = s_sheets-sheetdata_runtime-beg_y
iv_end_x = s_sheets-sheetdata_runtime-end_x
iv_end_y = s_sheets-sheetdata_runtime-end_y
IMPORTING ev_ref = lv_string_tmp ) .
ENDIF .

lr_element-dimension->set_attribute(
name = c_tag-ref
value = lv_string_tmp ) .
ENDDO .

*======================================================================
* set active sheet
*======================================================================
DO 1 TIMES .
IF s_sheets-active IS NOT INITIAL
AND s_model-v_active_sheet_id IS INITIAL .
s_model-v_active_sheet_id = s_sheets-id .
ENDIF .

lr_element-sheetview =
s_sheets-ixml_doc->find_from_name(
name = c_tag-sheetview
depth = 3 ) .
CHECK lr_element-sheetview IS BOUND .

lr_element-sheetview->remove_attribute(
name = c_tag-tabselected ) .
ENDDO .

*======================================================================
* set outline level
*======================================================================
IF s_sheets-sheetdata_runtime-outlinelevelrow IS NOT INITIAL
OR s_sheets-sheetdata_runtime-outlinelevelcol IS NOT INITIAL .
lr_element-sheetformatpr =
s_sheets-ixml_doc->find_from_name(
name = c_tag-sheetformatpr
depth = 2 ) .

IF s_sheets-sheetdata_runtime-outlinelevelrow IS NOT INITIAL .


lv_string_tmp = s_sheets-sheetdata_runtime-outlinelevelrow .
CONDENSE lv_string_tmp NO-GAPS .
lr_element-sheetformatpr->set_attribute(
name = c_tag-outlinelevelrow
value = lv_string_tmp ) .
ENDIF .
IF s_sheets-sheetdata_runtime-outlinelevelcol IS NOT INITIAL .
lv_string_tmp = s_sheets-sheetdata_runtime-outlinelevelcol .
CONDENSE lv_string_tmp NO-GAPS .
lr_element-sheetformatpr->set_attribute(
name = c_tag-outlinelevelcol
value = lv_string_tmp ) .
ENDIF .
ENDIF .

*======================================================================
* set a tamper protection (if required)
*======================================================================
IF v_protect IS NOT INITIAL .
* compose a 'sheetProtection' node
lr_element-sheetprotection =
s_sheets-ixml_doc->create_element( name = c_tag-sheetprotection ) .
lr_element-sheetprotection->set_attribute( name = c_tag-password value =
'D692' ) . " pass: 1677718881
lr_element-sheetprotection->set_attribute( name = c_tag-sheet value =
'1' ) .
lr_element-sheetprotection->set_attribute( name = c_tag-objects value =
'1' ) .
lr_element-sheetprotection->set_attribute( name = c_tag-scenarios value =
'1' ) .

* insert composed element


xml_insert_element(
EXPORTING iv_name_element = c_tag-sheetprotection
ir_ixml_element = lr_element-sheetprotection
it_elemsequence = t_elemsequence_worksheet
CHANGING cr_ixml_parent = lr_element-worksheet ) .
ELSE .

CASE s_sheets-sheetdata_runtime-sheetprotection-mode .
WHEN c_sheetprotection_mode-off
OR c_sheetprotection_mode-from_template .
* ... do nothing
WHEN c_sheetprotection_mode-from_context
OR c_sheetprotection_mode-static .

* compose a 'sheetProtection' node


lr_element-sheetprotection =
s_sheets-ixml_doc->create_element( name = c_tag-sheetprotection ) .
IF s_sheets-sheetdata_runtime-sheetprotection-password IS NOT INITIAL .
lr_element-sheetprotection->set_attribute( name = c_tag-password
value = s_sheets-sheetdata_runtime-sheetprotection-password ) .
ENDIF .
lr_element-sheetprotection->set_attribute( name = c_tag-sheet
value = '1' ) .

CASE s_sheets-sheetdata_runtime-sheetprotection-selectlockedcells .
WHEN space OR '0' . lr_element-sheetprotection->set_attribute( name =
c_tag-selectlockedcells value = '1' ) .
ENDCASE .
CASE s_sheets-sheetdata_runtime-sheetprotection-selectunlockedcells .
WHEN space OR '0' . lr_element-sheetprotection->set_attribute( name =
c_tag-selectunlockedcells value = '1' ) .
ENDCASE .
CASE s_sheets-sheetdata_runtime-sheetprotection-formatcells .
WHEN space OR '0' .
WHEN OTHERS . lr_element-sheetprotection->set_attribute( name =
c_tag-formatcells value = '0' ) .
ENDCASE .
CASE s_sheets-sheetdata_runtime-sheetprotection-formatcolumns .
WHEN space OR '0' .
WHEN OTHERS . lr_element-sheetprotection->set_attribute( name =
c_tag-formatcolumns value = '0' ) .
ENDCASE .
CASE s_sheets-sheetdata_runtime-sheetprotection-formatrows .
WHEN space OR '0' .
WHEN OTHERS . lr_element-sheetprotection->set_attribute( name =
c_tag-formatrows value = '0' ) .
ENDCASE .
CASE s_sheets-sheetdata_runtime-sheetprotection-insertcolumns .
WHEN space OR '0' .
WHEN OTHERS . lr_element-sheetprotection->set_attribute( name =
c_tag-insertcolumns value = '0' ) .
ENDCASE .
CASE s_sheets-sheetdata_runtime-sheetprotection-insertrows .
WHEN space OR '0' .
WHEN OTHERS . lr_element-sheetprotection->set_attribute( name =
c_tag-insertrows value = '0' ) .
ENDCASE .
CASE s_sheets-sheetdata_runtime-sheetprotection-inserthyperlinks .
WHEN space OR '0' .
WHEN OTHERS . lr_element-sheetprotection->set_attribute( name =
c_tag-inserthyperlinks value = '0' ) .
ENDCASE .
CASE s_sheets-sheetdata_runtime-sheetprotection-deletecolumns .
WHEN space OR '0' .
WHEN OTHERS . lr_element-sheetprotection->set_attribute( name =
c_tag-deletecolumns value = '0' ) .
ENDCASE .
CASE s_sheets-sheetdata_runtime-sheetprotection-deleterows .
WHEN space OR '0' .
WHEN OTHERS . lr_element-sheetprotection->set_attribute( name =
c_tag-deleterows value = '0' ) .
ENDCASE .
CASE s_sheets-sheetdata_runtime-sheetprotection-sort .
WHEN space OR '0' .
WHEN OTHERS . lr_element-sheetprotection->set_attribute( name =
c_tag-sort value = '0' ) .
ENDCASE .
CASE s_sheets-sheetdata_runtime-sheetprotection-autofilter .
WHEN space OR '0' .
WHEN OTHERS . lr_element-sheetprotection->set_attribute( name =
c_tag-autofilter value = '0' ) .
ENDCASE .
CASE s_sheets-sheetdata_runtime-sheetprotection-pivottables .
WHEN space OR '0' .
WHEN OTHERS . lr_element-sheetprotection->set_attribute( name =
c_tag-pivottables value = '0' ) .
ENDCASE .
CASE s_sheets-sheetdata_runtime-sheetprotection-objects .
WHEN space OR '0' . lr_element-sheetprotection->set_attribute( name =
c_tag-objects value = '1' ) .
ENDCASE .
CASE s_sheets-sheetdata_runtime-sheetprotection-scenarios .
WHEN space OR '0' . lr_element-sheetprotection->set_attribute( name =
c_tag-scenarios value = '1' ) .
ENDCASE .

* insert composed element


xml_insert_element(
EXPORTING iv_name_element = c_tag-sheetprotection
ir_ixml_element = lr_element-sheetprotection
it_elemsequence = t_elemsequence_worksheet
CHANGING cr_ixml_parent = lr_element-worksheet ) .
ENDCASE .
ENDIF .

*======================================================================
* set drawings
*======================================================================
IF s_sheets-sheetdata_runtime-t_drawings[] IS NOT INITIAL .

* SHEET: compose a 'drawing' node


lr_element-drawing =
s_sheets-ixml_doc->create_element(
name = c_tag-drawing ) .

lv_string_tmp = s_sheets-id .
lr_element-drawing->set_attribute(
name = c_tag-id
namespace = c_tag-r
value = lv_string_tmp ) .
* insert element
xml_insert_element(
EXPORTING iv_name_element = c_tag-drawing
ir_ixml_element = lr_element-drawing
it_elemsequence = t_elemsequence_worksheet
CHANGING cr_ixml_parent = lr_element-worksheet ) .

* SHEET RELATIONS: prepare


CLEAR ls_relstab .
ls_relstab-id = s_sheets-id .
ls_relstab-type = c_contenttype-wb_drawing .
CONCATENATE c_path-drawingsfolder_ '/drawing' s_sheets-num '.xml'
INTO ls_relstab-target .
CONDENSE ls_relstab-target .
APPEND ls_relstab TO s_sheets-sheetdata_runtime-t_sheetrels[] .

* DRAWING: create XML-document


lr_ixml = cl_ixml=>create( ) .
lr_ixml_doc_drawing = lr_ixml->create_document( ) .

* DRAWING: add root node


lr_element-wsdr =
lr_ixml_doc_drawing->create_simple_element(
name = c_tag-wsdr namespace = c_tag-xdr parent =
lr_ixml_doc_drawing ).
lr_element-wsdr->set_attribute( name = c_tag-xdr namespace = c_tag-xmlns
value = c_contenttype-wb_drawings ) .
lr_element-wsdr->set_attribute( name = c_tag-a namespace = c_tag-xmlns
value = c_contenttype-wb_drawings_main ) .

CLEAR lv_drawingnumber .
LOOP AT s_sheets-sheetdata_runtime-t_drawings[] ASSIGNING <drawings> .
CASE <drawings>-drawing_type .
WHEN c_drawing_type-vector "= V e c t o r g r a p h i c s
==========================
OR c_drawing_type-chart . "= C h a r t
==============================================
* -----[ /xl/drawings/drawingXXX.xml ] copy 'twoCellAnchor' node as it
was in the template,
* and overwrite dataset references,
* runtime location coordinates,
etc.
lr_node-twocellanchor = <drawings>-twocellanchor_node->clone( ) .
lr_element-twocellanchor ?= lr_node-twocellanchor-
>query_interface( ixml_iid_element ) .

* -----< xdr:from >


lr_element-from = lr_element-twocellanchor->find_from_name(
name = c_tag-from namespace = c_tag-xdr depth = 2
) .
lr_element-any = lr_element-from->find_from_name(
name = c_tag-col namespace = c_tag-xdr depth = 1
) .
lv_string_tmp = <drawings>-beg_x . CONDENSE lv_string_tmp .
lr_element-any->set_value( value = lv_string_tmp ) .
lr_element-any = lr_element-from->find_from_name(
name = c_tag-coloff namespace = c_tag-xdr depth = 1
) .
lr_element-any->set_value( value = '0' ) .
lr_element-any = lr_element-from->find_from_name(
name = c_tag-row namespace = c_tag-xdr depth = 1
) .
lv_string_tmp = <drawings>-beg_y . CONDENSE lv_string_tmp .
lr_element-any->set_value( value = lv_string_tmp ) .
lr_element-any = lr_element-from->find_from_name(
name = c_tag-rowoff namespace = c_tag-xdr depth = 1
) .
lr_element-any->set_value( value = '0' ) .

IF <drawings>-drawing_size_h EQ 0
AND <drawings>-drawing_size_w EQ 0 .
* -----< xdr:to >
lr_element-to = lr_element-twocellanchor->find_from_name(
name = c_tag-to namespace = c_tag-xdr depth =
2 ) .
lr_element-any = lr_element-to->find_from_name(
name = c_tag-col namespace = c_tag-xdr depth =
1 ) .
lv_string_tmp = <drawings>-end_x . CONDENSE lv_string_tmp .
lr_element-any->set_value( value = lv_string_tmp ) .
lr_element-any = lr_element-to->find_from_name(
name = c_tag-coloff namespace = c_tag-xdr depth =
1 ) .
lr_element-any->set_value( value = '0' ) .
lr_element-any = lr_element-to->find_from_name(
name = c_tag-row namespace = c_tag-xdr depth =
1 ) .
lv_string_tmp = <drawings>-end_y . CONDENSE lv_string_tmp .
lr_element-any->set_value( value = lv_string_tmp ) .
lr_element-any = lr_element-to->find_from_name(
name = c_tag-rowoff namespace = c_tag-xdr depth =
1 ) .
lr_element-any->set_value( value = '0' ) .
ELSE .
lr_element-to = lr_element-twocellanchor->find_from_name(
name = c_tag-to namespace = c_tag-xdr depth =
2 ) .
* -----< xdr:ext >
lr_element-ext = lr_ixml_doc_drawing->create_element(
name = c_tag-ext namespace = c_tag-xdr ) .
lv_string_tmp = <drawings>-drawing_size_w . CONDENSE lv_string_tmp .
lr_element-ext->set_attribute( name = c_tag-cx value =
lv_string_tmp ) .
lv_string_tmp = <drawings>-drawing_size_h . CONDENSE lv_string_tmp .
lr_element-ext->set_attribute( name = c_tag-cy value =
lv_string_tmp ) .

* rename twocellanchor by onecellanchor


lr_node-twocellanchor->set_name( name = c_tag-onecellanchor ) .

* replace
lr_node-to ?= lr_element-to .
lr_node-ext ?= lr_element-ext .
lr_node-twocellanchor->replace_child(
old_child = lr_node-to new_child = lr_node-ext ) .
ENDIF .

* -----< xdr:cNvPr >


lr_cnvpr_ncol =
lr_element-twocellanchor->get_elements_by_tag_name( name = c_tag-cnvpr
namespace = c_tag-xdr ) .
CHECK lr_cnvpr_ncol IS BOUND .
DO .
lv_index = sy-index - 1 .
lr_node-cnvpr = lr_cnvpr_ncol->get_item( index = lv_index ) .
IF lr_node-cnvpr IS INITIAL. EXIT. ENDIF .
lr_element-cnvpr ?= lr_node-cnvpr-
>query_interface( ixml_iid_element ) .

ADD 1 TO lv_drawingnumber . CONDENSE lv_drawingnumber .


CONCATENATE 'Object_' lv_drawingnumber INTO lv_string_tmp .
lr_element-cnvpr->set_attribute( name = c_tag-name value =
lv_string_tmp ) .
lr_element-cnvpr->set_attribute( name = c_tag-id value =
lv_drawingnumber ) .
ENDDO .

* -----
IF <drawings>-drawing_type EQ c_drawing_type-chart .
READ TABLE s_model-t_charts ASSIGNING <charts> WITH TABLE KEY id =
<drawings>-refer_id .
CHECK sy-subrc EQ 0 .
* -----[ prepare paths ]
CONCATENATE c_path-chartsfolder_ '/chart' <drawings>-refer_id
'.xml' INTO <charts>-chart_path_ .
CONCATENATE c_path-chartsfolder '/chart' <drawings>-refer_id
'.xml' INTO <charts>-chart_path .
CONCATENATE c_path-chartsfolder '/style' <drawings>-refer_id
'.xml' INTO <charts>-chartstyle_path .
CONCATENATE c_path-chartsfolder '/colors' <drawings>-refer_id
'.xml' INTO <charts>-chartcolors_path .
* -----[ /xl/drawings/_rels/drawingXXX.xml.rels ]
CONCATENATE 'rId' <drawings>-refer_id INTO ls_relstab-id .
ls_relstab-type = c_contenttype-wb_chart .
ls_relstab-target = <charts>-chart_path_ .
COLLECT ls_relstab INTO lt_drawingrels[] .

* -----< c:chart >


lr_element-chart = lr_element-twocellanchor->find_from_name(
name = c_tag-chart namespace = c_tag-c depth = 4
) .
CONCATENATE 'rId' <drawings>-refer_id INTO lv_string_tmp .
lr_element-chart->set_attribute( name = c_tag-id namespace = c_tag-r
value = lv_string_tmp ) .
ENDIF .
* -----
lr_element-wsdr->append_child( new_child = lr_node-twocellanchor ) .

WHEN c_drawing_type-bitmap . "= B i t m a p g r a p h i c s


==========================

* -----[ /xl/drawings/_rels/drawingXXX.xml.rels ]
CONCATENATE 'rId' <drawings>-refer_id INTO ls_relstab-id .
ls_relstab-type = c_contenttype-wb_image .
CONCATENATE c_path-mediafolder_ '/image' <drawings>-refer_id '.jpeg'
INTO ls_relstab-target .
COLLECT ls_relstab INTO lt_drawingrels[] .

* -----[ /xl/drawings/drawingXXX.xml ] Build 'twoCellAnchor' node


manually

IF <drawings>-drawing_size_h EQ 0
AND <drawings>-drawing_size_w EQ 0 .
* -----< xdr:twoCellAnchor >
lr_element-twocellanchor = lr_ixml_doc_drawing-
>create_simple_element(
name = c_tag-twocellanchor namespace = c_tag-xdr parent =
lr_element-wsdr ) .
ELSE .
* -----< xdr:oneCellAnchor >
lr_element-twocellanchor = lr_ixml_doc_drawing-
>create_simple_element(
name = c_tag-onecellanchor namespace = c_tag-xdr parent =
lr_element-wsdr ) .
ENDIF .
* -----< xdr:from >
lr_element-from = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-from namespace = c_tag-xdr parent = lr_element-
twocellanchor ) .
lv_string_tmp = <drawings>-beg_x . CONDENSE lv_string_tmp .
lr_ixml_doc_drawing->create_simple_element(
name = c_tag-col namespace = c_tag-xdr value = lv_string_tmp
parent = lr_element-from ) .
lr_ixml_doc_drawing->create_simple_element(
name = c_tag-coloff namespace = c_tag-xdr value = '0' parent =
lr_element-from ) .
lv_string_tmp = <drawings>-beg_y . CONDENSE lv_string_tmp .
lr_ixml_doc_drawing->create_simple_element(
name = c_tag-row namespace = c_tag-xdr value = lv_string_tmp
parent = lr_element-from ) .
lr_ixml_doc_drawing->create_simple_element(
name = c_tag-rowoff namespace = c_tag-xdr value = '0' parent =
lr_element-from ) .

IF <drawings>-drawing_size_h EQ 0
AND <drawings>-drawing_size_w EQ 0 .
* -----< xdr:to >
lr_element-to = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-to namespace = c_tag-xdr parent = lr_element-
twocellanchor ) .
lv_string_tmp = <drawings>-end_x . CONDENSE lv_string_tmp .
lr_ixml_doc_drawing->create_simple_element(
name = c_tag-col namespace = c_tag-xdr value = lv_string_tmp
parent = lr_element-to ) .
lr_ixml_doc_drawing->create_simple_element(
name = c_tag-coloff namespace = c_tag-xdr value = '0' parent =
lr_element-to ) .
lv_string_tmp = <drawings>-end_y . CONDENSE lv_string_tmp .
lr_ixml_doc_drawing->create_simple_element(
name = c_tag-row namespace = c_tag-xdr value = lv_string_tmp
parent = lr_element-to ) .
lr_ixml_doc_drawing->create_simple_element(
name = c_tag-rowoff namespace = c_tag-xdr value = '0' parent =
lr_element-to ) .
ELSE .
* -----< xdr:ext >
lr_element-ext = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-ext namespace = c_tag-xdr parent = lr_element-
twocellanchor ) .
lv_string_tmp = <drawings>-drawing_size_w . CONDENSE lv_string_tmp .
lr_element-ext->set_attribute( name = c_tag-cx value =
lv_string_tmp ) .
lv_string_tmp = <drawings>-drawing_size_h . CONDENSE lv_string_tmp .
lr_element-ext->set_attribute( name = c_tag-cy value =
lv_string_tmp ) .
ENDIF .

* -----< xdr:pic >


lr_element-pic = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-pic namespace = c_tag-xdr parent = lr_element-
twocellanchor ) .
* -----====
lr_element-nvpicpr = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-nvpicpr namespace = c_tag-xdr parent = lr_element-
pic ) .
lr_element-cnvpr = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-cnvpr namespace = c_tag-xdr parent = lr_element-
nvpicpr ) .
ADD 1 TO lv_drawingnumber . CONDENSE lv_drawingnumber .
CONCATENATE 'Object_' lv_drawingnumber INTO lv_string_tmp .
lr_element-cnvpr->set_attribute( name = c_tag-id value =
lv_drawingnumber ) .
lr_element-cnvpr->set_attribute( name = c_tag-name value =
lv_string_tmp ) .
lr_element-cnvpr->set_attribute( name = c_tag-descr value =
lv_string_tmp ) .
lr_element-cnvpicpr = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-cnvpicpr namespace = c_tag-xdr parent = lr_element-
nvpicpr ) .
lr_element-piclocks = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-piclocks namespace = c_tag-a parent = lr_element-
cnvpicpr ) .
lr_element-piclocks->set_attribute( name = c_tag-nochangeaspect
value = '1' ) .
* -----====
lr_element-blipfill = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-blipfill namespace = c_tag-xdr parent = lr_element-
pic ) .
lr_element-blip = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-blip namespace = c_tag-a parent = lr_element-
blipfill ) .
lr_element-blip->set_attribute( name = c_tag-r namespace = c_tag-xmlns
value = c_contenttype-wb ) .
lr_element-blip->set_attribute( name = c_tag-embed namespace = c_tag-r
value = ls_relstab-id ) .
lr_element-stretch = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-stretch namespace = c_tag-a parent = lr_element-
blipfill ) .
lr_ixml_doc_drawing->create_simple_element(
name = c_tag-fillrect namespace = c_tag-a parent = lr_element-
stretch ) .
* -----====
lr_element-sppr = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-sppr namespace = c_tag-xdr parent = lr_element-
pic ) .
lr_element-xfrm = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-xfrm namespace = c_tag-a parent = lr_element-sppr )
.
lr_element-off = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-off namespace = c_tag-a parent = lr_element-
xfrm ) .
lr_element-off->set_attribute( name = c_tag-x value = '0' ) .
lr_element-off->set_attribute( name = c_tag-y value = '0' ) .
lr_element-ext = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-ext namespace = c_tag-a parent = lr_element-
xfrm ) .
lr_element-ext->set_attribute( name = c_tag-cx value = '0' ) .
lr_element-ext->set_attribute( name = c_tag-cy value = '0' ) .
lr_element-prstgeom = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-prstgeom namespace = c_tag-a parent = lr_element-
sppr ) .
lr_element-prstgeom->set_attribute( name = c_tag-prst value = c_tag-
rect ) .
lr_ixml_doc_drawing->create_simple_element(
name = c_tag-avlst namespace = c_tag-a parent = lr_element-
prstgeom ) .
* -----
lr_element-clientdata = lr_ixml_doc_drawing->create_simple_element(
name = c_tag-clientdata namespace = c_tag-xdr parent =
lr_element-twocellanchor ) .
ENDCASE .
ENDLOOP .

*============ drawing
CONCATENATE c_path-drawingsfolder '/drawing' s_sheets-num '.xml'
INTO s_sheets-sheetdata_runtime-drawing_path .
CONDENSE s_sheets-sheetdata_runtime-drawing_path .

xml_save( iv_path = s_sheets-sheetdata_runtime-drawing_path


iv_ixml_doc = lr_ixml_doc_drawing ) .
FREE lr_ixml_doc_drawing .

*============ drawing relations


xml_relstab_set( iv_path = s_sheets-sheetdata_runtime-drawing_path
it_relstab = lt_drawingrels[] ) .
ENDIF .

*======================================================================
* optimize no-Page-Break areas
*======================================================================
SORT s_sheets-sheetdata_runtime-t_nopgbrk_range
BY top beg_y end_y
left beg_x end_x .
DELETE ADJACENT DUPLICATES FROM s_sheets-sheetdata_runtime-t_nopgbrk_range
COMPARING ALL FIELDS .

LOOP AT s_sheets-sheetdata_runtime-t_nopgbrk_range INTO ls_nopgbrk_range .


LOOP AT lt_nopgbrk_range ASSIGNING <nopgbrk_range>
WHERE top EQ ls_nopgbrk_range-top
AND beg_y LE ls_nopgbrk_range-end_y
AND end_y GE ls_nopgbrk_range-beg_y
AND left EQ ls_nopgbrk_range-left
AND beg_x LE ls_nopgbrk_range-end_x
AND end_x GE ls_nopgbrk_range-beg_x .
IF <nopgbrk_range>-beg_y GT ls_nopgbrk_range-beg_y .
<nopgbrk_range>-beg_y = ls_nopgbrk_range-beg_y .
ENDIF .
IF <nopgbrk_range>-end_y LT ls_nopgbrk_range-end_y .
<nopgbrk_range>-end_y = ls_nopgbrk_range-end_y .
ENDIF .
IF <nopgbrk_range>-beg_x GT ls_nopgbrk_range-beg_x .
<nopgbrk_range>-beg_x = ls_nopgbrk_range-beg_x .
ENDIF .
IF <nopgbrk_range>-end_x LT ls_nopgbrk_range-end_x .
<nopgbrk_range>-end_x = ls_nopgbrk_range-end_x .
ENDIF .
ENDLOOP .
CHECK sy-subrc NE 0 .

APPEND ls_nopgbrk_range TO lt_nopgbrk_range .


ENDLOOP .

s_sheets-sheetdata_runtime-t_nopgbrk_range[] = lt_nopgbrk_range[] .

*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
*======================================================================
* According SAP NOTE 1229110 (Lack of memory when working with large amounts of
XML data),
* here we implement step-by-step (by piecemeal) rendering of XML-file
*
*----------------------------------------------------------------------
* NOW we have XML-DOM prepared above, we'll use it as Dummy-XML.
* NEXT, we perform the following steps:
*
* 1) render the Dummy-XML to Xstring
* 2) split rendered Dummy-XML-Xstring into several substrings (parts)
* at tags of nodes, which expecting large amount of data
* 3) render large data nodes to it's own substrings
* 4) concatenate all gotten substrings into whole XML-file Xstring
* and save in into ZIP-folder
*======================================================================
*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

DATA:
lr_streamfactory TYPE REF TO if_ixml_stream_factory ,
lr_ostream TYPE REF TO if_ixml_ostream ,
lr_encoding TYPE REF TO if_ixml_encoding ,
lr_renderer TYPE REF TO if_ixml_renderer .
DATA:
lv_bookmark_string TYPE string ,
lv_bookmark_xstring TYPE xstring ,
lv_bookmark_offset TYPE i ,
lv_bookmark_length TYPE i ,
lv_xml_xstring TYPE xstring ,
BEGIN OF ls_ostream_xstring ,
cols1 TYPE xstring ,
cols2 TYPE xstring ,
rows1 TYPE xstring ,
rows2 TYPE xstring ,
merg1 TYPE xstring ,
merg2 TYPE xstring ,
rbrk1 TYPE xstring ,
rbrk2 TYPE xstring ,
cbrk1 TYPE xstring ,
cbrk2 TYPE xstring ,
dtvl1 TYPE xstring ,
dtvl2 TYPE xstring ,
tail TYPE xstring ,
END OF ls_ostream_xstring .
CONSTANTS:
BEGIN OF lc_tag_bookmark ,
cols TYPE string VALUE 'BmarkCols' , " '<BmarkCols/>'
rows TYPE string VALUE 'BmarkRows' , " '<BmarkRows/>'
merg TYPE string VALUE 'BmarkMerg' , " '<BmarkMerg/>'
rbrk TYPE string VALUE 'BmarkRbrk' , " '<BmarkRbrk/>'
cbrk TYPE string VALUE 'BmarkCbrk' , " '<BmarkCbrk/>'
dtvl TYPE string VALUE 'BmarkDtvl' , " '<BmarkDtvl/>'
END OF lc_tag_bookmark .

*======================================================================
* 0) Supplement of Dummy-XML:
* Insert nodes (which expect large amount of data).
* Each of that nodes contain single children bookmark-node.
* In further, this bookmark-node will be used for splitting XML-Xstring
*======================================================================

* insert node 'cols' with children bookmark-node 'BmarkCols'


IF s_sheets-sheetdata_runtime-t_colprop[] IS NOT INITIAL .
lr_element-cols =
s_sheets-ixml_doc->create_element( name = c_tag-cols ) .
s_sheets-ixml_doc->create_simple_element( name = lc_tag_bookmark-cols parent
= lr_element-cols ) .

xml_insert_element(
EXPORTING iv_name_element = c_tag-cols
ir_ixml_element = lr_element-cols
it_elemsequence = t_elemsequence_worksheet
CHANGING cr_ixml_parent = lr_element-worksheet ) .
ENDIF .

* insert node 'sheetData' with children bookmark-node 'BmarkRows'


FREE lr_element-sheetdata .
lr_element-sheetdata =
s_sheets-ixml_doc->find_from_name( name = c_tag-sheetdata depth = 2 ) .
s_sheets-ixml_doc->create_simple_element( name = lc_tag_bookmark-rows parent =
lr_element-sheetdata ) .

* insert node 'mergeCells' with children bookmark-node 'BmarkMerg'


IF s_sheets-sheetdata_runtime-t_mergecells[] IS NOT INITIAL .
lr_element-mergecells =
s_sheets-ixml_doc->create_element( name = c_tag-mergecells ) .

lv_string_tmp = LINES( s_sheets-sheetdata_runtime-t_mergecells ) . CONDENSE


lv_string_tmp .
lr_element-mergecells->set_attribute( name = c_tag-count value =
lv_string_tmp ) .

s_sheets-ixml_doc->create_simple_element( name = lc_tag_bookmark-merg parent


= lr_element-mergecells ) .

xml_insert_element(
EXPORTING iv_name_element = c_tag-mergecells
ir_ixml_element = lr_element-mergecells
it_elemsequence = t_elemsequence_worksheet
CHANGING cr_ixml_parent = lr_element-worksheet ) .
ENDIF .

* insert node 'rowBreaks' with children bookmark-node 'BmarkRbrk'


IF s_sheets-sheetdata_runtime-t_manual_pgbrk_row[] IS NOT INITIAL .
SORT s_sheets-sheetdata_runtime-t_manual_pgbrk_row BY id .
DELETE ADJACENT DUPLICATES FROM s_sheets-sheetdata_runtime-t_manual_pgbrk_row
COMPARING ALL FIELDS .

lr_element-rowbreaks =
s_sheets-ixml_doc->create_element( name = c_tag-rowbreaks ) .

lv_string_tmp = LINES( s_sheets-sheetdata_runtime-t_manual_pgbrk_row[] ) .


CONDENSE lv_string_tmp .
lr_element-rowbreaks->set_attribute( name = c_tag-count value =
lv_string_tmp ) .
lr_element-rowbreaks->set_attribute( name = c_tag-manualbreakcount value =
lv_string_tmp ) .

s_sheets-ixml_doc->create_simple_element( name = lc_tag_bookmark-rbrk parent


= lr_element-rowbreaks ) .

xml_insert_element(
EXPORTING iv_name_element = c_tag-rowbreaks
ir_ixml_element = lr_element-rowbreaks
it_elemsequence = t_elemsequence_worksheet
CHANGING cr_ixml_parent = lr_element-worksheet ) .
ENDIF .

* insert node 'colBreaks' with children bookmark-node 'BmarkCbrk'


IF s_sheets-sheetdata_runtime-t_manual_pgbrk_col[] IS NOT INITIAL .
SORT s_sheets-sheetdata_runtime-t_manual_pgbrk_col BY id .
DELETE ADJACENT DUPLICATES FROM s_sheets-sheetdata_runtime-t_manual_pgbrk_col
COMPARING ALL FIELDS .

lr_element-colbreaks =
s_sheets-ixml_doc->create_element( name = c_tag-colbreaks ) .

lv_string_tmp = LINES( s_sheets-sheetdata_runtime-t_manual_pgbrk_col[] ) .


CONDENSE lv_string_tmp .
lr_element-colbreaks->set_attribute( name = c_tag-count value =
lv_string_tmp ) .
lr_element-colbreaks->set_attribute( name = c_tag-manualbreakcount value =
lv_string_tmp ) .

s_sheets-ixml_doc->create_simple_element( name = lc_tag_bookmark-cbrk parent


= lr_element-colbreaks ) .

xml_insert_element(
EXPORTING iv_name_element = c_tag-colbreaks
ir_ixml_element = lr_element-colbreaks
it_elemsequence = t_elemsequence_worksheet
CHANGING cr_ixml_parent = lr_element-worksheet ) .
ENDIF .

* insert node 'dataValidations' with children bookmark-node 'BmarkDtvl'


LOOP AT s_sheets-sheetdata_runtime-t_datavalid[] ASSIGNING <datavalid> .
CHECK <datavalid>-t_coordinates[] IS INITIAL .
DELETE s_sheets-sheetdata_runtime-t_datavalid[] .
ENDLOOP .

IF s_sheets-sheetdata_runtime-t_datavalid[] IS NOT INITIAL .


lr_element-datavalidations =
s_sheets-ixml_doc->create_element( name = c_tag-datavalidations ) .

lv_string_tmp = LINES( s_sheets-sheetdata_runtime-t_datavalid[] ) . CONDENSE


lv_string_tmp .
lr_element-datavalidations->set_attribute( name = c_tag-count value =
lv_string_tmp ) .

s_sheets-ixml_doc->create_simple_element( name = lc_tag_bookmark-dtvl parent


= lr_element-datavalidations ) .

xml_insert_element(
EXPORTING iv_name_element = c_tag-datavalidations
ir_ixml_element = lr_element-datavalidations
it_elemsequence = t_elemsequence_worksheet
CHANGING cr_ixml_parent = lr_element-worksheet ) .
ENDIF .

*======================================================================
* 1) render the Dummy-XML to Xstring
*======================================================================
s_sheets-ixml_doc->set_standalone( standalone = abap_true ).
lr_ixml = cl_ixml=>create( ) .
lr_streamfactory = lr_ixml->create_stream_factory( ) .
lr_ostream = lr_streamfactory->create_ostream_xstring( string =
ls_ostream_xstring-tail ) .
lr_encoding = lr_ixml->create_encoding( character_set = c_character_set
byte_order = 0 ) .
lr_ostream->set_encoding( encoding = lr_encoding ) .
lr_renderer = lr_ixml->create_renderer( ostream = lr_ostream
document = s_sheets-ixml_doc ) .
lr_renderer->render( ) .

lr_ostream->close( ) .
FREE lr_ostream .
FREE lr_encoding .
FREE lr_ostream .
FREE lr_streamfactory .
FREE lr_ixml .

*======================================================================
* 2) split rendered Dummy-XML-Xstring (at bookmarks) into several parts
*======================================================================
DO .
lv_index = sy-index .
CASE lv_index .
WHEN 1 . lv_bookmark_string = lc_tag_bookmark-cols .
WHEN 2 . lv_bookmark_string = lc_tag_bookmark-rows .
WHEN 3 . lv_bookmark_string = lc_tag_bookmark-merg .
WHEN 4 . lv_bookmark_string = lc_tag_bookmark-rbrk .
WHEN 5 . lv_bookmark_string = lc_tag_bookmark-cbrk .
WHEN 6 . lv_bookmark_string = lc_tag_bookmark-dtvl .
WHEN OTHERS . EXIT .
ENDCASE .

CONCATENATE '<' lv_bookmark_string '/>' INTO lv_bookmark_string . " -->>


bookmark
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = lv_bookmark_string
IMPORTING
buffer = lv_bookmark_xstring
EXCEPTIONS
OTHERS = 0.

CLEAR lv_bookmark_offset .
FIND lv_bookmark_xstring IN ls_ostream_xstring-tail
MATCH OFFSET lv_bookmark_offset IN BYTE MODE .

CHECK sy-subrc EQ 0
AND lv_bookmark_offset NE 0 .
CASE lv_index .
WHEN 1 . ls_ostream_xstring-cols1 = ls_ostream_xstring-
tail(lv_bookmark_offset) .
WHEN 2 . ls_ostream_xstring-rows1 = ls_ostream_xstring-
tail(lv_bookmark_offset) .
WHEN 3 . ls_ostream_xstring-merg1 = ls_ostream_xstring-
tail(lv_bookmark_offset) .
WHEN 4 . ls_ostream_xstring-rbrk1 = ls_ostream_xstring-
tail(lv_bookmark_offset) .
WHEN 5 . ls_ostream_xstring-cbrk1 = ls_ostream_xstring-
tail(lv_bookmark_offset) .
WHEN 6 . ls_ostream_xstring-dtvl1 = ls_ostream_xstring-
tail(lv_bookmark_offset) .
WHEN OTHERS . EXIT .
ENDCASE .

lv_bookmark_length = XSTRLEN( lv_bookmark_xstring ) .


ADD lv_bookmark_length TO lv_bookmark_offset .
ls_ostream_xstring-tail = ls_ostream_xstring-tail+lv_bookmark_offset .
ENDDO .

*======================================================================
* 3) render large data nodes to its own substrings
*======================================================================

*============ SET PROPERTIES OF COLUMNS


IF s_sheets-sheetdata_runtime-t_colprop[] IS NOT INITIAL .

lr_ixml = cl_ixml=>create( ) .
lr_streamfactory = lr_ixml->create_stream_factory( ) .
lr_ostream = lr_streamfactory->create_ostream_xstring( string =
ls_ostream_xstring-cols2 ) .
lr_encoding = lr_ixml->create_encoding( character_set = c_character_set
byte_order = 0 ) .
lr_ostream->set_encoding( encoding = lr_encoding ) .

TYPES: BEGIN OF ty_s_colprop_meta .


INCLUDE TYPE ty_s_colprop .
TYPES: _x TYPE i .
TYPES: END OF ty_s_colprop_meta .
TYPES: ty_t_colprop_meta TYPE STANDARD TABLE OF ty_s_colprop_meta .
FIELD-SYMBOLS: <colprop_meta> TYPE ty_s_colprop_meta .
DATA: lt_colprop_meta TYPE ty_t_colprop_meta .

LOOP AT s_sheets-sheetdata_runtime-t_colprop ASSIGNING <colprop> .


APPEND INITIAL LINE TO lt_colprop_meta ASSIGNING <colprop_meta> .
MOVE-CORRESPONDING <colprop> TO <colprop_meta> .
<colprop_meta>-_x = <colprop_meta>-x .
CLEAR <colprop_meta>-x .
ENDLOOP .

LOOP AT lt_colprop_meta ASSIGNING <colprop_meta> .


AT NEW collapsed .
lv_min = <colprop_meta>-_x .
ENDAT .

AT END OF collapsed .
lv_max = <colprop_meta>-_x .

lr_element-col =
s_sheets-ixml_doc->create_element( name = c_tag-col ) .
CONDENSE lv_min NO-GAPS .
lr_element-col->set_attribute( name = c_tag-min value = lv_min ) .
CONDENSE lv_max NO-GAPS .
lr_element-col->set_attribute( name = c_tag-max value = lv_max ) .
DO 7 TIMES .
CASE sy-index .
WHEN 1 . lv_value = <colprop_meta>-width . lv_name = c_tag-
width .
WHEN 2 . lv_value = <colprop_meta>-style . lv_name = c_tag-
style .
WHEN 3 . lv_value = <colprop_meta>-hidden . lv_name = c_tag-
hidden .
WHEN 4 . lv_value = <colprop_meta>-bestfit . lv_name = c_tag-
bestfit .
WHEN 5 . lv_value = <colprop_meta>-customwidth . lv_name = c_tag-
customwidth .
WHEN 6 . lv_value = <colprop_meta>-outlinelevel. lv_name = c_tag-
outlinelevel. CONDENSE lv_value NO-GAPS .
WHEN 7 . lv_value = <colprop_meta>-collapsed . lv_name = c_tag-
collapsed .
WHEN OTHERS . EXIT .
ENDCASE .
CHECK lv_value IS NOT INITIAL .
CHECK lv_name IS NOT INITIAL .

lr_element-col->set_attribute( name = lv_name value = lv_value ) .


ENDDO .

lr_element-col->render( ostream = lr_ostream recursive = abap_on ) .


lr_element-col->remove_node( ) .
ENDAT .
ENDLOOP .

lr_ostream->close( ) .
FREE lr_ostream .
FREE lr_encoding .
FREE lr_ostream .
FREE lr_streamfactory .
FREE lr_ixml .
CLEAR s_sheets-sheetdata_runtime-t_colprop[] .
FREE s_sheets-sheetdata_runtime-t_colprop[] .
ENDIF .

*============ SET ROWS/COLUMNS DATA (SHEETDATA)

lr_ixml = cl_ixml=>create( ) .
lr_streamfactory = lr_ixml->create_stream_factory( ) .
lr_ostream = lr_streamfactory->create_ostream_xstring( string =
ls_ostream_xstring-rows2 ) .
lr_encoding = lr_ixml->create_encoding( character_set = c_character_set
byte_order = 0 ) .
lr_ostream->set_encoding( encoding = lr_encoding ) .

* add technical cells (with zero columns)


CLEAR ls_cells .
LOOP AT s_sheets-sheetdata_runtime-t_rowprop ASSIGNING <rowprop> .
READ TABLE s_sheets-sheetdata_runtime-t_cells TRANSPORTING NO FIELDS
WITH KEY y = <rowprop>-y BINARY SEARCH .
CHECK sy-subrc NE 0 .
<rowprop>-is_empty = abap_on .

ls_cells-y = <rowprop>-y .
ls_cells-x = 0 .
INSERT ls_cells INTO TABLE s_sheets-sheetdata_runtime-t_cells .
ENDLOOP .

* calculate a formula of spans


lv_spans = s_sheets-sheetdata_runtime-beg_x .
lv_string_tmp = s_sheets-sheetdata_runtime-end_x .
CONCATENATE lv_spans ':' lv_string_tmp INTO lv_spans .
CONDENSE lv_spans NO-GAPS .

* process cells
CONCATENATE v_text-t222 " -->> text: Sheet is being prepared
'(' s_sheets-name ')'
v_text-t163 " -->> text: row(s)
INTO lv_string_tmp SEPARATED BY space .
progressbar_loop_init( iv_step = 777
iv_text = lv_string_tmp ) .

LOOP AT s_sheets-sheetdata_runtime-t_cells ASSIGNING <cells> .


AT NEW y .
progressbar_loop_actualize( ) .

READ TABLE s_sheets-sheetdata_runtime-t_rowprop


ASSIGNING <rowprop> WITH TABLE KEY y = <cells>-y .
lv_subrc = sy-subrc .

* add a new row


lr_element-row = s_sheets-ixml_doc->create_element( name = c_tag-row ) .

lv_string_tmp = <cells>-y . CONDENSE lv_string_tmp .


lr_element-row->set_attribute(
name = c_tag-r
value = lv_string_tmp ) .
lv_y_char = lv_string_tmp .

DO 1 TIMES .
IF lv_subrc EQ 0 .
CHECK <rowprop>-is_empty IS INITIAL .
ENDIF .
IF s_sheets-sheetdata_runtime-end_x GT 0 .
lr_element-row->set_attribute(
name = c_tag-spans
value = lv_spans ) .
ENDIF .
ENDDO .

* set properties of the row


IF lv_subrc EQ 0 .
DO 7 TIMES .
CASE sy-index .
WHEN 1 . lv_value = <rowprop>-s . lv_name = c_tag-s
.
WHEN 2 . lv_value = <rowprop>-customformat. lv_name = c_tag-
customformat.
WHEN 3 . lv_value = <rowprop>-ht . lv_name = c_tag-ht
.
WHEN 4 . lv_value = <rowprop>-customheight. lv_name = c_tag-
customheight.
WHEN 5 . lv_value = <rowprop>-hidden . lv_name = c_tag-hidden
.
WHEN 6 . lv_value = <rowprop>-outlinelevel. lv_name = c_tag-
outlinelevel. CONDENSE lv_value NO-GAPS .
WHEN 7 . lv_value = <rowprop>-collapsed . lv_name = c_tag-
collapsed .
WHEN OTHERS . EXIT .
ENDCASE .
CHECK lv_value IS NOT INITIAL .
CHECK lv_name IS NOT INITIAL .
lr_element-row->set_attribute( name = lv_name
value = lv_value ) .
ENDDO .
ENDIF .
ENDAT . " new Y

* add a new cell (into the the row)


IF <cells>-x IS NOT INITIAL .
lr_element-c =
s_sheets-ixml_doc->create_simple_element(
name = c_tag-c
parent = lr_element-row ) .

conv_nc( EXPORTING iv_number = <cells>-x


IMPORTING ev_char = lv_x_char ) .
CONCATENATE lv_x_char lv_y_char INTO lv_string_tmp .

lr_element-c->set_attribute(
name = c_tag-r
value = lv_string_tmp ) .

* set value and properties of the cell


IF <cells>-type IS NOT INITIAL .
lr_element-c->set_attribute(
name = c_tag-t
value = <cells>-type ) .
ENDIF .

IF <cells>-style IS NOT INITIAL .


lr_element-c->set_attribute(
name = c_tag-s
value = <cells>-style ) .
ENDIF .

IF <cells>-formula IS NOT INITIAL .


lr_text = s_sheets-ixml_doc->create_text( <cells>-formula ) .

lr_element-f =
s_sheets-ixml_doc->create_simple_element(
name = c_tag-f
parent = lr_element-c ) .
lr_element-f->append_child( lr_text ) .
ENDIF .

IF <cells>-value IS NOT INITIAL .


s_sheets-ixml_doc->create_simple_element(
name = c_tag-v
parent = lr_element-c
value = <cells>-value ) .
ENDIF .
ENDIF .

AT END OF y .
lr_element-row->render( ostream = lr_ostream recursive = abap_on ).
lr_element-row->remove_node( ) .
ENDAT .
ENDLOOP .

lr_ostream->close( ) .
FREE lr_ostream .
FREE lr_encoding .
FREE lr_ostream .
FREE lr_streamfactory .
FREE lr_ixml .
FREE s_sheets-sheetdata_runtime-t_cells[] .

*============ SET MERGED CELLS


IF s_sheets-sheetdata_runtime-t_mergecells[] IS NOT INITIAL .

lr_ixml = cl_ixml=>create( ) .
lr_streamfactory = lr_ixml->create_stream_factory( ) .
lr_ostream = lr_streamfactory->create_ostream_xstring( string =
ls_ostream_xstring-merg2 ) .
lr_encoding = lr_ixml->create_encoding( character_set = c_character_set
byte_order = 0 ) .
lr_ostream->set_encoding( encoding = lr_encoding ) .

LOOP AT s_sheets-sheetdata_runtime-t_mergecells ASSIGNING <mergecells> .


lr_element-mergecell = s_sheets-ixml_doc->create_element( name = c_tag-
mergecell ) .

conv_ref_nc( EXPORTING iv_beg_x = <mergecells>-beg_x


iv_beg_y = <mergecells>-beg_y
iv_end_x = <mergecells>-end_x
iv_end_y = <mergecells>-end_y
IMPORTING ev_ref = lv_string_tmp ) .

lr_element-mergecell->set_attribute(
name = c_tag-ref
value = lv_string_tmp ) .

lr_element-mergecell->render( ostream = lr_ostream recursive = abap_on ).


lr_element-mergecell->remove_node( ) .
ENDLOOP .

lr_ostream->close( ) .
FREE lr_ostream .
FREE lr_encoding .
FREE lr_ostream .
FREE lr_streamfactory .
FREE lr_ixml .
IF s_sheets-sheetdata_runtime-postprocessing_autofit IS INITIAL .
CLEAR s_sheets-sheetdata_runtime-t_mergecells[] .
FREE s_sheets-sheetdata_runtime-t_mergecells[] .
ENDIF .
ENDIF .

*============ INSERT MANUAL PAGE-BREAKS (ROWS)

IF s_sheets-sheetdata_runtime-t_manual_pgbrk_row[] IS NOT INITIAL .

lr_ixml = cl_ixml=>create( ) .
lr_streamfactory = lr_ixml->create_stream_factory( ) .
lr_ostream = lr_streamfactory->create_ostream_xstring( string =
ls_ostream_xstring-rbrk2 ) .
lr_encoding = lr_ixml->create_encoding( character_set = c_character_set
byte_order = 0 ) .
lr_ostream->set_encoding( encoding = lr_encoding ) .

LOOP AT s_sheets-sheetdata_runtime-t_manual_pgbrk_row ASSIGNING


<manual_pgbrk> .
lr_element-brk = s_sheets-ixml_doc->create_element( name = c_tag-brk ) .

lv_string_tmp = <manual_pgbrk>-id . CONDENSE lv_string_tmp .


lr_element-brk->set_attribute( name = c_tag-id value = lv_string_tmp ) .

lv_string_tmp = '16383' .
lr_element-brk->set_attribute( name = c_tag-max value = lv_string_tmp ) .

lv_string_tmp = '1' .
lr_element-brk->set_attribute( name = c_tag-man value = lv_string_tmp ) .

lr_element-brk->render( ostream = lr_ostream recursive = abap_on ).


lr_element-brk->remove_node( ) .
ENDLOOP .

lr_ostream->close( ) .
FREE lr_ostream .
FREE lr_encoding .
FREE lr_ostream .
FREE lr_streamfactory .
FREE lr_ixml .

CLEAR s_sheets-sheetdata_runtime-t_manual_pgbrk_row[] .
FREE s_sheets-sheetdata_runtime-t_manual_pgbrk_row[] .
ENDIF .

*============ INSERT MANUAL PAGE-BREAKS (COLUMNS)

IF s_sheets-sheetdata_runtime-t_manual_pgbrk_col[] IS NOT INITIAL .

lr_ixml = cl_ixml=>create( ) .
lr_streamfactory = lr_ixml->create_stream_factory( ) .
lr_ostream = lr_streamfactory->create_ostream_xstring( string =
ls_ostream_xstring-cbrk2 ) .
lr_encoding = lr_ixml->create_encoding( character_set = c_character_set
byte_order = 0 ) .
lr_ostream->set_encoding( encoding = lr_encoding ) .

LOOP AT s_sheets-sheetdata_runtime-t_manual_pgbrk_col ASSIGNING


<manual_pgbrk> .
lr_element-brk = s_sheets-ixml_doc->create_element( name = c_tag-brk ) .

lv_string_tmp = <manual_pgbrk>-id . CONDENSE lv_string_tmp .


lr_element-brk->set_attribute( name = c_tag-id value = lv_string_tmp ) .

lv_string_tmp = '1048575' .
lr_element-brk->set_attribute( name = c_tag-max value = lv_string_tmp ) .

lv_string_tmp = '1' .
lr_element-brk->set_attribute( name = c_tag-man value = lv_string_tmp ) .

lr_element-brk->render( ostream = lr_ostream recursive = abap_on ).


lr_element-brk->remove_node( ) .
ENDLOOP .

lr_ostream->close( ) .
FREE lr_ostream .
FREE lr_encoding .
FREE lr_ostream .
FREE lr_streamfactory .
FREE lr_ixml .
CLEAR s_sheets-sheetdata_runtime-t_manual_pgbrk_col[] .
FREE s_sheets-sheetdata_runtime-t_manual_pgbrk_col[] .
ENDIF .

*============ INSERT DATA VALIDATION INFO


IF s_sheets-sheetdata_runtime-t_datavalid[] IS NOT INITIAL .

lr_ixml = cl_ixml=>create( ) .
lr_streamfactory = lr_ixml->create_stream_factory( ) .
lr_ostream = lr_streamfactory->create_ostream_xstring( string =
ls_ostream_xstring-dtvl2 ) .
lr_encoding = lr_ixml->create_encoding( character_set = c_character_set
byte_order = 0 ) .
lr_ostream->set_encoding( encoding = lr_encoding ) .

LOOP AT s_sheets-sheetdata_runtime-t_datavalid[] ASSIGNING <datavalid> .

* element: dataValidation
lr_element-datavalidation = s_sheets-ixml_doc->create_element( name =
c_tag-datavalidation ) .

* attribute: sqref
CLEAR lv_string_sqref .
LOOP AT <datavalid>-t_coordinates ASSIGNING <coordinates> .

conv_ref_nc( EXPORTING iv_beg_x = <coordinates>-beg_x


iv_beg_y = <coordinates>-beg_y
iv_end_x = <coordinates>-end_x
iv_end_y = <coordinates>-end_y
IMPORTING ev_ref = lv_string_tmp ) .
IF lv_string_sqref IS INITIAL .
lv_string_sqref = lv_string_tmp .
ELSE .
CONCATENATE lv_string_sqref lv_string_tmp INTO lv_string_sqref
SEPARATED BY space .
ENDIF .
ENDLOOP .

* other attributes
DO .
CASE sy-index .
WHEN 1 . lv_string_fname = c_tag-allowblank .
WHEN 2 . lv_string_fname = c_tag-error .
WHEN 3 . lv_string_fname = c_tag-errorstyle .
WHEN 4 . lv_string_fname = c_tag-errortitle .
WHEN 5 . lv_string_fname = c_tag-imemode .
WHEN 6 . lv_string_fname = c_tag-operator .
WHEN 7 . lv_string_fname = c_tag-prompt .
WHEN 8 . lv_string_fname = c_tag-prompttitle .
WHEN 9 . lv_string_fname = c_tag-showdropdown .
WHEN 10 . lv_string_fname = c_tag-showerrormessage .
WHEN 11 . lv_string_fname = c_tag-showinputmessage .
WHEN 12 . lr_element-datavalidation->set_attribute( name = c_tag-
sqref value = lv_string_sqref ) . CONTINUE .
WHEN 13 . lv_string_fname = c_tag-type_ .
WHEN OTHERS . EXIT .
ENDCASE .

lv_string_tmp = lv_string_fname .
TRANSLATE lv_string_tmp TO UPPER CASE .
ASSIGN COMPONENT lv_string_tmp OF STRUCTURE <datavalid> TO <value> .
CHECK <value> IS ASSIGNED .
CHECK <value> IS NOT INITIAL .

lv_string_value = <value> .
lr_element-datavalidation->set_attribute( name = lv_string_fname
value = lv_string_value ) .
ENDDO .

* element: formula1
IF <datavalid>-formula1_dataset_id IS NOT INITIAL .
DO 1 TIMES .
READ TABLE s_model-t_datasets ASSIGNING <datasets> WITH TABLE KEY id =
<datavalid>-formula1_dataset_id .
CHECK sy-subrc EQ 0 .
READ TABLE <datasets>-t_refs ASSIGNING <dataset_refs> WITH TABLE KEY
rt_path_1 = <datavalid>-formula1_dataset_rt_path_1 .
CHECK sy-subrc EQ 0 .
READ TABLE <dataset_refs>-t_fields ASSIGNING <dataset_ref_fields> WITH
KEY field = <datavalid>-formula1_dataset_fld .
CHECK sy-subrc EQ 0 .

s_sheets-ixml_doc->create_simple_element( name = c_tag-formula1


parent = lr_element-
datavalidation
value =
<dataset_ref_fields>-ref_2 ) .
ENDDO .

ELSEIF <datavalid>-formula1 IS NOT INITIAL .


s_sheets-ixml_doc->create_simple_element( name = c_tag-formula1
parent = lr_element-
datavalidation
value = <datavalid>-
formula1 ) .
ENDIF .

* element: formula2
IF <datavalid>-formula2 IS NOT INITIAL .
s_sheets-ixml_doc->create_simple_element( name = c_tag-formula2
parent = lr_element-
datavalidation
value = <datavalid>-
formula2 ) .
ENDIF .
lr_element-datavalidation->render( ostream = lr_ostream recursive =
abap_on ).
lr_element-datavalidation->remove_node( ) .
ENDLOOP .

lr_ostream->close( ) .
FREE lr_ostream .
FREE lr_encoding .
FREE lr_ostream .
FREE lr_streamfactory .
FREE lr_ixml .
CLEAR s_sheets-sheetdata_runtime-t_datavalid[] .
FREE s_sheets-sheetdata_runtime-t_datavalid[] .
ENDIF .

*======================================================================
* 4) concatenate all gotten substrings into whole XML-file Xstring
* and save it to ZIP-folder
*======================================================================

*============ WORKSHEET
CONCATENATE
ls_ostream_xstring-cols1 ls_ostream_xstring-cols2
ls_ostream_xstring-rows1 ls_ostream_xstring-rows2
ls_ostream_xstring-merg1 ls_ostream_xstring-merg2
ls_ostream_xstring-rbrk1 ls_ostream_xstring-rbrk2
ls_ostream_xstring-cbrk1 ls_ostream_xstring-cbrk2
ls_ostream_xstring-dtvl1 ls_ostream_xstring-dtvl2
ls_ostream_xstring-tail
INTO lv_xml_xstring IN BYTE MODE .
FREE ls_ostream_xstring .

CONCATENATE c_path-sheetsfolder+1 '/' s_sheets-name_int '.xml' INTO


lv_sheetpath .
CONDENSE lv_sheetpath .
SHIFT lv_sheetpath LEFT DELETING LEADING '/' .

r_zipfolder->delete( EXPORTING name = lv_sheetpath


EXCEPTIONS OTHERS = 0 ) .

r_zipfolder->add( name = lv_sheetpath


content = lv_xml_xstring ) .
FREE lv_xml_xstring .

*============ SHEET RELATIONS


xml_relstab_set( iv_path = lv_sheetpath
it_relstab = s_sheets-sheetdata_runtime-t_sheetrels[] ) .

*======================================================================
*======================================================================

APPEND s_sheets TO s_model-t_sheets .

ENDMETHOD . "finalize_sheet
METHOD sheet_name_validate .
DATA:
lv_new_sheetname TYPE ty_char31 ,
lv_suffix TYPE ty_char10 ,
lv_strlen_all TYPE i ,
lv_strlen_suf TYPE i ,
lv_offset_suf TYPE i .
DATA:
ls_sheetnamesuffix TYPE ty_s_sheetnamesuffix .
FIELD-SYMBOLS:
<sheetnamesuffix> TYPE ty_s_sheetnamesuffix .

READ TABLE t_sheetnamesuffix ASSIGNING <sheetnamesuffix>


WITH TABLE KEY sheetname = cv_sheetname .
IF sy-subrc NE 0 .
ls_sheetnamesuffix-sheetname = cv_sheetname .
INSERT ls_sheetnamesuffix INTO TABLE t_sheetnamesuffix
ASSIGNING <sheetnamesuffix> .
ENDIF .

lv_new_sheetname = cv_sheetname .
DO .
READ TABLE s_model-t_sheets TRANSPORTING NO FIELDS
WITH TABLE KEY name = lv_new_sheetname .
IF sy-subrc NE 0 .
EXIT .
ENDIF .

ADD 1 TO <sheetnamesuffix>-suffix_index .
lv_suffix = <sheetnamesuffix>-suffix_index .
CONDENSE lv_suffix NO-GAPS .
CONCATENATE '_' lv_suffix INTO lv_suffix .

lv_strlen_suf = STRLEN( lv_suffix ) .


lv_strlen_all = STRLEN( cv_sheetname ) + lv_strlen_suf .
IF lv_strlen_all > 31 .
lv_offset_suf = 31 - lv_strlen_suf .
lv_new_sheetname = cv_sheetname .
lv_new_sheetname+lv_offset_suf = lv_suffix .
ELSE.
CONCATENATE cv_sheetname lv_suffix INTO lv_new_sheetname .
ENDIF .
ENDDO .

cv_sheetname = lv_new_sheetname .
ENDMETHOD . "sheet_name_validate
METHOD begin_folder .

ENDMETHOD . "begin_folder
METHOD finalize_folder .
DATA:
ls_colprop TYPE ty_s_colprop ,
ls_rowprop TYPE ty_s_rowprop ,
ls_coordinates_abs TYPE ty_s_coordinates ,
ls_nopgbrk_range TYPE ty_s_nopgbrk_range ,
ls_manual_pgbrk TYPE ty_s_manual_pgbrk ,
ls_cellrng_name TYPE ty_s_cellrng_name .
FIELD-SYMBOLS:
<colprop> TYPE ty_s_colprop ,
<rowprop> TYPE ty_s_rowprop .
* calculate absolute coordinates of area margins
ls_coordinates_abs-beg_y = iv_top + 1 .
ls_coordinates_abs-end_y = iv_top + iv_rows .
ls_coordinates_abs-beg_x = iv_left + 1 .
ls_coordinates_abs-end_x = iv_left + iv_columns .

* grouping of the rows


IF iv_rowgroup_level IS NOT INITIAL .
CLEAR ls_rowprop .
ls_rowprop-y = ls_coordinates_abs-beg_y .
ls_rowprop-outlinelevel = iv_rowgroup_level .
IF iv_rowgroup_clp IS NOT INITIAL .
ls_rowprop-hidden = '1' .
ENDIF .

WHILE ls_rowprop-y LE ls_coordinates_abs-end_y .


READ TABLE s_sheets-sheetdata_runtime-t_rowprop
ASSIGNING <rowprop> WITH TABLE KEY y = ls_rowprop-y .
IF sy-subrc EQ 0 .
IF <rowprop>-outlinelevel LT ls_rowprop-outlinelevel .
<rowprop>-outlinelevel = ls_rowprop-outlinelevel .
<rowprop>-hidden = ls_rowprop-hidden .
ELSEIF ls_rowprop-hidden IS NOT INITIAL .
<rowprop>-hidden = ls_rowprop-hidden .
ENDIF .
ELSE .
INSERT ls_rowprop
INTO TABLE s_sheets-sheetdata_runtime-t_rowprop .
ENDIF .

ADD 1 TO ls_rowprop-y .
ENDWHILE .
ENDIF .

* flag 'collapsed' for rows


IF iv_rowgroup_clp IS NOT INITIAL .
CLEAR ls_rowprop .
ls_rowprop-collapsed = '1' .

IF v_summarybelow IS INITIAL .
ls_rowprop-y = ls_coordinates_abs-beg_y - 1 .
ELSE .
ls_rowprop-y = ls_coordinates_abs-end_y + 1 .
ENDIF .

IF ls_rowprop-y IS NOT INITIAL .


READ TABLE s_sheets-sheetdata_runtime-t_rowprop
ASSIGNING <rowprop> WITH TABLE KEY y = ls_rowprop-y .
IF sy-subrc EQ 0 .
<rowprop>-collapsed = ls_rowprop-collapsed .
ELSE .
INSERT ls_rowprop
INTO TABLE s_sheets-sheetdata_runtime-t_rowprop .
ENDIF .
ENDIF .
ENDIF .

* grouping of the columns


IF iv_colgroup_level IS NOT INITIAL .
CLEAR ls_colprop .
ls_colprop-x = ls_coordinates_abs-beg_x .
ls_colprop-outlinelevel = iv_colgroup_level .
IF iv_colgroup_clp IS INITIAL .
ls_colprop-width = '10' .
ELSE .
ls_colprop-hidden = '1' .
ENDIF .

WHILE ls_colprop-x LE ls_coordinates_abs-end_x .


READ TABLE s_sheets-sheetdata_runtime-t_colprop
ASSIGNING <colprop> WITH KEY x = ls_colprop-x BINARY SEARCH .
IF sy-subrc EQ 0 .
IF <colprop>-outlinelevel LT ls_colprop-outlinelevel .
<colprop>-outlinelevel = ls_colprop-outlinelevel .
<colprop>-hidden = ls_colprop-hidden .
ELSEIF ls_colprop-hidden IS NOT INITIAL .
<colprop>-hidden = ls_colprop-hidden .
ENDIF .
ELSE .
INSERT ls_colprop
INTO TABLE s_sheets-sheetdata_runtime-t_colprop .
ENDIF .

ADD 1 TO ls_colprop-x .
ENDWHILE .
ENDIF .

* flag 'collapsed' for columns


IF iv_colgroup_clp IS NOT INITIAL .
CLEAR ls_colprop .
ls_colprop-x = ls_coordinates_abs-end_x + 1 .
ls_colprop-collapsed = '1' .
ls_colprop-width = '10' .

IF v_summaryright IS INITIAL .
ls_colprop-x = ls_coordinates_abs-beg_x - 1 .
ELSE .
ls_colprop-x = ls_coordinates_abs-end_x + 1 .
ENDIF .

IF ls_colprop-x IS NOT INITIAL .


READ TABLE s_sheets-sheetdata_runtime-t_colprop
ASSIGNING <colprop> WITH KEY x = ls_colprop-x BINARY SEARCH .
IF sy-subrc EQ 0 .
<colprop>-collapsed = ls_colprop-collapsed .
IF <colprop>-width IS INITIAL .
<colprop>-width = ls_colprop-width .
ENDIF.
ELSE .
INSERT ls_colprop
INTO TABLE s_sheets-sheetdata_runtime-t_colprop .
ENDIF .
ENDIF .
ENDIF .

* revise a depth of grouping on the sheet


IF s_sheets-sheetdata_runtime-outlinelevelrow LT iv_rowgroup_level .
s_sheets-sheetdata_runtime-outlinelevelrow = iv_rowgroup_level .
ENDIF .
IF s_sheets-sheetdata_runtime-outlinelevelcol LT iv_colgroup_level .
s_sheets-sheetdata_runtime-outlinelevelcol = iv_colgroup_level .
ENDIF .

* revise a dimension of data on the sheet


IF s_sheets-sheetdata_runtime-beg_y IS INITIAL
OR s_sheets-sheetdata_runtime-beg_y GT ls_coordinates_abs-beg_y .
s_sheets-sheetdata_runtime-beg_y = ls_coordinates_abs-beg_y .
ENDIF .
IF s_sheets-sheetdata_runtime-beg_x IS INITIAL
OR s_sheets-sheetdata_runtime-beg_x GT ls_coordinates_abs-beg_x .
s_sheets-sheetdata_runtime-beg_x = ls_coordinates_abs-beg_x .
ENDIF .
IF s_sheets-sheetdata_runtime-end_y IS INITIAL
OR s_sheets-sheetdata_runtime-end_y LT ls_coordinates_abs-end_y .
s_sheets-sheetdata_runtime-end_y = ls_coordinates_abs-end_y .
ENDIF .
IF s_sheets-sheetdata_runtime-end_x IS INITIAL
OR s_sheets-sheetdata_runtime-end_x LT ls_coordinates_abs-end_x .
s_sheets-sheetdata_runtime-end_x = ls_coordinates_abs-end_x .
ENDIF .

* range for preventing automatic page break


IF iv_nopgbrk_left IS NOT INITIAL .
v_postprocessing_nopgbrk = abap_on .
s_sheets-sheetdata_runtime-postprocessing_nopgbrk = abap_on .

CLEAR ls_nopgbrk_range .
ls_nopgbrk_range-left = iv_nopgbrk_left .
ls_nopgbrk_range-beg_x = iv_nopgbrk_beg_x .
IF ls_nopgbrk_range-beg_x LE 0 .
ls_nopgbrk_range-beg_x = 1 .
ENDIF .
ls_nopgbrk_range-end_x = iv_nopgbrk_end_x .
APPEND ls_nopgbrk_range TO s_sheets-sheetdata_runtime-t_nopgbrk_range .
ENDIF .

IF iv_nopgbrk_top IS NOT INITIAL .


v_postprocessing_nopgbrk = abap_on .
s_sheets-sheetdata_runtime-postprocessing_nopgbrk = abap_on .

CLEAR ls_nopgbrk_range .
ls_nopgbrk_range-top = iv_nopgbrk_top .
ls_nopgbrk_range-beg_y = iv_nopgbrk_beg_y .
IF ls_nopgbrk_range-beg_y LE 0 .
ls_nopgbrk_range-beg_y = 1 .
ENDIF .
ls_nopgbrk_range-end_y = iv_nopgbrk_end_y .
APPEND ls_nopgbrk_range TO s_sheets-sheetdata_runtime-t_nopgbrk_range .
ENDIF .

* insert manual page breaks


IF iv_pgbrk_top IS NOT INITIAL
AND ls_coordinates_abs-beg_y GT 1 .
ls_manual_pgbrk-id = ls_coordinates_abs-beg_y - 1 .
APPEND ls_manual_pgbrk TO s_sheets-sheetdata_runtime-t_manual_pgbrk_row .
ENDIF .
IF iv_pgbrk_left IS NOT INITIAL
AND ls_coordinates_abs-beg_x GT 1 .
ls_manual_pgbrk-id = ls_coordinates_abs-beg_x - 1 .
APPEND ls_manual_pgbrk TO s_sheets-sheetdata_runtime-t_manual_pgbrk_col .
ENDIF .

* insert name of cell range


IF iv_cellrng_name IS NOT INITIAL .
MOVE-CORRESPONDING ls_coordinates_abs TO ls_cellrng_name .
ls_cellrng_name-name = iv_cellrng_name .
APPEND ls_cellrng_name TO s_sheets-sheetdata_runtime-t_cellrng_name .
ENDIF .

ENDMETHOD . "finalize_folder
METHOD begin_field .
DATA:
ls_cells TYPE ty_s_cells ,
ls_sharedstrings TYPE ty_s_sharedstrings ,
lv_date_excel TYPE ty_char100 ,
lv_date_flag TYPE flag ,
lv_number_flag TYPE flag ,
lv_fld TYPE string .
FIELD-SYMBOLS:
<cells> TYPE ty_s_cells ,
<sharedstrings> TYPE ty_s_sharedstrings ,
<valvld_attr_line> TYPE ANY ,
<valvld_attr_fld> TYPE ANY ,
<valvld_attr_val> TYPE ANY ,
<val> TYPE ANY .

READ TABLE s_patterns-t_cells ASSIGNING <cells>


WITH KEY y = iv_top x = iv_left
BINARY SEARCH .
IF sy-subrc NE 0 .
ls_cells-y = iv_top .
ls_cells-x = iv_left .
INSERT ls_cells INTO TABLE s_patterns-t_cells ASSIGNING <cells> .
ENDIF .
CHECK <cells> IS ASSIGNED .

CLEAR <cells>-tmp_flag .
CLEAR <cells>-tmp_value_s .
CLEAR <cells>-tmp_si_node .

* data validation for cell


<cells>-datavalidation-formula1_dataset_id = iv_valvld_for1_dataset_id .
<cells>-datavalidation-formula1_dataset_fld = iv_valvld_for1_dataset_fld .
IF <cells>-datavalidation-formula1_dataset_id IS NOT INITIAL .
<cells>-datavalidation-formula1_dataset_rt_path_1 = iv_rt_path_1 . " -->>
runtime path (for dataset subordination)
ENDIF .

IF iv_valvld_for1_value_x IS NOT INITIAL .


<cells>-datavalidation-formula1 = iv_valvld_for1_value .
ENDIF .
IF iv_valvld_for2_value_x IS NOT INITIAL .
<cells>-datavalidation-formula2 = iv_valvld_for2_value .
ENDIF .
IF <cells>-datavalidation-formula1 IS INITIAL
AND <cells>-datavalidation-formula1_dataset_id IS INITIAL
AND <cells>-datavalidation-formula1_dataset_fld IS INITIAL
AND <cells>-datavalidation-formula2 IS INITIAL .
CLEAR <cells>-datavalidation .

ELSE .
LOOP AT it_valvld_attr_table ASSIGNING <valvld_attr_line> .
UNASSIGN <valvld_attr_fld> .
UNASSIGN <valvld_attr_val> .
DO 2 TIMES .
CASE sy-index .
WHEN 1 . ASSIGN COMPONENT 1 OF STRUCTURE <valvld_attr_line> TO
<valvld_attr_fld> .
WHEN 2 . ASSIGN COMPONENT 2 OF STRUCTURE <valvld_attr_line> TO
<valvld_attr_val> .
ENDCASE .
ENDDO .
IF <valvld_attr_fld> IS NOT ASSIGNED
OR <valvld_attr_val> IS NOT ASSIGNED .
EXIT .
ENDIF .

UNASSIGN <val> .
lv_fld = <valvld_attr_fld> .
TRANSLATE lv_fld TO UPPER CASE .
ASSIGN COMPONENT lv_fld OF STRUCTURE <cells>-datavalidation TO <val> .
CHECK <val> IS ASSIGNED .
<val> = <valvld_attr_val> .
ENDLOOP .
ENDIF .

* cell value
IF iv_formula IS NOT INITIAL .
<cells>-formula = iv_value .
CLEAR <cells>-value .
CLEAR <cells>-value_s .
RETURN .
ENDIF .

value_describe( EXPORTING iv_value = iv_value


iv_cell_dateformat_style = <cells>-dateformat_style
IMPORTING ev_number_flag = lv_number_flag
ev_date_flag = lv_date_flag
ev_date_excel = lv_date_excel ) .

IF iv_value IS INITIAL .
<cells>-type = space .
<cells>-value = space .
<cells>-value_s = space .

ELSEIF lv_date_flag EQ abap_on


AND <cells>-dateformat_style EQ abap_on .
<cells>-type = space .
<cells>-value = lv_date_excel .
<cells>-value_s = lv_date_excel .

ELSEIF lv_number_flag EQ abap_on


AND <cells>-textformat_style EQ abap_off .
<cells>-type = space .
<cells>-value = iv_value .
<cells>-value_s = iv_value .

ELSE .
<cells>-type = c_tag-s .
<cells>-value_s = iv_value .
READ TABLE s_model-t_sharedstrings ASSIGNING <sharedstrings>
WITH TABLE KEY value = <cells>-value_s .
IF sy-subrc NE 0 .
ls_sharedstrings-value = <cells>-value_s .
ls_sharedstrings-key = LINES( s_model-t_sharedstrings ) .
INSERT ls_sharedstrings INTO TABLE s_model-t_sharedstrings
ASSIGNING <sharedstrings> .
ENDIF .
CHECK <sharedstrings> IS ASSIGNED .
<cells>-value = <sharedstrings>-key .
ENDIF .
ENDMETHOD . " begin_field
METHOD begin_field_textmark .
DATA:
ls_cells TYPE ty_s_cells ,
ls_sharedstrings TYPE ty_s_sharedstrings ,
lv_date_excel TYPE ty_char100 ,
lv_date_flag TYPE flag ,
lv_number_flag TYPE flag ,
lv_fld TYPE string .
DATA:
lv_val_index TYPE sy-index ,
lr_val_ncol TYPE REF TO if_ixml_node_collection ,
lr_val_node_r TYPE REF TO if_ixml_node ,
lr_val_node TYPE REF TO if_ixml_node ,
lr_val_elem TYPE REF TO if_ixml_element ,
lr_si_elem TYPE REF TO if_ixml_element ,
lv_stringtmp TYPE string .
FIELD-SYMBOLS:
<cells> TYPE ty_s_cells ,
<sharedstrings> TYPE ty_s_sharedstrings ,
<valvld_attr_line> TYPE ANY ,
<valvld_attr_fld> TYPE ANY ,
<valvld_attr_val> TYPE ANY ,
<val> TYPE ANY .

LOOP AT s_patterns-t_cells ASSIGNING <cells> .


CHECK <cells>-value_s CS iv_textmark .

* data validation for cell


<cells>-datavalidation-formula1_dataset_id = iv_valvld_for1_dataset_id .
<cells>-datavalidation-formula1_dataset_fld = iv_valvld_for1_dataset_fld .
IF <cells>-datavalidation-formula1_dataset_id IS NOT INITIAL .
<cells>-datavalidation-formula1_dataset_rt_path_1 = iv_rt_path_1 . " -->>
runtime path (for dataset subordination)
ENDIF .
IF iv_valvld_for1_value_x IS NOT INITIAL .
<cells>-datavalidation-formula1 = iv_valvld_for1_value .
ENDIF .
IF iv_valvld_for2_value_x IS NOT INITIAL .
<cells>-datavalidation-formula2 = iv_valvld_for2_value .
ENDIF .
IF <cells>-datavalidation-formula1 IS INITIAL
AND <cells>-datavalidation-formula1_dataset_id IS INITIAL
AND <cells>-datavalidation-formula1_dataset_fld IS INITIAL
AND <cells>-datavalidation-formula2 IS INITIAL .
CLEAR <cells>-datavalidation .

ELSE .
LOOP AT it_valvld_attr_table ASSIGNING <valvld_attr_line> .
UNASSIGN <valvld_attr_fld> .
UNASSIGN <valvld_attr_val> .
DO 2 TIMES .
CASE sy-index .
WHEN 1 . ASSIGN COMPONENT 1 OF STRUCTURE <valvld_attr_line> TO
<valvld_attr_fld> .
WHEN 2 . ASSIGN COMPONENT 2 OF STRUCTURE <valvld_attr_line> TO
<valvld_attr_val> .
ENDCASE .
ENDDO .
IF <valvld_attr_fld> IS NOT ASSIGNED
OR <valvld_attr_val> IS NOT ASSIGNED .
EXIT .
ENDIF .

UNASSIGN <val> .
lv_fld = <valvld_attr_fld> .
TRANSLATE lv_fld TO UPPER CASE .
ASSIGN COMPONENT lv_fld OF STRUCTURE <cells>-datavalidation TO <val> .
CHECK <val> IS ASSIGNED .
<val> = <valvld_attr_val> .
ENDLOOP .
ENDIF .

* cell value
IF <cells>-value_s EQ iv_textmark .

CLEAR <cells>-tmp_flag .
CLEAR <cells>-tmp_value_s .
CLEAR <cells>-tmp_si_node .

IF iv_formula IS NOT INITIAL .


<cells>-formula = iv_value .
CLEAR <cells>-value .
CLEAR <cells>-value_s .
CONTINUE .
ENDIF .

value_describe( EXPORTING iv_value = iv_value


iv_cell_dateformat_style = <cells>-
dateformat_style
IMPORTING ev_number_flag = lv_number_flag
ev_date_flag = lv_date_flag
ev_date_excel = lv_date_excel ) .

IF iv_value IS INITIAL .
<cells>-type = space .
<cells>-value = space .
<cells>-value_s = space .
ELSEIF lv_date_flag EQ abap_on
AND <cells>-dateformat_style EQ abap_on .
<cells>-type = space .
<cells>-value = lv_date_excel .
<cells>-value_s = lv_date_excel .

ELSEIF lv_number_flag EQ abap_on


AND <cells>-textformat_style EQ abap_off .
<cells>-type = space .
<cells>-value = iv_value .
<cells>-value_s = iv_value .

ELSE .
<cells>-type = c_tag-s .
<cells>-value_s = iv_value .
READ TABLE s_model-t_sharedstrings ASSIGNING <sharedstrings>
WITH TABLE KEY value = <cells>-value_s .
IF sy-subrc NE 0 .
ls_sharedstrings-value = <cells>-value_s .
ls_sharedstrings-key = LINES( s_model-t_sharedstrings ) .
INSERT ls_sharedstrings INTO TABLE s_model-t_sharedstrings
ASSIGNING <sharedstrings> .
ENDIF .
IF <sharedstrings> IS ASSIGNED .
<cells>-value = <sharedstrings>-key .
ENDIF .
ENDIF .

ELSE .

IF <cells>-tmp_flag IS INITIAL .
<cells>-tmp_flag = abap_on .
<cells>-tmp_value_s = <cells>-value_s .

IF <cells>-type EQ c_tag-s .
READ TABLE s_model-t_sharedstrings ASSIGNING <sharedstrings>
WITH TABLE KEY value = <cells>-value_s .
CHECK sy-subrc EQ 0 .
IF <sharedstrings>-si_node IS BOUND .
<cells>-tmp_si_node = <sharedstrings>-si_node->clone( ) .
ENDIF .
ENDIF .
ENDIF .

REPLACE ALL OCCURRENCES OF iv_textmark IN <cells>-tmp_value_s WITH iv_value


.
CHECK sy-subrc EQ 0 .

CHECK <cells>-tmp_si_node IS BOUND .


lr_si_elem ?= <cells>-tmp_si_node .
lr_val_ncol = lr_si_elem->get_elements_by_tag_name( name = c_tag-t ) .
CHECK lr_val_ncol IS BOUND .
DO .
lv_val_index = sy-index - 1 .
lr_val_node = lr_val_ncol->get_item( index = lv_val_index ) .
IF lr_val_node IS NOT BOUND. EXIT. ENDIF .
lv_stringtmp = lr_val_node->get_value( ) .
REPLACE ALL OCCURRENCES OF iv_textmark IN lv_stringtmp WITH iv_value .
CHECK sy-subrc EQ 0 .
lr_val_node->set_value( lv_stringtmp ) .
CHECK lv_stringtmp IS INITIAL .
lr_val_node_r = lr_val_node->get_parent( ) .
CHECK lr_val_node_r IS BOUND .
CHECK c_tag-r EQ lr_val_node_r->get_name( ) .
lr_val_node_r->remove_node( ) .
ENDDO .
ENDIF .
ENDLOOP .

ENDMETHOD . " begin_field_textmark


METHOD value_describe .
DATA:
lv_date_sap TYPE dats ,
lv_date_sap_char TYPE ty_char8 .
CONSTANTS:
lv_date_beg TYPE dats VALUE '18991230' .

CLEAR:
ev_number_flag,
ev_date_flag ,
ev_date_excel .

CHECK iv_value IS NOT INITIAL .

IF iv_cell_dateformat_style EQ abap_on .
IF iv_value EQ '00000000'
OR iv_value EQ '00.00.0000' .
ev_date_flag = abap_on .
ev_date_excel = space .
ELSE .
IF STRLEN( iv_value ) EQ 8 .
lv_date_sap_char = iv_value .
ELSE .
CALL FUNCTION 'CONVERSION_EXIT_IDATE_INPUT'
EXPORTING
input = iv_value
IMPORTING
output = lv_date_sap_char.
ENDIF .
IF lv_date_sap_char IS NOT INITIAL
AND lv_date_sap_char CO ' 1234567890' .
ev_date_flag = abap_on .
lv_date_sap = lv_date_sap_char .
ev_date_excel = lv_date_sap - lv_date_beg .
CONDENSE ev_date_excel .
ENDIF .
ENDIF .
ENDIF .

IF ev_date_flag IS INITIAL .
ev_number_flag = is_number( iv_value ) .
ENDIF .

ENDMETHOD . " value_describe


METHOD is_number .
rv_number = space .
CHECK iv_value CA '0123456789' .
DATA lv_value TYPE string .
lv_value = iv_value .
TRY.
FIND REGEX '^\-?\d{1,}\.?\d{0,}$' IN lv_value .
CATCH cx_sy_regex
cx_sy_regex_too_complex .
RETURN .
ENDTRY .
CHECK sy-subrc EQ 0 .
rv_number = abap_on .
ENDMETHOD . "is_number
METHOD postprocessing .
DATA:
lv_document_rawdata TYPE ty_rawdata ,
lt_document_table TYPE tsfmime ,
lv_document_size TYPE i ,
lv_selected_sheetname TYPE ty_char31 ,
lv_macro_string TYPE ty_char1024 ,
lr_error TYPE REF TO i_oi_error .
FIELD-SYMBOLS:
<mergecells> TYPE ty_s_mergecells ,
<sheets> TYPE ty_s_sheets .

CHECK v_gui_available IS NOT INITIAL .

CHECK v_postprocessing_nopgbrk IS NOT INITIAL


OR v_postprocessing_autofit IS NOT INITIAL
OR cv_vbs_code IS NOT INITIAL
OR ( iv_startup_macro IS NOT INITIAL AND v_extension EQ c_extension_xlsm ) .

msg_init( ) .
lv_document_rawdata = rawdata_get( ) .

DATA lr_dummy_container TYPE REF TO cl_gui_custom_container.


CREATE OBJECT lr_dummy_container
EXPORTING
container_name = 'DUMMY'
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0 .
msg_syst_catch( iv_toplist = abap_on ) .
msg_show( ) .
RETURN .
ENDIF .

* Initialize objects
CREATE OBJECT r_ole
EXPORTING
ir_container = lr_dummy_container "cl_gui_container=>default_screen
iv_document_rawdata = lv_document_rawdata
iv_viewmode = lcl_ole=>c_viewmode-inplace
iv_readonly = abap_off
iv_background = abap_on
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0 .
MESSAGE e000(lp)
WITH v_text-t280 " text: Problem while OLE/VBScript post-processing
INTO v_dummy .
msg_syst_catch( iv_toplist = abap_on ) .
msg_show( ) .
RETURN .
ENDIF .

cl_gui_cfw=>flush( ) .

* Keep active sheet


r_ole->r_spreadsheet->get_active_sheet( IMPORTING sheetname =
lv_selected_sheetname ) .

CASE s_presets_rt-postprocessing_method .
WHEN c_postprocessing_method-vbs .
* Auto Fit rows/ columns for merged cells
postpr_vbs_autofit( ) .

CASE v_retcode .
WHEN c_retcode-error .
MESSAGE e000(lp)
WITH v_text-t280 " text: Problem while OLE/VBScript post-processing
'('
v_text-t281 " text: AutoFit merged cells
')'
INTO v_dummy .
msg_syst_catch( iv_toplist = abap_on ) .

WHEN OTHERS .
* Revise Automatic Page Breaks
postpr_vbs_nopgbrk( ) .

IF v_retcode EQ c_retcode-error .
MESSAGE e000(lp)
WITH v_text-t280 " text: Problem while OLE/VBScript post-
processing
'('
v_text-t153 " text: Preventing of automatic page breaks
(inside)
')'
INTO v_dummy .
msg_syst_catch( iv_toplist = abap_on ) .
ENDIF .
ENDCASE .

WHEN c_postprocessing_method-ole .
* Auto Fit rows/ columns for merged cells
postpr_ole_autofit( ) .

* Revise Automatic Page Breaks


postpr_ole_nopgbrk( ) .
ENDCASE .

* Restore active sheet


r_ole->r_spreadsheet->select_sheet( name = lv_selected_sheetname ) .

* Final post-processing
IF v_retcode NE c_retcode-error .
postpr_vbs_final( CHANGING cv_vbs_code = cv_vbs_code
ct_vbs_tables_tab = ct_vbs_tables_tab ) .
IF v_retcode EQ c_retcode-error .
MESSAGE e000(lp)
WITH v_text-t280 " text: Problem while OLE/VBScript post-processing
'('
v_text-t287 " text: Final post-processing
')'
INTO v_dummy .
msg_syst_catch( iv_toplist = abap_on ) .
ENDIF .
ENDIF .

* Run embedded VBA-macro ( only for .XLSM, not for XLSX )


IF iv_startup_macro IS NOT INITIAL
AND v_extension EQ c_extension_xlsm .
lv_macro_string = iv_startup_macro .
r_ole->r_docproxy->execute_macro( EXPORTING macro_string = lv_macro_string
no_flush = space
IMPORTING error = lr_error ) .
msg_io_catch( lr_error ) .
ENDIF .

* Show messages, if occurs


msg_show( ) .

* Get result
r_ole->rawdata_get_as_table(
EXPORTING iv_extension = v_extension
IMPORTING et_document_table = lt_document_table
ev_document_size = lv_document_size ) .

me->rawdata_set_as_table(
EXPORTING it_document_table = lt_document_table
iv_document_size = lv_document_size ) .

* Release objects
r_ole->free( ) .
FREE r_ole .

FREE lr_dummy_container .
ENDMETHOD . "postprocessing
METHOD postpr_ole_nopgbrk .
DATA:
lv_selection_top TYPE i ,
lv_selection_left TYPE i ,
lv_selection_rows TYPE i ,
lv_selection_columns TYPE i ,
lv_index TYPE i ,
lv_row TYPE i ,
lv_column TYPE i ,
lv_ref TYPE string .
FIELD-SYMBOLS:
<nopgbrk_range> TYPE ty_s_nopgbrk_range ,
<sheets> TYPE ty_s_sheets .

LOOP AT s_model-t_sheets ASSIGNING <sheets>


WHERE sheetdata_runtime-postprocessing_nopgbrk IS NOT INITIAL .

r_ole->r_spreadsheet->select_sheet(
EXPORTING name = <sheets>-name ) .

* keep actual cell selection


r_ole->r_spreadsheet->get_selection(
IMPORTING top = lv_selection_top
left = lv_selection_left
rows = lv_selection_rows
columns = lv_selection_columns ) .

GET PROPERTY OF r_ole->s_ole-application 'Activesheet' = r_ole->s_ole-


activesheet no flush .

CALL METHOD OF r_ole->s_ole-application 'ActiveWindow' = r_ole->s_ole-


activewindow NO FLUSH .
SET PROPERTY OF r_ole->s_ole-activewindow 'View' = 2 no flush .

*------------------- Horizontal Page Breaks


GET PROPERTY OF r_ole->s_ole-activesheet 'HPageBreaks' = r_ole->s_ole-
pagebreaks .
DO .
lv_index = sy-index .
GET PROPERTY OF r_ole->s_ole-activesheet 'HPageBreaks' = r_ole->s_ole-
pagebreak exporting #1 = lv_index .
IF sy-subrc NE 0 .
r_ole->free_ole_object( 'pagebreak' ) .
EXIT .
ENDIF .

CALL METHOD OF r_ole->s_ole-pagebreak 'Location' = r_ole->s_ole-location.


IF sy-subrc EQ 0 .
CALL METHOD OF r_ole->s_ole-location 'Row' = lv_row.
CALL METHOD OF r_ole->s_ole-location 'Column' = lv_column.

LOOP AT <sheets>-sheetdata_runtime-t_nopgbrk_range ASSIGNING


<nopgbrk_range>
WHERE top IS NOT INITIAL
AND beg_y LT lv_row AND end_y GE lv_row .

conv_ref_nc( EXPORTING iv_beg_x = lv_column


iv_beg_y = <nopgbrk_range>-beg_y
IMPORTING ev_ref = lv_ref ) .

CALL METHOD OF r_ole->s_ole-activesheet 'Range' = r_ole->s_ole-


locationnew EXPORTING #1 = lv_ref.
IF sy-subrc EQ 0 .
CALL METHOD OF r_ole->s_ole-pagebreaks 'Add' EXPORTING #1 = r_ole-
>s_ole-locationnew.
ENDIF .

EXIT .
ENDLOOP .
ENDIF .

r_ole->free_ole_object( 'locationnew' ) .
r_ole->free_ole_object( 'location' ) .
r_ole->free_ole_object( 'pagebreak' ) .
ENDDO .
r_ole->free_ole_object( 'pagebreaks' ) .
*------------------- Vertical Page Breaks
GET PROPERTY OF r_ole->s_ole-activesheet 'VPageBreaks' = r_ole->s_ole-
pagebreaks .
DO .
lv_index = sy-index .
GET PROPERTY OF r_ole->s_ole-activesheet 'VPageBreaks' = r_ole->s_ole-
pagebreak exporting #1 = lv_index .
IF sy-subrc NE 0 .
r_ole->free_ole_object( 'pagebreak' ) .
EXIT .
ENDIF .

CALL METHOD OF r_ole->s_ole-pagebreak 'Location' = r_ole->s_ole-location.


IF sy-subrc EQ 0 .
CALL METHOD OF r_ole->s_ole-location 'Row' = lv_row.
CALL METHOD OF r_ole->s_ole-location 'Column' = lv_column.

LOOP AT <sheets>-sheetdata_runtime-t_nopgbrk_range ASSIGNING


<nopgbrk_range>
WHERE left IS NOT INITIAL
AND beg_x LT lv_column AND end_x GE lv_column .

conv_ref_nc( EXPORTING iv_beg_x = <nopgbrk_range>-beg_x


iv_beg_y = lv_row
IMPORTING ev_ref = lv_ref ) .

CALL METHOD OF r_ole->s_ole-activesheet 'Range' = r_ole->s_ole-


locationnew EXPORTING #1 = lv_ref.
IF sy-subrc EQ 0 .
CALL METHOD OF r_ole->s_ole-pagebreaks 'Add' EXPORTING #1 = r_ole-
>s_ole-locationnew.
ENDIF .

EXIT .
ENDLOOP .
ENDIF .

r_ole->free_ole_object( 'locationnew' ) .
r_ole->free_ole_object( 'location' ) .
r_ole->free_ole_object( 'pagebreak' ) .
ENDDO .
r_ole->free_ole_object( 'pagebreaks' ) .

r_ole->free_ole_object( 'activesheet' ) .

* restore cell selection


r_ole->r_spreadsheet->set_selection(
EXPORTING top = lv_selection_top
left = lv_selection_left
rows = lv_selection_rows
columns = lv_selection_columns ) .
ENDLOOP .

ENDMETHOD . "postpr_ole_nopgbrk
METHOD postpr_ole_autofit .
DATA:
lv_selection_top TYPE i ,
lv_selection_left TYPE i ,
lv_selection_rows TYPE i ,
lv_selection_columns TYPE i .
FIELD-SYMBOLS:
<mergecells> TYPE ty_s_mergecells ,
<sheets> TYPE ty_s_sheets .

LOOP AT s_model-t_sheets ASSIGNING <sheets>


WHERE sheetdata_runtime-postprocessing_autofit IS NOT INITIAL .

r_ole->r_spreadsheet->select_sheet(
EXPORTING name = <sheets>-name ) .

* keep actual cell selection


r_ole->r_spreadsheet->get_selection(
IMPORTING top = lv_selection_top
left = lv_selection_left
rows = lv_selection_rows
columns = lv_selection_columns ) .

GET PROPERTY OF r_ole->s_ole-application 'Activesheet' = r_ole->s_ole-


activesheet no flush .

LOOP AT <sheets>-sheetdata_runtime-t_mergecells ASSIGNING <mergecells>


WHERE autofit_rows IS NOT INITIAL
OR autofit_cols IS NOT INITIAL .

CLEAR s_ole_variables .

* get merged cell range which has to be resized (i.e.current range)


conv_ref_nc( EXPORTING iv_beg_x = <mergecells>-beg_x
iv_beg_y = <mergecells>-beg_y
iv_end_x = <mergecells>-end_x
iv_end_y = <mergecells>-end_y
IMPORTING ev_ref = s_ole_variables-ref ) .
CALL METHOD OF r_ole->s_ole-activesheet 'Range' = r_ole->s_ole-cur_range NO
FLUSH EXPORTING #1 = s_ole_variables-ref.

* check wrap text option


GET PROPERTY OF r_ole->s_ole-cur_range 'WrapText' = s_ole_variables-
cur_wraptext .
IF s_ole_variables-cur_wraptext NE 1 .
r_ole->free_ole_object( 'cur_range' ) .
RETURN .
ENDIF .

conv_ref_nc( EXPORTING iv_beg_x = <mergecells>-beg_x


iv_beg_y = <mergecells>-beg_y
iv_end_x = <mergecells>-beg_x
iv_end_y = <mergecells>-beg_y
IMPORTING ev_ref = s_ole_variables-ref1 ) .
CALL METHOD OF r_ole->s_ole-activesheet 'Range' = r_ole->s_ole-cur_rang1 NO
FLUSH EXPORTING #1 = s_ole_variables-ref1.

* calculate total height of rows in the current range


s_ole_variables-cur_rows_count = <mergecells>-end_y - <mergecells>-beg_y +
1 .
DO s_ole_variables-cur_rows_count TIMES .
GET PROPERTY OF r_ole->s_ole-cur_range 'Rows' = r_ole->s_ole-
cur_range_row no flush exporting #1 = sy-index .
CLEAR s_ole_variables-height .
GET PROPERTY OF r_ole->s_ole-cur_range_row 'RowHeight' =
s_ole_variables-height ."NO FLUSH .
ADD s_ole_variables-height TO s_ole_variables-cur_rows_height .
r_ole->free_ole_object( 'cur_range_row' ) .
ENDDO .

* calculate total width of columns in the current range


s_ole_variables-cur_cols_count = <mergecells>-end_x - <mergecells>-beg_x +
1 .
DO s_ole_variables-cur_cols_count TIMES .
GET PROPERTY OF r_ole->s_ole-cur_range 'Columns' = r_ole->s_ole-
cur_range_col no flush
exporting #1 = sy-index .
CLEAR s_ole_variables-width .
GET PROPERTY OF r_ole->s_ole-cur_range_col 'ColumnWidth' =
s_ole_variables-width ."NO FLUSH.
ADD s_ole_variables-width TO s_ole_variables-cur_cols_width .
r_ole->free_ole_object( 'cur_range_col' ) .
ENDDO .

* copy Current range content to bottom-right corner of the worksheet


(i.e.Temporary range)
DATA lv_tmpx TYPE ty_char100 .
DATA lv_tmpy TYPE ty_char100 .
DATA lv_ref TYPE ty_char100 .
lv_tmpx = 16380 - s_ole_variables-cur_cols_count . CONDENSE lv_tmpx NO-
GAPS .
lv_tmpy = 1048570 - s_ole_variables-cur_rows_count . CONDENSE lv_tmpy NO-
GAPS .

conv_ref_nc( EXPORTING iv_beg_x = lv_tmpx


iv_beg_y = lv_tmpy
iv_end_x = lv_tmpx
iv_end_y = lv_tmpy
IMPORTING ev_ref = s_ole_variables-ref2 ) .

CALL METHOD OF r_ole->s_ole-activesheet 'Range' = r_ole->s_ole-tmp_range NO


FLUSH EXPORTING #1 = s_ole_variables-ref2 .

CALL METHOD OF r_ole->s_ole-cur_rang1 'Copy' NO FLUSH .


CALL METHOD OF r_ole->s_ole-tmp_range 'Select' NO FLUSH .
CALL METHOD OF r_ole->s_ole-activesheet 'Paste' NO FLUSH .

* disable cells merging in the temporary range


SET PROPERTY OF r_ole->s_ole-tmp_range 'MergeCells' = 0 no flush .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 1 ) .

* now all content of the temporary range is placed in a single cell


(temporary cell)
FREE OBJECT r_ole->s_ole-tmp_range .
CLEAR r_ole->s_ole-tmp_range .
CALL METHOD OF r_ole->s_ole-activesheet 'Range' = r_ole->s_ole-tmp_range NO
FLUSH EXPORTING #1 = s_ole_variables-ref2 .

CASE abap_on .
WHEN <mergecells>-autofit_rows .
* set column width of the temporary cell equal to total width of current
range
SET PROPERTY OF r_ole->s_ole-tmp_range 'ColumnWidth' =
s_ole_variables-cur_cols_width no flush .

* auto fit row height of the temporary cell


GET PROPERTY OF r_ole->s_ole-tmp_range 'Rows' = r_ole->s_ole-
tmp_range_row no flush exporting #1 = 1 .
CALL METHOD OF r_ole->s_ole-tmp_range_row 'AutoFit' NO FLUSH.

* get adjusted row height


GET PROPERTY OF r_ole->s_ole-tmp_range_row 'RowHeight' =
s_ole_variables-height no flush .

cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 1 ) .


r_ole->free_ole_object( 'tmp_range_row' ) .

* if the adjusted row height is greater than the total height of rows of
current range, we resize it
IF s_ole_variables-height GT s_ole_variables-cur_rows_height .
GET PROPERTY OF r_ole->s_ole-cur_range 'Rows' = r_ole->s_ole-
cur_range_rows no flush .
s_ole_variables-cur_rows_height = s_ole_variables-height /
s_ole_variables-cur_rows_count .
SET PROPERTY OF r_ole->s_ole-cur_range_rows 'RowHeight' =
s_ole_variables-cur_rows_height no flush .

cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 1 ) .


r_ole->free_ole_object( 'cur_range_rows' ) .
ENDIF .

WHEN <mergecells>-autofit_cols .
* set row height of the temporary cell equal to total height of current
range
SET PROPERTY OF r_ole->s_ole-tmp_range 'RowHeight' = s_ole_variables-
cur_rows_height no flush.

* auto fit column width of the temporary cell


GET PROPERTY OF r_ole->s_ole-tmp_range 'Columns' = r_ole->s_ole-
tmp_range_col no flush exporting #1 = 1 .
CALL METHOD OF r_ole->s_ole-tmp_range_col 'AutoFit' NO FLUSH.

* get adjusted column width


GET PROPERTY OF r_ole->s_ole-tmp_range_col 'ColumnWidth' =
s_ole_variables-width no flush .

cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 1 ) .


r_ole->free_ole_object( 'tmp_range_col' ) .

* if the adjusted column width is greater than the total width of columns
of current range, we resize it
IF s_ole_variables-width GT s_ole_variables-cur_cols_width .
GET PROPERTY OF r_ole->s_ole-cur_range 'Columns' = r_ole->s_ole-
cur_range_cols no flush .
s_ole_variables-cur_cols_width = s_ole_variables-width /
s_ole_variables-cur_cols_count .
SET PROPERTY OF r_ole->s_ole-cur_range_cols 'ColumnWidth' =
s_ole_variables-cur_cols_width no flush .

cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 1 ) .


r_ole->free_ole_object( 'cur_range_cols' ) .
ENDIF .
ENDCASE .

* clear the temporary range


CALL METHOD OF r_ole->s_ole-tmp_range 'Clear' NO FLUSH .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 1 ) .

r_ole->free_ole_object( 'cur_range' ) .
r_ole->free_ole_object( 'cur_rang1' ) .
r_ole->free_ole_object( 'tmp_range' ) .
ENDLOOP .

r_ole->free_ole_object( 'activesheet' ) .

* restore cell selection


r_ole->r_spreadsheet->set_selection(
EXPORTING top = lv_selection_top
left = lv_selection_left
rows = lv_selection_rows
columns = lv_selection_columns ) .
ENDLOOP .

ENDMETHOD . "postpr_ole_autofit
METHOD postpr_vbs_autofit .
CHECK v_postprocessing_autofit IS NOT INITIAL .

DATA:
lv_selection_top TYPE i ,
lv_selection_left TYPE i ,
lv_selection_rows TYPE i ,
lv_selection_columns TYPE i ,
lt_mergecells TYPE ty_t_mergecells ,
lr_table_coll TYPE REF TO i_oi_table_collection ,
lr_error TYPE REF TO i_oi_error .
FIELD-SYMBOLS:
<sheets> TYPE ty_s_sheets .

msg_init( ) .

* initialize table collection


r_ole->r_control->get_table_collection( IMPORTING table_collection =
lr_table_coll
error =
lr_error ).
msg_io_catch( lr_error ) .
CHECK v_retcode NE c_retcode-error .

* create VBScript macros


postpr_vbs_autofit_macros_add( ) .

IF v_retcode NE c_retcode-error .
LOOP AT s_model-t_sheets ASSIGNING <sheets>
WHERE sheetdata_runtime-postprocessing_autofit IS NOT INITIAL .

CHECK v_retcode NE c_retcode-error .

* get merged cells, which needs autofit


lt_mergecells[] = <sheets>-sheetdata_runtime-t_mergecells[] .
DELETE lt_mergecells WHERE autofit_rows IS INITIAL
AND autofit_cols IS INITIAL .
CHECK lt_mergecells[] IS NOT INITIAL .

DO 1 TIMES .
* send internal table T_MERGECELLS to MS Excel application
lr_table_coll->add_table( EXPORTING table_name = 'T_MERGECELLS'
table_type =
i_oi_table_collection=>table_type_output
IMPORTING error = lr_error
CHANGING data_table = lt_mergecells ) .
msg_io_catch( lr_error ) .
CHECK v_retcode NE c_retcode-error .

* select actual worksheet


r_ole->r_spreadsheet->select_sheet( EXPORTING name = <sheets>-name
IMPORTING error = lr_error ) .
msg_io_catch( lr_error ) .
CHECK v_retcode NE c_retcode-error .

* keep actual cell selection


r_ole->r_spreadsheet->get_selection(
IMPORTING top = lv_selection_top
left = lv_selection_left
rows = lv_selection_rows
columns = lv_selection_columns ) .

* run VBScript macros


CALL METHOD OF r_ole->s_ole-vbscript 'Run' EXPORTING #1 =
'MergeCellsAutofit' .

IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t283 " text: Macros execution error
INTO v_dummy .
msg_syst_catch( ) .
ENDIF .

* restore cell selection


r_ole->r_spreadsheet->set_selection(
EXPORTING top = lv_selection_top
left = lv_selection_left
rows = lv_selection_rows
columns = lv_selection_columns ) .
ENDDO .

lr_table_coll->remove_all_tables( ) .
ENDLOOP .
ENDIF .

* free VBScript macros


FREE OBJECT r_ole->s_ole-vbscript .
CLEAR r_ole->s_ole-vbscript .

lr_table_coll->remove_all_tables( ) .

ENDMETHOD . "postpr_vbs_autofit
METHOD postpr_vbs_autofit_macros_add .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .

* add VBScript code


CONCATENATE
`Sub MergeCellsAutofit()`
` XLWB_Application.ScreenUpdating = False`

` Set XLWB_Table = XLWB_ActiveWorkbook.Container.Tables("T_MERGECELLS").Table`

` For i = 1 To XLWB_Table.Rows.Count`
` Set XLWB_TableRow = XLWB_Table.Rows(i)`
` Call MergeCellsAutofitProcess(XLWB_TableRow.Cell(1), _`
` XLWB_TableRow.Cell(2), _`
` XLWB_TableRow.Cell(3), _`
` XLWB_TableRow.Cell(4), _`
` XLWB_TableRow.Cell(5), _`
` XLWB_TableRow.Cell(6))`
` Next`
`End Sub`

`Sub MergeCellsAutofitProcess(beg_y, _`
` beg_x, _`
` end_y, _`
` end_x, _`
` autofit_rows, _`
` autofit_cols)`

` Set MySheet = XLWB_ActiveWorkbook.ActiveSheet`

` 'get merged cell range which has to be resized (i.e.current range)`


` Set CurRange = MySheet.Range(MySheet.Cells(beg_y, beg_x),
MySheet.Cells(end_y, end_x))`
` Set CurRang1 = MySheet.Range(MySheet.Cells(beg_y, beg_x),
MySheet.Cells(beg_y, beg_x))`

` 'check wrap text option`


` If CurRange.WrapText = False Then`
` Exit Sub`
` End If`

` 'calculate total height of rows in the current range`


` For Each row In CurRange.Rows`
` CurH = CurH + row.RowHeight`
` Next`

` 'calculate total width of columns in the current range`


` For Each Col In CurRange.Columns`
` CurW = CurW + Col.ColumnWidth`
` Next`

` 'copy Current range content to bottom-right corner of the worksheet


(i.e.Temporary range)`
` TmpX = MySheet.Columns.Count - CurRange.Columns.Count`
` TmpY = MySheet.Rows.Count - CurRange.Rows.Count`
` Set TmpRange = MySheet.Range(MySheet.Cells(TmpY, TmpX), MySheet.Cells(TmpY,
TmpX))`

` CurRang1.Copy`
` TmpRange.Select`
` MySheet.Paste`

` 'disable cells merging in the temporary range`


` TmpRange.MergeCells = False`

` 'now all content of the temporary range is placed in a single cell 'A1'
(temporary cell)`
` Set TmpRange = MySheet.Range(MySheet.Cells(TmpY, TmpX), MySheet.Cells(TmpY,
TmpX))`

` If autofit_rows = "X" Then`


` 'set column width of the temporary cell equal to total width of current
range`
` TmpRange.ColumnWidth = CurW`

` 'auto fit row height of the temporary cell`


` TmpRange.Rows.AutoFit`

` 'get adjusted row height`


` NewH = TmpRange.RowHeight`

` 'if the adjusted row height is greater than the total height of rows of
current range, we resize it`
` If NewH > CurH Then`
` CurRange.RowHeight = NewH / CurRange.Rows.Count + 1`
` End If`

` ElseIf autofit_cols = "X" Then`


` 'set row height of the temporary cell equal to total height of current
range`
` TmpRange.RowHeight = CurH`

` 'auto fit column width of the temporary cell`


` TmpRange.Columns.AutoFit`

` 'get adjusted column width`


` NewW = TmpRange.ColumnWidth`

` 'if the adjusted column width is greater than the total width of columns
of current range, we resize it`
` If NewW > CurW Then`
` CurRange.ColumnWidth = NewW / CurRange.Columns.Count + 1`
` End If`
` End If`

` XLWB_Application.Selection.EntireRow.Delete`
` XLWB_Application.Selection.EntireColumn.Delete`
`End Sub`
INTO s_ole_variables-vbscode SEPARATED BY cl_abap_char_utilities=>cr_lf.

CREATE OBJECT r_ole->s_ole-vbscript 'MSScriptControl.ScriptControl' NO FLUSH .


SET PROPERTY OF r_ole->s_ole-vbscript 'Language' = 'VBScript' no flush .
CALL METHOD OF r_ole->s_ole-vbscript 'AddObject' NO FLUSH EXPORTING #1 =
'XLWB_Application' #2 = r_ole->s_ole-application .
CALL METHOD OF r_ole->s_ole-vbscript 'AddObject' NO FLUSH EXPORTING #1 =
'XLWB_ActiveWorkbook' #2 = r_ole->s_ole-activeworkbook .
CALL METHOD OF r_ole->s_ole-vbscript 'AddCode' NO FLUSH EXPORTING #1 =
s_ole_variables-vbscode .

cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 1 ) .


CHECK sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t282 " text: Macros initialization error
INTO v_dummy .
msg_syst_catch( ) .
ENDMETHOD . "postpr_vbs_autofit_macros_add
METHOD postpr_vbs_nopgbrk .
CHECK v_postprocessing_nopgbrk IS NOT INITIAL .

TYPES:
BEGIN OF ty_s_nopgbrk ,
beg TYPE i ,
end TYPE i ,
END OF ty_s_nopgbrk ,
ty_t_nopgbrk TYPE STANDARD TABLE OF ty_s_nopgbrk .
DATA:
lv_selection_top TYPE i ,
lv_selection_left TYPE i ,
lv_selection_rows TYPE i ,
lv_selection_columns TYPE i ,
lr_table_coll TYPE REF TO i_oi_table_collection ,
lr_error TYPE REF TO i_oi_error ,
ls_nopgbrk TYPE ty_s_nopgbrk ,
lt_nopgbrk_horizontal TYPE ty_t_nopgbrk ,
lt_nopgbrk_vertical TYPE ty_t_nopgbrk .
FIELD-SYMBOLS:
<sheets> TYPE ty_s_sheets ,
<nopgbrk_range> TYPE ty_s_nopgbrk_range .

msg_init( ) .

* initialize table collection


r_ole->r_control->get_table_collection( IMPORTING table_collection =
lr_table_coll
error =
lr_error ).
msg_io_catch( lr_error ) .
CHECK v_retcode NE c_retcode-error .

* create VBScript macros


postpr_vbs_nopgbrk_macros_add( ) .

IF v_retcode NE c_retcode-error .
LOOP AT s_model-t_sheets ASSIGNING <sheets>
WHERE sheetdata_runtime-postprocessing_nopgbrk IS NOT INITIAL .

CHECK v_retcode NE c_retcode-error .

* get merged cells, which needs autofit


CLEAR lt_nopgbrk_horizontal .
CLEAR lt_nopgbrk_vertical .

LOOP AT <sheets>-sheetdata_runtime-t_nopgbrk_range ASSIGNING


<nopgbrk_range> .
CLEAR ls_nopgbrk .
IF <nopgbrk_range>-top IS NOT INITIAL .
ls_nopgbrk-beg = <nopgbrk_range>-beg_y .
ls_nopgbrk-end = <nopgbrk_range>-end_y .
CHECK ls_nopgbrk-beg IS NOT INITIAL
AND ls_nopgbrk-end IS NOT INITIAL .
COLLECT ls_nopgbrk INTO lt_nopgbrk_horizontal .
ELSEIF <nopgbrk_range>-left IS NOT INITIAL .
ls_nopgbrk-beg = <nopgbrk_range>-beg_x .
ls_nopgbrk-end = <nopgbrk_range>-end_x .
CHECK ls_nopgbrk-beg IS NOT INITIAL
AND ls_nopgbrk-end IS NOT INITIAL .
COLLECT ls_nopgbrk INTO lt_nopgbrk_vertical .
ENDIF .
ENDLOOP .

CHECK lt_nopgbrk_horizontal[] IS NOT INITIAL


OR lt_nopgbrk_vertical[] IS NOT INITIAL .

DO 1 TIMES .
* send internal tables T_NOPGBRK_HORIZONTAL and T_NOPGBRK_VERTICAL to MS
Excel application
lr_table_coll->add_table( EXPORTING table_name = 'T_NOPGBRK_HORIZONTAL'
table_type =
i_oi_table_collection=>table_type_output
IMPORTING error = lr_error
CHANGING data_table = lt_nopgbrk_horizontal )
.
msg_io_catch( lr_error ) .
CHECK v_retcode NE c_retcode-error .

lr_table_coll->add_table( EXPORTING table_name = 'T_NOPGBRK_VERTICAL'


table_type =
i_oi_table_collection=>table_type_output
IMPORTING error = lr_error
CHANGING data_table = lt_nopgbrk_vertical ) .
msg_io_catch( lr_error ) .
CHECK v_retcode NE c_retcode-error .

* select actual worksheet


r_ole->r_spreadsheet->select_sheet( EXPORTING name = <sheets>-name
IMPORTING error = lr_error ) .
msg_io_catch( lr_error ) .
CHECK v_retcode NE c_retcode-error .

* keep actual cell selection


r_ole->r_spreadsheet->get_selection(
IMPORTING top = lv_selection_top
left = lv_selection_left
rows = lv_selection_rows
columns = lv_selection_columns ) .

* run VBScript macros


CALL METHOD OF r_ole->s_ole-vbscript 'Run' EXPORTING #1 =
'PreventingAutoPageBreaks' .

IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t283 " text: Macros execution error
INTO v_dummy .
msg_syst_catch( ) .
ENDIF .

* restore cell selection


r_ole->r_spreadsheet->set_selection(
EXPORTING top = lv_selection_top
left = lv_selection_left
rows = lv_selection_rows
columns = lv_selection_columns ) .
ENDDO .

lr_table_coll->remove_all_tables( ) .
ENDLOOP .
ENDIF .

* free VBS macros


FREE OBJECT r_ole->s_ole-vbscript .
CLEAR r_ole->s_ole-vbscript .

lr_table_coll->remove_all_tables( ) .

ENDMETHOD . "postpr_vbs_nopgbrk
METHOD postpr_vbs_nopgbrk_macros_add .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .

* add VBScript code


CONCATENATE
`Sub PreventingAutoPageBreaks()`
` Set MySheet = XLWB_ActiveWorkbook.ActiveSheet`

` XLWB_Application.ScreenUpdating = False`
` XLWB_Application.ActiveWindow.View = xlPageBreakPreview`

` 'revise Horizontal page breaks`


` Set XLWB_Table =
XLWB_ActiveWorkbook.Container.Tables("T_NOPGBRK_HORIZONTAL").Table`
` If XLWB_Table.Rows.Count > 0 Then`
` For i = 1 To XLWB_Table.Rows.Count`
` Set XLWB_TableRow = XLWB_Table.Rows(i)`
` For Each PgBrk In MySheet.HPageBreaks`
` If PgBrk.Type = xlPageBreakAutomatic Then`
` If PgBrk.Row > XLWB_TableRow.Cell(1) And PgBrk.Row <=
XLWB_TableRow.Cell(2) Then`
` Set AnchorCell = MySheet.Cells(1,
XLWB_TableRow.Cell(1))`
` Set PgBrk.Location = Range(AnchorCell, AnchorCell)`
` End If`
` End If`
` Next`
` Next`
` End If`

` 'revise Vertical page breaks`


` Set XLWB_Table =
XLWB_ActiveWorkbook.Container.Tables("T_NOPGBRK_VERTICAL").Table`
` If XLWB_Table.Rows.Count > 0 Then`
` For i = 1 To XLWB_Table.Rows.Count`
` Set XLWB_TableRow = XLWB_Table.Rows(i)`
` For Each PgBrk In MySheet.VPageBreaks`
` If PgBrk.Type = xlPageBreakAutomatic Then`
` If PgBrk.Column > XLWB_TableRow.Cell(1) And PgBrk.Column
<= XLWB_TableRow.Cell(2) Then`
` Set AnchorCell = MySheet.Cells(XLWB_TableRow.Cell(1),
1)`
` Set PgBrk.Location = Range(AnchorCell, AnchorCell)`
` End If`
` End If`
` Next`
` Next`
` End If`
`End Sub`
INTO s_ole_variables-vbscode SEPARATED BY cl_abap_char_utilities=>cr_lf.

CREATE OBJECT r_ole->s_ole-vbscript 'MSScriptControl.ScriptControl' NO FLUSH .


SET PROPERTY OF r_ole->s_ole-vbscript 'Language' = 'VBScript' no flush .
CALL METHOD OF r_ole->s_ole-vbscript 'AddObject' NO FLUSH EXPORTING #1 =
'XLWB_Application' #2 = r_ole->s_ole-application .
CALL METHOD OF r_ole->s_ole-vbscript 'AddObject' NO FLUSH EXPORTING #1 =
'XLWB_ActiveWorkbook' #2 = r_ole->s_ole-activeworkbook .
CALL METHOD OF r_ole->s_ole-vbscript 'AddCode' NO FLUSH EXPORTING #1 =
s_ole_variables-vbscode .

cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 1 ) .


CHECK sy-subrc NE 0 .

MESSAGE e000(lp) WITH v_text-t282 " text: Macros initialization error


INTO v_dummy .
msg_syst_catch( ) .
ENDMETHOD . "postpr_vbs_nopgbrk_macros_add
METHOD postpr_vbs_final .
CHECK cv_vbs_code IS NOT INITIAL .

DATA:
lr_table_coll TYPE REF TO i_oi_table_collection ,
lr_table_data_copy TYPE REF TO data ,
lr_error TYPE REF TO i_oi_error .
FIELD-SYMBOLS:
<ls_vbs_tables_tab> TYPE ty_s_vbs_tables_tab ,
<lt_table_data> TYPE ANY TABLE ,
<lt_table_data_copy> TYPE ANY TABLE .

DO 1 TIMES .
CHECK ct_vbs_tables_tab[] IS NOT INITIAL .

* initialize table collection


r_ole->r_control->get_table_collection( IMPORTING table_collection =
lr_table_coll
error = lr_error
) .
msg_io_catch( lr_error ) .
CHECK v_retcode NE c_retcode-error .

* send internal tables to MS Excel application


LOOP AT ct_vbs_tables_tab ASSIGNING <ls_vbs_tables_tab> .
UNASSIGN <lt_table_data> .
UNASSIGN <lt_table_data_copy> .
FREE lr_table_data_copy .

ASSIGN <ls_vbs_tables_tab>-table_data->* TO <lt_table_data> .


CHECK <lt_table_data> IS ASSIGNED .

CREATE DATA lr_table_data_copy LIKE <lt_table_data> .


ASSIGN lr_table_data_copy->* TO <lt_table_data_copy> .
<lt_table_data_copy> = <lt_table_data> .
CHECK <lt_table_data_copy> IS ASSIGNED .

lr_table_coll->add_table( EXPORTING table_name = <ls_vbs_tables_tab>-


table_name
table_type =
i_oi_table_collection=>table_type_output
IMPORTING error = lr_error
CHANGING data_table = <lt_table_data_copy> ) .
msg_io_catch( lr_error ) .
CHECK v_retcode NE c_retcode-error .
EXIT .
ENDLOOP .
ENDDO .

DO 1 TIMES .
CHECK v_retcode NE c_retcode-error .

* add VBScript code


cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .
CREATE OBJECT r_ole->s_ole-vbscript 'MSScriptControl.ScriptControl' NO
FLUSH .
SET PROPERTY OF r_ole->s_ole-vbscript 'Language' = 'VBScript' no flush .
CALL METHOD OF r_ole->s_ole-vbscript 'AddObject' NO FLUSH EXPORTING #1 =
'XLWB_Application' #2 = r_ole->s_ole-application .
CALL METHOD OF r_ole->s_ole-vbscript 'AddObject' NO FLUSH EXPORTING #1 =
'XLWB_ActiveWorkbook' #2 = r_ole->s_ole-activeworkbook .
CALL METHOD OF r_ole->s_ole-vbscript 'AddCode' NO FLUSH EXPORTING #1 =
cv_vbs_code .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 1 ) .
IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t282 INTO v_dummy . " text: Macros
initialization error
msg_syst_catch( ) .
EXIT .
ENDIF .

* run VBScript macros


CALL METHOD OF r_ole->s_ole-vbscript 'Run' EXPORTING #1 = 'Entry' .

IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t283 INTO v_dummy . " text: Macros execution
error
msg_syst_catch( ) .
EXIT .
ENDIF .
ENDDO .

* release objects
IF r_ole->s_ole-vbscript IS NOT INITIAL .
FREE OBJECT r_ole->s_ole-vbscript .
CLEAR r_ole->s_ole-vbscript .
ENDIF .
IF lr_table_coll IS BOUND .
lr_table_coll->remove_all_tables( ) .
ENDIF .

ENDMETHOD . "postpr_vbs_final
METHOD begin_drawing .
APPEND is_drawings_tmp TO t_drawings_tmp .

ENDMETHOD . "begin_drawing
METHOD begin_chart .

APPEND is_drawings_tmp TO t_drawings_tmp .

ENDMETHOD . "begin_chart
METHOD begin_pattern .

s_patterns = is_patterns .
CLEAR t_drawings_tmp .

ENDMETHOD . "begin_pattern
METHOD finalize_pattern .

DATA:
ls_cells TYPE ty_s_cells ,
ls_sharedstrings TYPE ty_s_sharedstrings ,
ls_calcchain TYPE ty_s_calcchain ,
ls_mergecells_rel TYPE ty_s_mergecells_rel ,
ls_mergecells TYPE ty_s_mergecells ,
ls_patternarea TYPE ty_s_coordinates ,
ls_drawings_tmp TYPE ty_s_drawings_tmp ,
ls_drawings TYPE ty_s_drawings ,
ls_media TYPE ty_s_media ,
ls_charts TYPE ty_s_charts ,
ls_datavalid TYPE ty_s_datavalid_rt .
DATA:
ls_colprop TYPE ty_s_colprop ,
ls_rowprop TYPE ty_s_rowprop .
FIELD-SYMBOLS:
<cells> TYPE ty_s_cells ,
<sharedstrings> TYPE ty_s_sharedstrings ,
<colprop> TYPE ty_s_colprop ,
<rowprop> TYPE ty_s_rowprop ,
<datavalid> TYPE ty_s_datavalid_rt ,
<coordinates> TYPE ty_s_coordinates .

* calculate absolute coordinates of pattern margins


ls_patternarea-beg_y = cv_top + 1 .
ls_patternarea-end_y = cv_top + s_patterns-rows .
ls_patternarea-beg_x = cv_left + 1 .
ls_patternarea-end_x = cv_left + s_patterns-columns .

* add cells with adjusting coordinates


LOOP AT s_patterns-t_cells INTO ls_cells .
ls_cells-y = ls_cells-y + cv_top - s_patterns-top + 1 .
ls_cells-x = ls_cells-x + cv_left - s_patterns-left + 1 .

* formula works
DO 1 TIMES .
CHECK ls_cells-formula IS NOT INITIAL .

* correct the formula


IF ls_cells-formula(1) EQ '=' .
ls_cells-formula = ls_cells-formula+1 .
ENDIF .
CHECK ls_cells-formula IS NOT INITIAL .
* convert formula notation: R1C1 to A1 (if required)
conv_formula_r1c1_a1( EXPORTING iv_y = ls_cells-y
iv_x = ls_cells-x
CHANGING cv_formula = ls_cells-formula ) .

* add formula to the calculation chain


ls_calcchain-sheet_index = s_sheets-index .
ls_calcchain-y = ls_cells-y .
ls_calcchain-x = ls_cells-x .
APPEND ls_calcchain TO s_model-t_calcchain[] .
ENDDO .

* shared strings for textmark


DO 1 TIMES .
CHECK ls_cells-tmp_flag IS NOT INITIAL .

READ TABLE s_model-t_sharedstrings ASSIGNING <sharedstrings>


WITH TABLE KEY value = ls_cells-tmp_value_s .
IF sy-subrc NE 0 .
ls_sharedstrings-value = ls_cells-tmp_value_s .
ls_sharedstrings-key = LINES( s_model-t_sharedstrings ) .
ls_sharedstrings-si_node = ls_cells-tmp_si_node .
INSERT ls_sharedstrings INTO TABLE s_model-t_sharedstrings
ASSIGNING <sharedstrings> .
ENDIF .
CHECK <sharedstrings> IS ASSIGNED .
ls_cells-value = <sharedstrings>-key .
ENDDO .

* data validation info


DO 1 TIMES .
CHECK ls_cells-datavalidation-formula1 IS NOT INITIAL
OR ls_cells-datavalidation-formula2 IS NOT INITIAL .

READ TABLE s_sheets-sheetdata_runtime-t_datavalid ASSIGNING <datavalid>


WITH KEY allowblank = ls_cells-datavalidation-allowblank
error = ls_cells-datavalidation-error
errorstyle = ls_cells-datavalidation-errorstyle
errortitle = ls_cells-datavalidation-errortitle
imemode = ls_cells-datavalidation-imemode
operator = ls_cells-datavalidation-operator
prompt = ls_cells-datavalidation-prompt
prompttitle = ls_cells-datavalidation-prompttitle
showdropdown = ls_cells-datavalidation-showdropdown
showerrormessage = ls_cells-datavalidation-showerrormessage
showinputmessage = ls_cells-datavalidation-showinputmessage
type = ls_cells-datavalidation-type
formula1 = ls_cells-datavalidation-formula1
formula1_dataset_id = ls_cells-datavalidation-
formula1_dataset_id
formula1_dataset_fld = ls_cells-datavalidation-
formula1_dataset_fld
formula1_dataset_rt_path_1 = ls_cells-datavalidation-
formula1_dataset_rt_path_1
formula2 = ls_cells-datavalidation-formula2
BINARY SEARCH .
IF sy-subrc NE 0 .
CLEAR ls_datavalid .
MOVE-CORRESPONDING ls_cells-datavalidation TO ls_datavalid .
INSERT ls_datavalid INTO TABLE s_sheets-sheetdata_runtime-t_datavalid
ASSIGNING <datavalid> .
ENDIF .
CHECK <datavalid> IS ASSIGNED .

READ TABLE <datavalid>-t_coordinates TRANSPORTING NO FIELDS


WITH KEY beg_x = ls_cells-x
beg_y = ls_cells-y .
CHECK sy-subrc NE 0 .

APPEND INITIAL LINE TO <datavalid>-t_coordinates ASSIGNING <coordinates> .


<coordinates>-beg_x = ls_cells-x .
<coordinates>-beg_y = ls_cells-y .
ENDDO .

* add cell to the sheet


READ TABLE s_sheets-sheetdata_runtime-t_cells ASSIGNING <cells>
WITH KEY y = ls_cells-y x = ls_cells-x BINARY SEARCH .
IF sy-subrc EQ 0 .
<cells>-style = ls_cells-style .
<cells>-type = ls_cells-type .
<cells>-value = ls_cells-value .
<cells>-formula = ls_cells-formula .
ELSE .
INSERT ls_cells INTO TABLE s_sheets-sheetdata_runtime-t_cells .
ENDIF .
ENDLOOP .

* add info of the cells merging with adjusting coordinates


LOOP AT s_patterns-t_mergecells INTO ls_mergecells_rel .
ls_mergecells-beg_y = cv_top + ls_mergecells_rel-top - s_patterns-top +
1 .
ls_mergecells-end_y = cv_top + ls_mergecells_rel-top - s_patterns-top +
ls_mergecells_rel-rows .
ls_mergecells-beg_x = cv_left + ls_mergecells_rel-left - s_patterns-left +
1 .
ls_mergecells-end_x = cv_left + ls_mergecells_rel-left - s_patterns-left +
ls_mergecells_rel-columns .
ls_mergecells-autofit_rows = ls_mergecells_rel-autofit_rows .
ls_mergecells-autofit_cols = ls_mergecells_rel-autofit_cols .
IF iv_autofitmerged_r IS SUPPLIED .
ls_mergecells-autofit_rows = iv_autofitmerged_r .
ENDIF .
IF iv_autofitmerged_c IS SUPPLIED .
ls_mergecells-autofit_cols = iv_autofitmerged_c .
ENDIF .
INSERT ls_mergecells INTO TABLE s_sheets-sheetdata_runtime-t_mergecells .

CHECK ls_mergecells-autofit_rows IS NOT INITIAL


OR ls_mergecells-autofit_cols IS NOT INITIAL .

v_postprocessing_autofit = abap_on .
s_sheets-sheetdata_runtime-postprocessing_autofit = abap_on .
ENDLOOP .

* add info about Drawings


LOOP AT t_drawings_tmp INTO ls_drawings_tmp .
CLEAR ls_drawings .
ls_drawings-drawing_type = ls_drawings_tmp-drawing_type .

CASE ls_drawings-drawing_type .
WHEN c_drawing_type-vector .
ls_drawings-twocellanchor_node = ls_drawings_tmp-twocellanchor_node .

WHEN c_drawing_type-bitmap .
READ TABLE s_model-t_media INTO ls_media
WITH TABLE KEY media_rawdata = ls_drawings_tmp-media_rawdata .
IF sy-subrc NE 0 .
ADD 1 TO s_model-v_refer_id . CONDENSE s_model-v_refer_id NO-GAPS .

CLEAR ls_media .
ls_media-media_rawdata = ls_drawings_tmp-media_rawdata .
ls_media-id = s_model-v_refer_id .
INSERT ls_media INTO TABLE s_model-t_media .
ENDIF .
ls_drawings-refer_id = ls_media-id .

WHEN c_drawing_type-chart .
ADD 1 TO s_model-v_refer_id . CONDENSE s_model-v_refer_id NO-GAPS .

CLEAR ls_charts .
ls_charts-id = s_model-v_refer_id .
ls_charts-chart_ixml_doc = ls_drawings_tmp-chart_ixml_doc .
ls_charts-chartcolors_ixml_doc = ls_drawings_tmp-chartcolors_ixml_doc .
ls_charts-chartstyle_ixml_doc = ls_drawings_tmp-chartstyle_ixml_doc .
ls_charts-chart_series_title = ls_drawings_tmp-chart_series_title .
ls_charts-chart_title = ls_drawings_tmp-chart_title .
ls_charts-chart_title_tx = ls_drawings_tmp-chart_title_tx .
ls_charts-chart_catax_title = ls_drawings_tmp-chart_catax_title .
ls_charts-chart_catax_title_tx = ls_drawings_tmp-chart_catax_title_tx .
ls_charts-chart_valax_title = ls_drawings_tmp-chart_valax_title .
ls_charts-chart_valax_title_tx = ls_drawings_tmp-chart_valax_title_tx .
ls_charts-dataset_series_tab[] = ls_drawings_tmp-dataset_series_tab[] .
ls_charts-dataset_id = ls_drawings_tmp-dataset_id .
ls_charts-dataset_rt_path_1 = ls_drawings_tmp-dataset_rt_path_1 .
INSERT ls_charts INTO TABLE s_model-t_charts .

ls_drawings-twocellanchor_node = ls_drawings_tmp-twocellanchor_node .
ls_drawings-refer_id = ls_charts-id .
ENDCASE .

ls_drawings-beg_y = cv_top + ls_drawings_tmp-top - s_patterns-top .


ls_drawings-beg_x = cv_left + ls_drawings_tmp-left - s_patterns-left .
IF ls_drawings_tmp-drawing_size_h GT 0
AND ls_drawings_tmp-drawing_size_w GT 0 .
ls_drawings-drawing_size_h = ls_drawings_tmp-drawing_size_h .
ls_drawings-drawing_size_w = ls_drawings_tmp-drawing_size_w .
ELSE .
ls_drawings-end_y = cv_top + ls_drawings_tmp-top - s_patterns-top +
ls_drawings_tmp-rows .
ls_drawings-end_x = cv_left + ls_drawings_tmp-left - s_patterns-left +
ls_drawings_tmp-columns .
ENDIF .

APPEND ls_drawings TO s_sheets-sheetdata_runtime-t_drawings .


ENDLOOP .
* revise a dimension of data on the sheet
IF s_sheets-sheetdata_runtime-beg_y IS INITIAL
OR s_sheets-sheetdata_runtime-beg_y GT ls_patternarea-beg_y .
s_sheets-sheetdata_runtime-beg_y = ls_patternarea-beg_y .
ENDIF .
IF s_sheets-sheetdata_runtime-beg_x IS INITIAL
OR s_sheets-sheetdata_runtime-beg_x GT ls_patternarea-beg_x .
s_sheets-sheetdata_runtime-beg_x = ls_patternarea-beg_x .
ENDIF .
IF s_sheets-sheetdata_runtime-end_y IS INITIAL
OR s_sheets-sheetdata_runtime-end_y LT ls_patternarea-end_y .
s_sheets-sheetdata_runtime-end_y = ls_patternarea-end_y .
ENDIF .
IF s_sheets-sheetdata_runtime-end_x IS INITIAL
OR s_sheets-sheetdata_runtime-end_x LT ls_patternarea-end_x .
s_sheets-sheetdata_runtime-end_x = ls_patternarea-end_x .
ENDIF .

* properties of the rows


LOOP AT s_patterns-t_rowprop INTO ls_rowprop .
ls_rowprop-y = ls_rowprop-y + cv_top - s_patterns-top + 1 .

READ TABLE s_sheets-sheetdata_runtime-t_rowprop


ASSIGNING <rowprop> WITH TABLE KEY y = ls_rowprop-y .
IF sy-subrc EQ 0 .
<rowprop>-s = ls_rowprop-s .
<rowprop>-customformat = ls_rowprop-customformat.
<rowprop>-ht = ls_rowprop-ht .
<rowprop>-customheight = ls_rowprop-customheight.
<rowprop>-hidden = ls_rowprop-hidden .
IF ls_rowprop-outlinelevel IS NOT INITIAL .
<rowprop>-collapsed = ls_rowprop-collapsed .
<rowprop>-outlinelevel = ls_rowprop-outlinelevel.
ENDIF .
ELSE .
INSERT ls_rowprop INTO TABLE s_sheets-sheetdata_runtime-t_rowprop .
ENDIF .
ENDLOOP .

* properties of the columns


LOOP AT s_patterns-t_colprop INTO ls_colprop .
ls_colprop-x = ls_colprop-x + cv_left - s_patterns-left + 1 .

READ TABLE s_sheets-sheetdata_runtime-t_colprop


ASSIGNING <colprop> WITH KEY x = ls_colprop-x BINARY SEARCH .
IF sy-subrc EQ 0 .
<colprop>-width = ls_colprop-width .
<colprop>-style = ls_colprop-style .
<colprop>-hidden = ls_colprop-hidden .
<colprop>-bestfit = ls_colprop-bestfit .
<colprop>-customwidth = ls_colprop-customwidth .
IF ls_colprop-outlinelevel IS NOT INITIAL .
<colprop>-collapsed = ls_colprop-collapsed .
<colprop>-outlinelevel = ls_colprop-outlinelevel.
ENDIF .
ELSE .
INSERT ls_colprop INTO TABLE s_sheets-sheetdata_runtime-t_colprop .
ENDIF .
ENDLOOP .

* print titles: Rows


IF iv_printtitles_r IS NOT INITIAL .
s_sheets-sheetdata_runtime-printtitles-beg_y = ls_patternarea-beg_y .
s_sheets-sheetdata_runtime-printtitles-end_y = ls_patternarea-end_y .
ENDIF .
* print titles: Columns
IF iv_printtitles_c IS NOT INITIAL .
s_sheets-sheetdata_runtime-printtitles-beg_x = ls_patternarea-beg_x .
s_sheets-sheetdata_runtime-printtitles-end_x = ls_patternarea-end_x .
ENDIF .

ENDMETHOD . "finalize_pattern
METHOD finalize_respattern .

DATA:
ls_mergecells TYPE ty_s_mergecells ,
ls_drawings TYPE ty_s_drawings ,
ls_cells_src TYPE ty_s_cells ,
ls_cells_new TYPE ty_s_cells .
FIELD-SYMBOLS:
<mergecells> TYPE ty_s_mergecells ,
<drawings> TYPE ty_s_drawings .

CASE abap_on .
*======================================================================
WHEN iv_rowspan .
*======================================================================
DO iv_columns TIMES .
CLEAR ls_mergecells .
ls_mergecells-beg_y = iv_top + 1 .
ls_mergecells-end_y = iv_top + iv_rows .
ls_mergecells-beg_x =
ls_mergecells-end_x = iv_left + sy-index .
IF iv_rows GT 1 .
ls_mergecells-autofit_rows = iv_autofitmerged_r .
ls_mergecells-autofit_cols = iv_autofitmerged_c .
READ TABLE it_autofitmerged_r TRANSPORTING NO FIELDS
WITH TABLE KEY table_line = sy-index .
IF sy-subrc EQ 0 .
ls_mergecells-autofit_rows = abap_on .
ENDIF .
ls_mergecells-autofit_cols = iv_autofitmerged_c .
READ TABLE it_autofitmerged_c TRANSPORTING NO FIELDS
WITH TABLE KEY table_line = sy-index .
IF sy-subrc EQ 0 .
ls_mergecells-autofit_cols = abap_on .
ENDIF .
LOOP AT s_sheets-sheetdata_runtime-t_mergecells ASSIGNING <mergecells>
WHERE beg_y EQ ls_mergecells-beg_y
AND beg_x LE ls_mergecells-beg_x
AND end_x GE ls_mergecells-end_x .
<mergecells>-end_y = ls_mergecells-end_y .
<mergecells>-autofit_rows = ls_mergecells-autofit_rows .
<mergecells>-autofit_cols = ls_mergecells-autofit_cols .
ENDLOOP .
IF sy-subrc NE 0 .
INSERT ls_mergecells INTO TABLE s_sheets-sheetdata_runtime-
t_mergecells .
ENDIF .
IF ls_mergecells-autofit_rows IS NOT INITIAL
OR ls_mergecells-autofit_cols IS NOT INITIAL .
v_postprocessing_autofit = abap_on .
s_sheets-sheetdata_runtime-postprocessing_autofit = abap_on .
ENDIF .

ls_drawings-beg_y = ls_mergecells-beg_y - 1 .
ls_drawings-beg_x = ls_mergecells-beg_x - 1 .
ls_drawings-end_x = ls_mergecells-end_x .
ls_drawings-end_y = ls_mergecells-end_y .
LOOP AT s_sheets-sheetdata_runtime-t_drawings ASSIGNING <drawings>
WHERE drawing_size_h EQ 0
AND drawing_size_w EQ 0
AND beg_y EQ ls_drawings-beg_y
AND beg_x LE ls_drawings-beg_x
AND end_x GE ls_drawings-end_x .
<drawings>-end_y = ls_drawings-end_y .
ENDLOOP .
ENDIF .

READ TABLE s_sheets-sheetdata_runtime-t_cells INTO ls_cells_src


WITH KEY y = ls_mergecells-beg_y
x = ls_mergecells-beg_x
BINARY SEARCH .
IF sy-subrc EQ 0 .
DO iv_rows TIMES .
CHECK sy-index GT 1 .

CLEAR ls_cells_new .
ls_cells_new-y = iv_top + sy-index .
ls_cells_new-x = ls_cells_src-x .
ls_cells_new-style = ls_cells_src-style .
INSERT ls_cells_new INTO TABLE s_sheets-sheetdata_runtime-t_cells .
ENDDO .
ENDIF .
ENDDO .

*======================================================================
WHEN iv_colspan .
*======================================================================
DO iv_rows TIMES .
CLEAR ls_mergecells .
ls_mergecells-beg_y =
ls_mergecells-end_y = iv_top + sy-index .
ls_mergecells-beg_x = iv_left + 1 .
ls_mergecells-end_x = iv_left + iv_columns .
IF iv_columns GT 1 .
ls_mergecells-autofit_rows = iv_autofitmerged_r .
ls_mergecells-autofit_cols = iv_autofitmerged_c .
READ TABLE it_autofitmerged_r TRANSPORTING NO FIELDS
WITH TABLE KEY table_line = sy-index .
IF sy-subrc EQ 0 .
ls_mergecells-autofit_rows = abap_on .
ENDIF .
ls_mergecells-autofit_cols = iv_autofitmerged_c .
READ TABLE it_autofitmerged_c TRANSPORTING NO FIELDS
WITH TABLE KEY table_line = sy-index .
IF sy-subrc EQ 0 .
ls_mergecells-autofit_cols = abap_on .
ENDIF .
LOOP AT s_sheets-sheetdata_runtime-t_mergecells ASSIGNING <mergecells>
WHERE beg_x EQ ls_mergecells-beg_x
AND beg_y LE ls_mergecells-beg_y
AND end_y GE ls_mergecells-end_y .
<mergecells>-end_x = ls_mergecells-end_x .
<mergecells>-autofit_rows = ls_mergecells-autofit_rows .
<mergecells>-autofit_cols = ls_mergecells-autofit_cols .
ENDLOOP .
IF sy-subrc NE 0 .
INSERT ls_mergecells INTO TABLE s_sheets-sheetdata_runtime-
t_mergecells .
ENDIF .
IF ls_mergecells-autofit_rows IS NOT INITIAL
OR ls_mergecells-autofit_cols IS NOT INITIAL .
v_postprocessing_autofit = abap_on .
s_sheets-sheetdata_runtime-postprocessing_autofit = abap_on .
ENDIF .

ls_drawings-beg_y = ls_mergecells-beg_y - 1 .
ls_drawings-beg_x = ls_mergecells-beg_x - 1 .
ls_drawings-end_x = ls_mergecells-end_x .
ls_drawings-end_y = ls_mergecells-end_y .
LOOP AT s_sheets-sheetdata_runtime-t_drawings ASSIGNING <drawings>
WHERE drawing_size_h EQ 0
AND drawing_size_w EQ 0
AND beg_x EQ ls_drawings-beg_x
AND beg_y LE ls_drawings-beg_y
AND end_y GE ls_drawings-end_y .
<drawings>-end_x = ls_drawings-end_x .
ENDLOOP .
ENDIF .

READ TABLE s_sheets-sheetdata_runtime-t_cells INTO ls_cells_src


WITH KEY y = ls_mergecells-beg_y
x = ls_mergecells-beg_x
BINARY SEARCH .
IF sy-subrc EQ 0 .
DO iv_columns TIMES .
CHECK sy-index GT 1 .

CLEAR ls_cells_new .
ls_cells_new-y = ls_cells_src-y .
ls_cells_new-x = iv_left + sy-index .
ls_cells_new-style = ls_cells_src-style .
INSERT ls_cells_new INTO TABLE s_sheets-sheetdata_runtime-t_cells .
ENDDO .
ENDIF .
ENDDO .
ENDCASE .

ENDMETHOD . "finalize_respattern
METHOD finalize_grid .
DATA:
ls_datasets TYPE ty_s_datasets ,
ls_dataset_refs TYPE ty_s_dataset_refs ,
ls_ref_fields TYPE ty_s_dataset_ref_fields .
FIELD-SYMBOLS:
<datasets> TYPE ty_s_datasets .

* dataset info
IF it_ref_fields[] IS NOT INITIAL .
READ TABLE s_model-t_datasets ASSIGNING <datasets> WITH TABLE KEY id =
iv_form_id .
IF sy-subrc NE 0 .
ls_datasets-id = iv_form_id .
INSERT ls_datasets INTO TABLE s_model-t_datasets ASSIGNING <datasets> .
ENDIF .

ls_dataset_refs-rt_path_1 = iv_rt_path_1 . " -->> runtime path (for


dataset subordination)
ls_dataset_refs-sheetname = s_sheets-name .
LOOP AT it_ref_fields INTO ls_ref_fields .
conv_ref_nc( EXPORTING iv_beg_x = ls_ref_fields-beg_x
iv_beg_y = ls_ref_fields-beg_y
iv_end_x = ls_ref_fields-end_x
iv_end_y = ls_ref_fields-end_y
iv_prefix = '$'
iv_sheetname = s_sheets-name
IMPORTING ev_ref = ls_ref_fields-ref
ev_ref_2 = ls_ref_fields-ref_2 ) .

IF ls_ref_fields-caption_x IS NOT INITIAL


AND ls_ref_fields-caption_y IS NOT INITIAL .
conv_ref_nc( EXPORTING iv_beg_x = ls_ref_fields-caption_x
iv_beg_y = ls_ref_fields-caption_y
iv_prefix = '$'
iv_sheetname = s_sheets-name
IMPORTING ev_ref = ls_ref_fields-caption_ref ) .
ENDIF .

APPEND ls_ref_fields TO ls_dataset_refs-t_fields .


ENDLOOP .

INSERT ls_dataset_refs INTO TABLE <datasets>-t_refs .


ENDIF .

ENDMETHOD . "finalize_grid
ENDCLASS . "lcl_excelruntime IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_exceltemplate DEFINITION
*----------------------------------------------------------------------*
* excel template buffer
*----------------------------------------------------------------------*
CLASS lcl_exceltemplate DEFINITION INHERITING FROM lcl_excel.

PUBLIC SECTION .

METHODS:
free REDEFINITION ,
bufferization_patterns
IMPORTING value(it_patternarea) TYPE ty_t_patternarea OPTIONAL ,
get_sheet
IMPORTING iv_sheetname TYPE any
RETURNING value(rs_sheets) TYPE ty_s_sheets ,
get_pattern
IMPORTING iv_sheetname TYPE any
iv_id TYPE any
RETURNING value(rs_patterns) TYPE ty_s_patterns ,
get_drawing_static
IMPORTING iv_sheetname TYPE any
iv_drwstat_name TYPE any
RETURNING value(rs_drawings) TYPE ty_s_drawings_tmp ,
formparameters_struc_get
IMPORTING iv_path TYPE any
CHANGING cs_struc TYPE any ,
formparameters_struc_set
IMPORTING iv_path TYPE any
is_struc TYPE any ,
formparameters_table_get
IMPORTING iv_path TYPE any
CHANGING ct_tab TYPE STANDARD TABLE ,
formparameters_table_set
IMPORTING iv_path TYPE any
it_tab TYPE STANDARD TABLE .

ENDCLASS . "lcl_exceltemplate DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_exceltemplate IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_exceltemplate IMPLEMENTATION .
METHOD free .
super->free( ) .
ENDMETHOD . "FREE
METHOD bufferization_patterns .

TYPES:
BEGIN OF ty_s_datavalid_tmp .
INCLUDE TYPE ty_s_coordinates .
INCLUDE TYPE ty_s_datavalidation .
TYPES:
END OF ty_s_datavalid_tmp ,
ty_t_datavalid_tmp TYPE STANDARD TABLE OF ty_s_datavalid_tmp .
DATA:
ls_patternarea_abs TYPE ty_s_coordinates ,
ls_patterns TYPE ty_s_patterns ,
ls_cells TYPE ty_s_cells ,
lt_cells_tmp TYPE ty_t_cells ,
ls_coordinates TYPE ty_s_coordinates .
DATA:
ls_mergecells_rel TYPE ty_s_mergecells_rel ,
ls_mergecells TYPE ty_s_mergecells ,
lt_mergecells TYPE ty_t_mergecells ,
lv_mgc_index TYPE sy-index ,
lv_mgc_ref TYPE string ,
lr_mgc_ncol TYPE REF TO if_ixml_node_collection ,
lr_mgc_node TYPE REF TO if_ixml_node .
DATA:
lt_drawings TYPE ty_t_drawings_tmp ,
ls_vmldrawings TYPE ty_s_vmldrawings ,
lt_sheetrels TYPE ty_t_relstab ,
ls_sharedstrings TYPE ty_s_sharedstrings ,
lt_sharedstrings_tmp TYPE HASHED TABLE OF ty_s_sharedstrings
WITH UNIQUE KEY key ,
lv_str_index TYPE sy-index ,
lr_str_ncol TYPE REF TO if_ixml_node_collection ,
lr_str_node TYPE REF TO if_ixml_node ,
lr_str_elem TYPE REF TO if_ixml_element ,
lv_val_index TYPE sy-index ,
lr_val_ncol TYPE REF TO if_ixml_node_collection ,
lr_val_node TYPE REF TO if_ixml_node ,
lr_val_elem TYPE REF TO if_ixml_element .
DATA:
lv_row_index TYPE sy-index ,
lv_row_ref TYPE string ,
lr_row_ncol TYPE REF TO if_ixml_node_collection ,
lr_row_node TYPE REF TO if_ixml_node ,
lr_row_elem TYPE REF TO if_ixml_element .
DATA:
lr_cols_elem TYPE REF TO if_ixml_element ,
lv_col_index TYPE sy-index ,
lv_col_ref TYPE string ,
lr_col_ncol TYPE REF TO if_ixml_node_collection ,
lr_col_node TYPE REF TO if_ixml_node ,
lr_col_elem TYPE REF TO if_ixml_element .
DATA:
lr_dvls_elem TYPE REF TO if_ixml_element ,
lv_dvl_index TYPE sy-index ,
lv_dvl_ref TYPE string ,
lr_dvl_ncol TYPE REF TO if_ixml_node_collection ,
lr_dvl_node TYPE REF TO if_ixml_node ,
lr_dvl_elem TYPE REF TO if_ixml_element ,
lr_dvlf_node TYPE REF TO if_ixml_node ,
lr_dvlf_elem TYPE REF TO if_ixml_element .
DATA:
ls_rowprop TYPE ty_s_rowprop ,
lt_rowprop TYPE ty_t_rowprop ,
ls_colprop TYPE ty_s_colprop ,
lt_colprop TYPE ty_t_colprop ,
lv_stringtmp TYPE string ,
lv_min TYPE string ,
lv_max TYPE string ,
ls_datavalid_tmp TYPE ty_s_datavalid_tmp ,
lt_datavalid_tmp TYPE ty_t_datavalid_tmp ,
lv_attrname TYPE string ,
lv_sqref TYPE string ,
lt_sqref TYPE STANDARD TABLE OF string ,
lv_y TYPE i ,
lv_x TYPE i .
DATA:
lr_attr_ndmap TYPE REF TO if_ixml_named_node_map ,
lr_attr_nditerator TYPE REF TO if_ixml_node_iterator ,
lr_attr_node TYPE REF TO if_ixml_node .
FIELD-SYMBOLS:
<patternarea> TYPE ty_s_patternarea ,
<sheets> TYPE ty_s_sheets ,
<cells> TYPE ty_s_cells ,
<field> TYPE ANY .

*======================================================================
* initialization
*======================================================================
CLEAR s_model-t_sharedstrings .
FREE s_model-t_sharedstrings .
LOOP AT s_model-t_sheets ASSIGNING <sheets> .
lt_drawings[] = <sheets>-sheetdata_template-t_drawings[] .
lt_sheetrels[] = <sheets>-sheetdata_template-t_sheetrels[] .
ls_vmldrawings = <sheets>-sheetdata_template-vmldrawings .

CLEAR <sheets>-sheetdata_template .
FREE <sheets>-sheetdata_template .

<sheets>-sheetdata_template-t_drawings[] = lt_drawings[] .
<sheets>-sheetdata_template-t_sheetrels[] = lt_sheetrels[] .
<sheets>-sheetdata_template-vmldrawings = ls_vmldrawings .
ENDLOOP .

*======================================================================
* pre-read all shared strings in the workbook
*======================================================================
DO 1 TIMES .
CHECK s_model-ixml_doc_sharedstrings IS BOUND .
lr_str_ncol = s_model-ixml_doc_sharedstrings->get_elements_by_tag_name(
name = c_tag-si
depth = 1 ) .
CHECK lr_str_ncol IS BOUND .
DO .
lv_str_index = sy-index - 1 .
lr_str_node = lr_str_ncol->get_item( index = lv_str_index ) .
IF lr_str_node IS NOT BOUND. EXIT. ENDIF .
lr_str_elem ?= lr_str_node->query_interface( ixml_iid_element ).
lr_val_node = lr_str_elem->find_from_name( name = c_tag-t depth = 1 ) .

CLEAR ls_sharedstrings .
ls_sharedstrings-key = lv_str_index .
IF lr_val_node IS BOUND .
ls_sharedstrings-value = lr_val_node->get_value( ) .
ELSE . " -->> extended cell formatting
ls_sharedstrings-value = guid_create( ) .
lr_val_ncol = lr_str_elem->get_elements_by_tag_name( name = c_tag-t ) .
IF lr_val_ncol IS BOUND .
DO .
lv_val_index = sy-index - 1 .
lr_val_node = lr_val_ncol->get_item( index = lv_val_index ) .
IF lr_val_node IS NOT BOUND. EXIT. ENDIF .
lv_stringtmp = lr_val_node->get_value( ) .
CONCATENATE ls_sharedstrings-value lv_stringtmp INTO
ls_sharedstrings-value .
ENDDO .
ENDIF .
ls_sharedstrings-si_node = lr_str_node->clone( ) .
ENDIF .
INSERT ls_sharedstrings INTO TABLE lt_sharedstrings_tmp .
ENDDO .
ENDDO .

*======================================================================
* extract pattern areas information for each sheet
*======================================================================
SORT it_patternarea BY sheetname .
LOOP AT it_patternarea ASSIGNING <patternarea> .
AT NEW sheetname .

* Retrieve a current sheet from model


*======================================================================
READ TABLE s_model-t_sheets ASSIGNING <sheets>
WITH TABLE KEY name = <patternarea>-sheetname .
CHECK sy-subrc EQ 0 .

* Collect information about all cells content on the sheet


*======================================================================
CLEAR lt_cells_tmp. FREE lt_cells_tmp .
CLEAR lt_rowprop . FREE lt_rowprop .

*------------>> loop at ROWS


lr_row_ncol =
<sheets>-ixml_doc->get_elements_by_tag_name(
name = c_tag-row
depth = 3 ) .
IF lr_row_ncol IS BOUND .
DO .
lv_row_index = sy-index - 1 .
lr_row_node = lr_row_ncol->get_item( index = lv_row_index ) .
IF lr_row_node IS NOT BOUND. EXIT. ENDIF .

* get attributes of row


lr_attr_ndmap = lr_row_node->get_attributes( ) .
lr_attr_nditerator = lr_attr_ndmap->create_iterator( ) .
lr_attr_node = lr_attr_nditerator->get_next( ) .

CLEAR ls_rowprop .
WHILE lr_attr_node IS NOT INITIAL .
CASE lr_attr_node->get_name( ) .
WHEN c_tag-r . ls_rowprop-y = lv_row_ref = lr_attr_node-
>get_value( ) .
WHEN c_tag-s . ls_rowprop-s = lr_attr_node-
>get_value( ) .
WHEN c_tag-customformat . ls_rowprop-customformat = lr_attr_node-
>get_value( ) .
WHEN c_tag-ht . ls_rowprop-ht = lr_attr_node-
>get_value( ) .
WHEN c_tag-customheight . ls_rowprop-customheight = lr_attr_node-
>get_value( ) .
WHEN c_tag-hidden . ls_rowprop-hidden = lr_attr_node-
>get_value( ) .
WHEN c_tag-outlinelevel . ls_rowprop-outlinelevel = lr_attr_node-
>get_value( ) .
WHEN c_tag-collapsed . ls_rowprop-collapsed = lr_attr_node-
>get_value( ) .
ENDCASE .
lr_attr_node = lr_attr_nditerator->get_next( ) .
ENDWHILE .
INSERT ls_rowprop INTO TABLE lt_rowprop .

*------------>> loop at COLUMNS of the current row


lr_row_elem ?= lr_row_node->query_interface( ixml_iid_element ).
lr_col_ncol = lr_row_elem->get_elements_by_tag_name(
name = c_tag-c
depth = 1 ) .
CHECK lr_col_ncol IS BOUND .
DO .
lv_col_index = sy-index - 1 .
lr_col_node = lr_col_ncol->get_item( index = lv_col_index ) .
IF lr_col_node IS NOT BOUND. EXIT. ENDIF .

CLEAR ls_cells .
ls_cells-y = lv_row_ref .

xml_attrib_get( EXPORTING ir_node = lr_col_node


iv_attrib_name1 = c_tag-r
iv_attrib_name2 = c_tag-t
iv_attrib_name3 = c_tag-s
IMPORTING ev_attrib_value1 = lv_col_ref
ev_attrib_value2 = ls_cells-type
ev_attrib_value3 = ls_cells-style ) .

conv_cn( EXPORTING iv_char = lv_col_ref


IMPORTING ev_number = ls_cells-x ) .

*------------>> find a value for the current column (optional)


lr_col_elem ?= lr_col_node->query_interface( ixml_iid_element ) .
lr_val_node = lr_col_elem->find_from_name( c_tag-v ) .
IF lr_val_node IS BOUND .
ls_cells-value = lr_val_node->get_value( ) .
ENDIF .

*------------>> check: is a cell style numeric?


READ TABLE s_model-t_textformat_styles TRANSPORTING NO FIELDS
WITH TABLE KEY s = ls_cells-style .
IF sy-subrc EQ 0 .
ls_cells-textformat_style = abap_on .
ELSE .
*------------>> check: is a cell style date?
READ TABLE s_model-t_dateformat_styles TRANSPORTING NO FIELDS
WITH TABLE KEY s = ls_cells-style .
IF sy-subrc EQ 0 .
ls_cells-dateformat_style = abap_on .
ENDIF .
ENDIF .

INSERT ls_cells INTO TABLE lt_cells_tmp .


ENDDO .
ENDDO .
ENDIF .

* Read all merged cells on the sheet


*======================================================================
CLEAR lt_mergecells. FREE lt_mergecells .

lr_mgc_ncol =
<sheets>-ixml_doc->get_elements_by_tag_name(
name = c_tag-mergecell
depth = 3 ) .
IF lr_mgc_ncol IS BOUND .
DO .
lv_mgc_index = sy-index - 1 .
lr_mgc_node = lr_mgc_ncol->get_item( index = lv_mgc_index ) .
IF lr_mgc_node IS NOT BOUND. EXIT. ENDIF .

xml_attrib_get( EXPORTING ir_node = lr_mgc_node


iv_attrib_name1 = c_tag-ref
IMPORTING ev_attrib_value1 = lv_mgc_ref ) .
CHECK lv_mgc_ref IS NOT INITIAL .

conv_ref_cn( EXPORTING iv_ref = lv_mgc_ref


IMPORTING ev_beg_x = ls_mergecells-beg_x
ev_beg_y = ls_mergecells-beg_y
ev_end_x = ls_mergecells-end_x
ev_end_y = ls_mergecells-end_y ) .
INSERT ls_mergecells INTO TABLE lt_mergecells .
ENDDO .
ENDIF .

* Read properties of the all colunms on the sheet


*======================================================================
CLEAR lt_colprop . FREE lt_colprop .

lr_cols_elem = <sheets>-ixml_doc->find_from_name(
name = c_tag-cols
depth = 2 ) .
IF lr_cols_elem IS BOUND .
lr_col_ncol = lr_cols_elem->get_elements_by_tag_name(
name = c_tag-col
depth = 1 ) .
IF lr_col_ncol IS BOUND .
DO .
lv_col_index = sy-index - 1 .
lr_col_node = lr_col_ncol->get_item( index = lv_col_index ) .
IF lr_col_node IS NOT BOUND. EXIT. ENDIF .

lr_attr_ndmap = lr_col_node->get_attributes( ) .
lr_attr_nditerator = lr_attr_ndmap->create_iterator( ) .
lr_attr_node = lr_attr_nditerator->get_next( ) .

CLEAR ls_colprop .
CLEAR lv_min .
CLEAR lv_max .
WHILE lr_attr_node IS NOT INITIAL .
CASE lr_attr_node->get_name( ) .
WHEN c_tag-min . lv_min = lr_attr_node-
>get_value( ) .
WHEN c_tag-max . lv_max = lr_attr_node-
>get_value( ) .
WHEN c_tag-width . ls_colprop-width = lr_attr_node-
>get_value( ) .
WHEN c_tag-style . ls_colprop-style = lr_attr_node-
>get_value( ) .
WHEN c_tag-hidden . ls_colprop-hidden = lr_attr_node-
>get_value( ) .
WHEN c_tag-bestfit . ls_colprop-bestfit = lr_attr_node-
>get_value( ) .
WHEN c_tag-customwidth . ls_colprop-customwidth = lr_attr_node-
>get_value( ) .
WHEN c_tag-outlinelevel . ls_colprop-outlinelevel = lr_attr_node-
>get_value( ) .
WHEN c_tag-collapsed . ls_colprop-collapsed = lr_attr_node-
>get_value( ) .
ENDCASE .
lr_attr_node = lr_attr_nditerator->get_next( ) .
ENDWHILE .

IF lv_min IS NOT INITIAL


AND lv_max IS NOT INITIAL .
ls_colprop-x = lv_min .
WHILE ls_colprop-x LE lv_max .
INSERT ls_colprop INTO TABLE lt_colprop .
ADD 1 TO ls_colprop-x .
ENDWHILE .
ENDIF .
ENDDO .
ENDIF .
ENDIF .

* Read data validation info on the sheet


*======================================================================
CLEAR lt_datavalid_tmp . FREE lt_datavalid_tmp .

lr_dvls_elem = <sheets>-ixml_doc->find_from_name(
name = c_tag-datavalidations
depth = 2 ) .
IF lr_dvls_elem IS BOUND .
lr_dvl_ncol = lr_dvls_elem->get_elements_by_tag_name(
name = c_tag-datavalidation
depth = 1 ) .
IF lr_dvl_ncol IS BOUND .
DO .
* element: dataValidation
lv_dvl_index = sy-index - 1 .
lr_dvl_node = lr_dvl_ncol->get_item( index = lv_dvl_index ) .
IF lr_dvl_node IS NOT BOUND. EXIT. ENDIF .
lr_dvl_elem ?= lr_dvl_node->query_interface( ixml_iid_element ).

CLEAR ls_datavalid_tmp .
CLEAR lv_sqref .
CLEAR lt_sqref .

* element: formula1
lr_dvlf_elem = lr_dvl_elem->find_from_name(
name = c_tag-formula1
depth = 1 ) .
IF lr_dvlf_elem IS BOUND .
ls_datavalid_tmp-formula1 = lr_dvlf_elem->get_value( ) .
ENDIF .
* element: formula2
lr_dvlf_elem = lr_dvl_elem->find_from_name(
name = c_tag-formula2
depth = 1 ) .
IF lr_dvlf_elem IS BOUND .
ls_datavalid_tmp-formula2 = lr_dvlf_elem->get_value( ) .
ENDIF .

* attributes
lr_attr_ndmap = lr_dvl_node->get_attributes( ) .
lr_attr_nditerator = lr_attr_ndmap->create_iterator( ) .
lr_attr_node = lr_attr_nditerator->get_next( ) .

WHILE lr_attr_node IS NOT INITIAL .


lv_attrname = lr_attr_node->get_name( ) .
CASE lv_attrname .
WHEN c_tag-sqref .
lv_sqref = lr_attr_node->get_value( ) .
WHEN OTHERS .
TRANSLATE lv_attrname TO UPPER CASE .
ASSIGN COMPONENT lv_attrname OF STRUCTURE ls_datavalid_tmp TO
<field> .
IF <field> IS ASSIGNED .
<field> = lr_attr_node->get_value( ) .
ENDIF .
ENDCASE .
lr_attr_node = lr_attr_nditerator->get_next( ) .
ENDWHILE .

* convert attribute 'sqref' to coordinates


SPLIT lv_sqref AT space INTO TABLE lt_sqref .
LOOP AT lt_sqref INTO lv_sqref .
CHECK lv_sqref IS NOT INITIAL .

conv_ref_cn( EXPORTING iv_ref = lv_sqref


IMPORTING ev_beg_x = ls_datavalid_tmp-beg_x
ev_beg_y = ls_datavalid_tmp-beg_y
ev_end_x = ls_datavalid_tmp-end_x
ev_end_y = ls_datavalid_tmp-end_y ) .
IF ls_datavalid_tmp-end_x IS INITIAL .
ls_datavalid_tmp-end_x = ls_datavalid_tmp-beg_x .
ENDIF .
IF ls_datavalid_tmp-end_y IS INITIAL .
ls_datavalid_tmp-end_y = ls_datavalid_tmp-beg_y .
ENDIF .
APPEND ls_datavalid_tmp TO lt_datavalid_tmp .
ENDLOOP .
ENDDO .
ENDIF .
ENDIF .

ENDAT . " NEW sheetname.

* Grouping of the found cells content per pattern areas


*======================================================================
CLEAR ls_patterns .
ls_patterns-id = <patternarea>-areaid .
ls_patterns-top = <patternarea>-top .
ls_patterns-left = <patternarea>-left .
ls_patterns-rows = <patternarea>-rows .
ls_patterns-columns = <patternarea>-columns .

ls_patternarea_abs-beg_y = <patternarea>-top .
ls_patternarea_abs-end_y = <patternarea>-top + <patternarea>-rows - 1 .
ls_patternarea_abs-beg_x = <patternarea>-left .
ls_patternarea_abs-end_x = <patternarea>-left + <patternarea>-columns - 1 .

LOOP AT lt_cells_tmp INTO ls_cells


WHERE y GE ls_patternarea_abs-beg_y
AND y LE ls_patternarea_abs-end_y
AND x GE ls_patternarea_abs-beg_x
AND x LE ls_patternarea_abs-end_x .

* shared string processing


* (substitution the temporary Key with another that used in model )
IF ls_cells-type EQ c_tag-s .
READ TABLE lt_sharedstrings_tmp INTO ls_sharedstrings
WITH TABLE KEY key = ls_cells-value .
CHECK sy-subrc EQ 0 .

READ TABLE s_model-t_sharedstrings INTO ls_sharedstrings


WITH TABLE KEY value = ls_sharedstrings-value .
IF sy-subrc NE 0 .
* save the new shared string into model (using a new Key)
ls_sharedstrings-key = LINES( s_model-t_sharedstrings ) .
INSERT ls_sharedstrings INTO TABLE s_model-t_sharedstrings .
ENDIF .
ls_cells-value_s = ls_sharedstrings-value .
ls_cells-value = ls_sharedstrings-key .
ENDIF .

INSERT ls_cells INTO TABLE ls_patterns-t_cells .


ENDLOOP .

* data validation info


LOOP AT lt_datavalid_tmp INTO ls_datavalid_tmp
WHERE end_y GE ls_patternarea_abs-beg_y
AND beg_y LE ls_patternarea_abs-end_y
AND end_x GE ls_patternarea_abs-beg_x
AND beg_x LE ls_patternarea_abs-end_x .

CLEAR ls_coordinates .
MOVE-CORRESPONDING ls_datavalid_tmp TO ls_coordinates .

IF ls_coordinates-beg_y LT ls_patternarea_abs-beg_y .
ls_coordinates-beg_y = ls_patternarea_abs-beg_y .
ENDIF .
IF ls_coordinates-beg_x LT ls_patternarea_abs-beg_x .
ls_coordinates-beg_x = ls_patternarea_abs-beg_x .
ENDIF .
IF ls_coordinates-end_y GT ls_patternarea_abs-end_y .
ls_coordinates-end_y = ls_patternarea_abs-end_y .
ENDIF .
IF ls_coordinates-end_x GT ls_patternarea_abs-end_x .
ls_coordinates-end_x = ls_patternarea_abs-end_x .
ENDIF .

lv_y = ls_coordinates-beg_y .
lv_x = ls_coordinates-beg_x .
DO .
DO .
READ TABLE ls_patterns-t_cells ASSIGNING <cells>
WITH KEY y = lv_y x = lv_x .
IF sy-subrc NE 0 .
CLEAR ls_cells .
ls_cells-y = lv_y .
ls_cells-x = lv_x .
INSERT ls_cells INTO TABLE ls_patterns-t_cells ASSIGNING <cells> .
ENDIF .
MOVE-CORRESPONDING ls_datavalid_tmp TO <cells>-datavalidation .

ADD 1 TO lv_x .
IF lv_x GE ls_coordinates-end_x .
EXIT .
ENDIF .
ENDDO .

ADD 1 TO lv_y .
IF lv_y GE ls_coordinates-end_y .
EXIT .
ENDIF .
ENDDO .
ENDLOOP .

* Grouping of the found merged cells per pattern areas


*======================================================================
LOOP AT lt_mergecells INTO ls_mergecells
WHERE beg_y LE ls_patternarea_abs-end_y
AND end_y GE ls_patternarea_abs-beg_y
AND beg_x LE ls_patternarea_abs-end_x
AND end_x GE ls_patternarea_abs-beg_x .

IF ls_mergecells-beg_y LT ls_patternarea_abs-beg_y .
ls_mergecells-beg_y = ls_patternarea_abs-beg_y .
ENDIF .
IF ls_mergecells-end_y GT ls_patternarea_abs-end_y .
ls_mergecells-end_y = ls_patternarea_abs-end_y .
ENDIF .
IF ls_mergecells-beg_x LT ls_patternarea_abs-beg_x .
ls_mergecells-beg_x = ls_patternarea_abs-beg_x .
ENDIF .
IF ls_mergecells-end_x GT ls_patternarea_abs-end_x .
ls_mergecells-end_x = ls_patternarea_abs-end_x .
ENDIF .

CHECK ls_mergecells-beg_y NE ls_mergecells-end_y


OR ls_mergecells-beg_x NE ls_mergecells-end_x .

* convert absolute coordinates into relative ones


ls_mergecells_rel-top = ls_mergecells-beg_y .
ls_mergecells_rel-left = ls_mergecells-beg_x .
ls_mergecells_rel-rows = ls_mergecells-end_y - ls_mergecells-beg_y + 1 .
ls_mergecells_rel-columns = ls_mergecells-end_x - ls_mergecells-beg_x + 1 .
INSERT ls_mergecells_rel INTO TABLE ls_patterns-t_mergecells .
ENDLOOP .

* Grouping the found properties of column/row per pattern areas


*======================================================================
IF <patternarea>-colprop IS NOT INITIAL .
LOOP AT lt_colprop INTO ls_colprop
WHERE x BETWEEN ls_patternarea_abs-beg_x
AND ls_patternarea_abs-end_x .
INSERT ls_colprop INTO TABLE ls_patterns-t_colprop .
ENDLOOP .
ENDIF .

IF <patternarea>-rowprop IS NOT INITIAL .


LOOP AT lt_rowprop INTO ls_rowprop
WHERE y BETWEEN ls_patternarea_abs-beg_y
AND ls_patternarea_abs-end_y .
INSERT ls_rowprop INTO TABLE ls_patterns-t_rowprop .
ENDLOOP .
ENDIF .

*======================================================================

INSERT ls_patterns INTO TABLE <sheets>-sheetdata_template-t_patterns .


ENDLOOP . " it_patternareas

ENDMETHOD . "bufferization_patterns
METHOD get_sheet .
CLEAR rs_sheets .
READ TABLE s_model-t_sheets INTO rs_sheets
WITH TABLE KEY name = iv_sheetname .
ENDMETHOD . "get_sheet
METHOD get_pattern .
FIELD-SYMBOLS:
<sheets> TYPE ty_s_sheets .

CLEAR rs_patterns .
READ TABLE s_model-t_sheets ASSIGNING <sheets>
WITH TABLE KEY name = iv_sheetname .
CHECK sy-subrc EQ 0 .

READ TABLE <sheets>-sheetdata_template-t_patterns INTO rs_patterns


WITH TABLE KEY id = iv_id .
ENDMETHOD . "get_pattern
METHOD get_drawing_static .
FIELD-SYMBOLS:
<sheets> TYPE ty_s_sheets .

CLEAR rs_drawings .
READ TABLE s_model-t_sheets ASSIGNING <sheets>
WITH TABLE KEY name = iv_sheetname .
CHECK sy-subrc EQ 0 .

READ TABLE <sheets>-sheetdata_template-t_drawings INTO rs_drawings


WITH TABLE KEY name = iv_drwstat_name .
ENDMETHOD . "get_drawing_static
METHOD formparameters_struc_get .
DATA:
lr_ixml_document TYPE REF TO if_ixml_document ,
lr_row_node TYPE REF TO if_ixml_node ,
lr_fld_ndmap TYPE REF TO if_ixml_named_node_map ,
lr_fld_nditerator TYPE REF TO if_ixml_node_iterator ,
lr_fld_attrib TYPE REF TO if_ixml_node ,
lv_fld_name TYPE string ,
lv_fld_value TYPE string .
FIELD-SYMBOLS:
<fld> TYPE ANY .

CLEAR cs_struc .
FREE cs_struc .
lr_ixml_document = xml_load( iv_path = iv_path ) .
CHECK lr_ixml_document IS BOUND .

lr_row_node = lr_ixml_document->find_from_name( c_tag-row ) .


CHECK lr_row_node IS BOUND .

lr_fld_ndmap = lr_row_node->get_attributes( ) .
lr_fld_nditerator = lr_fld_ndmap->create_iterator( ) .
lr_fld_attrib = lr_fld_nditerator->get_next( ) .
WHILE lr_fld_attrib IS NOT INITIAL .
lv_fld_name = lr_fld_attrib->get_name( ) .
lv_fld_value = lr_fld_attrib->get_value( ) .

ASSIGN COMPONENT lv_fld_name OF STRUCTURE cs_struc TO <fld> .


IF <fld> IS ASSIGNED .
<fld> = lv_fld_value .
ENDIF .

lr_fld_attrib = lr_fld_nditerator->get_next( ) .
ENDWHILE .
ENDMETHOD . "formparameters_struc_get
METHOD formparameters_struc_set .
DATA:
lr_ixml TYPE REF TO if_ixml ,
lr_ixml_document TYPE REF TO if_ixml_document ,
lr_ixml_element TYPE REF TO if_ixml_element ,
lv_string_fname TYPE string ,
lv_string_value TYPE string ,
lr_descr_line TYPE REF TO cl_abap_structdescr .
FIELD-SYMBOLS:
<components> TYPE abap_compdescr ,
<value> TYPE ANY .

lr_descr_line ?= cl_abap_structdescr=>describe_by_data( is_struc ) .

lr_ixml = cl_ixml=>create( ) .
lr_ixml_document = lr_ixml->create_document( ) .

lr_ixml_element =
lr_ixml_document->create_simple_element( name = c_tag-row
parent = lr_ixml_document ) .
LOOP AT lr_descr_line->components ASSIGNING <components>.
ASSIGN COMPONENT <components>-name OF STRUCTURE is_struc TO <value> .
CHECK <value> IS ASSIGNED .

lv_string_fname = <components>-name .
lv_string_value = <value> .
lr_ixml_element->set_attribute( name = lv_string_fname
value = lv_string_value ) .
ENDLOOP .

xml_save( iv_ixml_doc = lr_ixml_document


iv_path = iv_path ) .
ENDMETHOD . "formparameters_struc_set
METHOD formparameters_table_get .
DATA:
lr_ixml_document TYPE REF TO if_ixml_document ,
lv_row_index TYPE sy-index ,
lr_row_ncol TYPE REF TO if_ixml_node_collection ,
lr_row_node TYPE REF TO if_ixml_node ,
lr_fld_ndmap TYPE REF TO if_ixml_named_node_map ,
lr_fld_nditerator TYPE REF TO if_ixml_node_iterator ,
lr_fld_attrib TYPE REF TO if_ixml_node ,
lv_fld_name TYPE string ,
lv_fld_value TYPE string .
FIELD-SYMBOLS:
<row> TYPE ANY ,
<fld> TYPE ANY .

CLEAR ct_tab .
FREE ct_tab .

lr_ixml_document = xml_load( iv_path = iv_path ) .


CHECK lr_ixml_document IS BOUND .

lr_row_ncol =
lr_ixml_document->get_elements_by_tag_name( name = c_tag-row
depth = 1 ) .
CHECK lr_row_ncol IS BOUND .
DO .
lv_row_index = sy-index - 1 .
lr_row_node = lr_row_ncol->get_item( index = lv_row_index ) .
IF lr_row_node IS INITIAL. EXIT. ENDIF .

APPEND INITIAL LINE TO ct_tab ASSIGNING <row> .


IF <row> IS NOT ASSIGNED. EXIT. ENDIF .

lr_fld_ndmap = lr_row_node->get_attributes( ) .
lr_fld_nditerator = lr_fld_ndmap->create_iterator( ) .
lr_fld_attrib = lr_fld_nditerator->get_next( ) .

WHILE lr_fld_attrib IS NOT INITIAL .


lv_fld_name = lr_fld_attrib->get_name( ) .
lv_fld_value = lr_fld_attrib->get_value( ) .

ASSIGN COMPONENT lv_fld_name OF STRUCTURE <row> TO <fld> .


IF <fld> IS ASSIGNED .
<fld> = lv_fld_value .
ENDIF .

lr_fld_attrib = lr_fld_nditerator->get_next( ) .
ENDWHILE .
ENDDO .
ENDMETHOD . "formparameters_table_get
METHOD formparameters_table_set .
DATA:
lr_ixml TYPE REF TO if_ixml ,
lr_ixml_document TYPE REF TO if_ixml_document ,
lr_tab_element TYPE REF TO if_ixml_element ,
lr_row_element TYPE REF TO if_ixml_element ,
lv_string_fname TYPE string ,
lv_string_value TYPE string ,
lr_descr_tab TYPE REF TO cl_abap_tabledescr ,
lr_descr_line TYPE REF TO cl_abap_structdescr .
FIELD-SYMBOLS:
<components> TYPE abap_compdescr ,
<row> TYPE ANY ,
<value> TYPE ANY .

lr_descr_tab ?= cl_abap_tabledescr=>describe_by_data( it_tab ) .


lr_descr_line ?= lr_descr_tab->get_table_line_type( ) .

lr_ixml = cl_ixml=>create( ) .
lr_ixml_document = lr_ixml->create_document( ) .

lr_tab_element =
lr_ixml_document->create_simple_element( name = c_tag-table
parent = lr_ixml_document ) .

LOOP AT it_tab ASSIGNING <row> .


lr_row_element =
lr_ixml_document->create_simple_element( name = c_tag-row
parent = lr_tab_element ) .
LOOP AT lr_descr_line->components ASSIGNING <components> .
ASSIGN COMPONENT <components>-name OF STRUCTURE <row> TO <value> .
CHECK <value> IS ASSIGNED .

lv_string_fname = <components>-name .
lv_string_value = <value> .
lr_row_element->set_attribute( name = lv_string_fname
value = lv_string_value ) .
ENDLOOP .
ENDLOOP .

xml_save( iv_ixml_doc = lr_ixml_document


iv_path = iv_path ) .
ENDMETHOD . "formparameters_table_set
ENDCLASS . "lcl_exceltemplate IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_form DEFINITION
*----------------------------------------------------------------------*
* form structure descriptor (buffer)
*----------------------------------------------------------------------*
CLASS lcl_form DEFINITION INHERITING FROM lcl_root .

PUBLIC SECTION .
CLASS-DATA:
v_dcpfm TYPE usr01-dcpfm .
TYPES:
ty_s_hierarchy TYPE snodetext ,
ty_t_hierarchy TYPE STANDARD TABLE OF ty_s_hierarchy .
TYPES:
BEGIN OF ty_s_properties ,
id TYPE ty_s_hierarchy-id ,
comp_type TYPE ty_comp_type ,
comp_name TYPE ty_comp_name ,
comp_descr TYPE ddtext ,

cb_loop_from TYPE i , " -->> loopstep: from row


cb_loop_to TYPE i , " -->> loopstep: to row

cb_relpath TYPE ty_comp_path , " -->> alias path (binding with


context)

cb_apr_relpath TYPE ty_comp_path , " -->> appearance path (binding


with context)
cb_apr_offset TYPE i , " -->> appearance: chars offset
cb_apr_match TYPE i , " -->> appearance: chars number

cb_cellrng_relpath TYPE ty_comp_path , " -->> cell range name: path


(binding with context)
cb_cellrng_offset TYPE i , " -->> cell range name: chars
offset
cb_cellrng_match TYPE i , " -->> cell range name: chars
number

cb_val_relpath TYPE ty_comp_path , " -->> value path (binding with


context)
cb_val_sub_req TYPE flag , " -->> value Sub.Required (binding
with table)
cb_val_sub_col TYPE ty_char30 , " -->> value Sub.Column (binding
with table)
cb_val_sub_row TYPE i , " -->> value Sub.Row (binding with
table)
cb_val_offset TYPE i , " -->> value: chars offset to
output
cb_val_match TYPE i , " -->> value: chars number to
output
cb_val_convert TYPE flag , " -->> value: conversion to
ext.format

cb_valvld_attr_relpath TYPE ty_comp_path , " -->> value: data


validation: context path of table (name-value) for attributes substitution
cb_valvld_for1_dataset_id TYPE ty_s_hierarchy-id ," -->> value: data
validation: Formula1: Dataset ID (Grid)
cb_valvld_for1_dataset_fld TYPE string , " -->> value: data
validation: Formula1: Field of Dataset ID (Grid)
cb_valvld_for1_relpath TYPE ty_comp_path , " -->> value: data
validation: Formula1: context path
cb_valvld_for2_relpath TYPE ty_comp_path , " -->> value: data
validation: Formula2: context path

tb_val_formula TYPE flag , " -->> value: as formula

tb_val_matrix TYPE flag , " -->> value: matrix layout (one


char per cell)
tb_val_matr_r TYPE i , " -->> matrix layout:
interval berween rows
tb_val_matr_c TYPE i , " -->> matrix layout:
interval berween columns

tb_area_textmark TYPE string , " -->> value: substring-bookmark


(binding with template)

tb_area_top TYPE i , " -->> range (binding with


template)
tb_area_left TYPE i ,
tb_area_rows TYPE i ,
tb_area_columns TYPE i ,

tb_sheetname TYPE ty_char31 , " -->> name of the sheet


tb_sheetstate TYPE ty_char1 , " -->> state of the sheet
( 'space'=Visible / 'X'=Hidden )
tb_sheetprotection TYPE string , " -->> sheet protection options
tb_direction TYPE ty_char1 , " -->> place relative to the
previous element
tb_rowprop TYPE flag , " -->> flag: copy the properties of
rows
tb_colprop TYPE flag , " -->> flag: copy the properties of
columns
tb_rowgroup TYPE flag , " -->> flag: grouping rows
tb_rowgroup_clp TYPE flag , " -->> flag: collapse
tb_colgroup TYPE flag , " -->> flag: grouping columns
tb_colgroup_clp TYPE flag , " -->> flag: collapse
tb_drwstat_flag TYPE flag , " -->> flag: static drawing
tb_drwstat_name TYPE ty_char100 , " -->> name of static drawing/chart
tb_nopgbrk_top TYPE flag , " -->> preventing Vert.
autopagebreaks: shift beyond Up
tb_nopgbrk_top_shift TYPE i , " -->> preventing Vert.
autopagebreaks: number of rows for shifting
tb_nopgbrk_left TYPE flag , " -->> preventing
Horiz.autopagebreaks: shift beyond Left
tb_nopgbrk_left_shift TYPE i , " -->> preventing
Horiz.autopagebreaks: number of rows for shifting
tb_pgbrk_top TYPE flag , " -->> insert Horiz.pagebreak UP
tb_pgbrk_left TYPE flag , " -->> insert Vert. pagebreak LEFT
tb_printtitles_r TYPE snode-id , " -->> print titles: rows (Pattern
id using for)
tb_printtitles_c TYPE snode-id , " -->> print titles: columns
(Pattern id using for)
tb_autofitmerged_r TYPE flag , " -->> AutoFit rows in merged cells
tb_autofitmerged_c TYPE flag , " -->> AutoFit columns in merged
cells
tb_mergecells TYPE ty_char1 , " -->> merge rows (rowspan) or
merge columns (colspan)
tb_respattern_place TYPE ty_char1 , " -->> resizable pattern: place
before/after it's subarea
tree_layout TYPE ty_char30 , " -->> Tree layout properties
grid_layout TYPE ty_char30 , " -->> Grid layout properties
grid_fldseq TYPE string , " -->> Grid columns sequence
grid_fldprop TYPE string , " -->> Grid columns properties
draft_subtree TYPE ty_char1 , " -->> subtree haven't to be
processed
dataset_id TYPE ty_s_hierarchy-id , " -->> chart -> Dataset ID
(Grid)
dataset_series TYPE string , " -->> chart -> Series (Columns of
the Grid)
chart_series_title TYPE flag , " -->> chart -> Series title mode
(static / from dataset column captions)
chart_title TYPE flag , " -->> chart title mode (static /
from context field )
chart_title_relpath TYPE ty_comp_path , " -->> chart title: context field
path
chart_catax_title TYPE flag , " -->> chart Category Axis
title mode (static / from context field )
chart_catax_title_relpath TYPE ty_comp_path , " -->> chart Category Axis
title: context field path
chart_valax_title TYPE flag , " -->> chart Value Axis title
mode (static / from context field )
chart_valax_title_relpath TYPE ty_comp_path , " -->> chart Value Axis
title: context field path
drawing_size TYPE ty_char1 , " -->> drawing: type of
resizing (Fit within area / From context field path)
drawing_size_h_relpath TYPE ty_comp_path , " -->> drawing: context field
path (Height)
drawing_size_w_relpath TYPE ty_comp_path , " -->> drawing: context field
path (Width)
postproc_vbs_code TYPE string , " -->> post-processing: VBScript
code
postproc_vbs_tables TYPE string , " -->> post-processing: Context
tables are being provided to VBScript code
definednames_dont_remove TYPE flag , " -->> do not remove defined
range names from template, pass them to resultant file
END OF ty_s_properties ,
ty_t_properties TYPE STANDARD TABLE OF ty_s_properties .
TYPES:
BEGIN OF ty_s_exceptions ,
id TYPE ty_s_hierarchy-id ,
comp_type TYPE sysubrc ,
comp_name TYPE sysubrc ,
comp_descr TYPE sysubrc ,
cb_relpath TYPE sysubrc ,
cb_apr_relpath TYPE sysubrc ,
cb_val_relpath TYPE sysubrc ,
tb_area TYPE sysubrc ,
tb_sheetname TYPE sysubrc ,
tb_drawing TYPE sysubrc ,
dataset TYPE sysubrc ,
postprocessing TYPE sysubrc ,
t_retmess TYPE bapiret2_t ,
END OF ty_s_exceptions ,
ty_t_exceptions TYPE STANDARD TABLE OF ty_s_exceptions .
TYPES:
BEGIN OF ty_s_check_data ,
exceptions TYPE ty_s_exceptions ,
properties TYPE ty_s_properties ,
hierarchy TYPE ty_s_hierarchy ,
END OF ty_s_check_data .
TYPES:
BEGIN OF ty_s_check_legacy_info ,
exceptions TYPE ty_s_exceptions ,
cb_fullpath TYPE ty_comp_path ,
tb_sheetname TYPE ty_s_properties-tb_sheetname ,
tb_chartsheet TYPE flag ,
tb_sheet_exists TYPE flag ,
tb_area_top TYPE ty_s_properties-tb_area_top , " -->> template
binding
tb_area_left TYPE ty_s_properties-tb_area_left ,
tb_area_rows TYPE ty_s_properties-tb_area_rows ,
tb_area_columns TYPE ty_s_properties-tb_area_columns ,
summarybelow TYPE flag ,
summaryright TYPE flag ,
real_level TYPE i ,
comp_level TYPE i ,
draft_subtree TYPE ty_char1 ,
END OF ty_s_check_legacy_info .
TYPES:
BEGIN OF ty_s_head ,
formname TYPE string ,
formdescr TYPE string ,
contextname TYPE lcl_context=>ty_contextname ,
active TYPE flag ,
root_id TYPE snode-id ,
created_uname TYPE syuname ,
created_datum TYPE sydatum ,
changed_uname TYPE syuname ,
changed_datum TYPE sydatum ,
END OF ty_s_head .
TYPES:
ty_t_comp_type_rng TYPE RANGE OF ty_s_properties-comp_type ,
ty_s_comp_type_rng TYPE LINE OF ty_t_comp_type_rng .
TYPES:
BEGIN OF ty_s_grid_fldseq ,
field TYPE string ,
END OF ty_s_grid_fldseq ,
ty_t_grid_fldseq TYPE STANDARD TABLE OF ty_s_grid_fldseq WITH DEFAULT
KEY .
TYPES:
BEGIN OF ty_s_grid_fldprop ,
field TYPE string ,
autofitmerged_r TYPE flag ,
autofitmerged_c TYPE flag ,
END OF ty_s_grid_fldprop ,
ty_t_grid_fldprop TYPE STANDARD TABLE OF ty_s_grid_fldprop WITH DEFAULT
KEY .

DATA:
v_formname TYPE string READ-ONLY ,
v_formdescr TYPE wwwdatatab-text READ-ONLY ,
v_devclass TYPE tadir-devclass READ-ONLY ,
v_active TYPE flag READ-ONLY ,
v_root_id TYPE snode-id READ-ONLY ,
v_created_uname TYPE syuname READ-ONLY ,
v_created_datum TYPE sydatum READ-ONLY ,
v_changed_uname TYPE syuname READ-ONLY ,
v_changed_datum TYPE sydatum READ-ONLY ,
r_context TYPE REF TO lcl_context READ-ONLY ,
r_exceltemplate TYPE REF TO lcl_exceltemplate READ-ONLY ,
t_properties TYPE ty_t_properties READ-ONLY ,
t_exceptions TYPE ty_t_exceptions READ-ONLY ,
t_hierarchy TYPE ty_t_hierarchy READ-ONLY ,
t_patternarea TYPE ty_t_patternarea READ-ONLY .

CLASS-METHODS:
class_constructor ,
conv_formname_ie
IMPORTING value(iv_objid) TYPE any
RETURNING value(rv_formname) TYPE wwwdatatab-objid ,
conv_formname_ei
IMPORTING iv_formname TYPE any
RETURNING value(rv_objid) TYPE wwwdatatab-objid ,
conv_sheetprotection_st
IMPORTING iv_sheetprotection TYPE ty_s_properties-tb_sheetprotection
RETURNING value(rs_sheetprotection) TYPE ty_s_sheetprotection ,
conv_sheetprotection_ts
IMPORTING is_sheetprotection TYPE ty_s_sheetprotection
RETURNING value(rv_sheetprotection) TYPE ty_s_properties-
tb_sheetprotection ,
conv_vbs_tables_st
IMPORTING iv_vbs_tables TYPE ty_s_properties-postproc_vbs_tables
RETURNING value(rt_vbs_tables_tab) TYPE ty_t_vbs_tables_tab ,
conv_vbs_tables_ts
IMPORTING it_vbs_tables_tab TYPE ty_t_vbs_tables_tab
RETURNING value(rv_vbs_tables) TYPE ty_s_properties-
postproc_vbs_tables ,
conv_dataset_series_st
IMPORTING iv_dataset_series TYPE ty_s_properties-dataset_series
RETURNING value(rt_dataset_series_tab) TYPE ty_t_dataset_series_tab ,
conv_dataset_series_ts
IMPORTING it_dataset_series_tab TYPE ty_t_dataset_series_tab
RETURNING value(rv_dataset_series) TYPE ty_s_properties-dataset_series ,
conv_grid_fldseq_st
IMPORTING iv_grid_fldseq TYPE ty_s_properties-grid_fldseq
RETURNING value(rt_grid_fldseq_tab) TYPE ty_t_grid_fldseq ,
conv_grid_fldseq_ts
IMPORTING it_grid_fldseq_tab TYPE ty_t_grid_fldseq
RETURNING value(rv_grid_fldseq) TYPE ty_s_properties-grid_fldseq ,
conv_grid_fldprop_st
IMPORTING iv_grid_fldprop TYPE ty_s_properties-grid_fldprop
RETURNING value(rt_grid_fldprop_tab) TYPE ty_t_grid_fldprop ,
conv_grid_fldprop_ts
IMPORTING it_grid_fldprop_tab TYPE ty_t_grid_fldprop
RETURNING value(rv_grid_fldprop) TYPE ty_s_properties-grid_fldprop ,
conv_container_fs
IMPORTING value(iv_field) TYPE csequence
EXPORTING es_structure TYPE any ,
conv_container_sf
IMPORTING is_structure TYPE any
EXPORTING ev_field TYPE csequence ,
get_devclass
IMPORTING iv_formname TYPE any
RETURNING value(rv_devclass) TYPE tadir-devclass ,
enq_lock
IMPORTING iv_formname TYPE any
RETURNING value(rv_foreign_lock) TYPE flag ,
enq_unlock
IMPORTING iv_formname TYPE any ,
enq_check
IMPORTING iv_formname TYPE any
RETURNING value(rv_foreign_lock) TYPE flag ,
is_val_convert_relevant
IMPORTING is_ctxt_prop TYPE lcl_context=>ty_s_properties
RETURNING value(rv_is_relevant) TYPE flag ,
vbs_code_default_get
RETURNING value(rv_vbs_code) TYPE string ,
vbs_code_validate
CHANGING cv_vbs_code TYPE string .
CLASS-DATA:
t_comp_types TYPE ty_t_comp_types READ-ONLY .

CONSTANTS:
BEGIN OF c_comp_type ,
root TYPE ty_comp_type VALUE 'R' ,
sheet TYPE ty_comp_type VALUE 'S' ,
loopstep TYPE ty_comp_type VALUE 'L' ,
pattern TYPE ty_comp_type VALUE 'P' ,
respattern TYPE ty_comp_type VALUE 'Q' ,
field TYPE ty_comp_type VALUE 'F' ,
folder TYPE ty_comp_type VALUE 'E' ,
drawing TYPE ty_comp_type VALUE 'D' ,
tree TYPE ty_comp_type VALUE 'T' ,
grid TYPE ty_comp_type VALUE 'G' ,
chart TYPE ty_comp_type VALUE 'C' ,
END OF c_comp_type ,
BEGIN OF c_comp_icon ,
root TYPE icon_d VALUE icon_object_list ,
sheet TYPE icon_d VALUE icon_xls ,
loopstep TYPE icon_d VALUE icon_businav_objects ,
pattern TYPE icon_d VALUE icon_alv_variants ,
respattern TYPE icon_d VALUE icon_wd_toolbar ,
field TYPE icon_d VALUE icon_change_text ,
folder TYPE icon_d VALUE icon_open ,
drawing TYPE icon_d VALUE icon_tif ,
tree TYPE icon_d VALUE icon_display_tree ,
grid TYPE icon_d VALUE icon_table_settings ,
chart TYPE icon_d VALUE icon_graphics ,
END OF c_comp_icon ,
BEGIN OF c_tb_direction ,
up2down TYPE ty_char1 VALUE space ,
left2right TYPE ty_char1 VALUE abap_on ,
END OF c_tb_direction ,
BEGIN OF c_tb_mergecells ,
rows TYPE ty_char1 VALUE space ,
cols TYPE ty_char1 VALUE abap_on ,
END OF c_tb_mergecells ,
BEGIN OF c_draft_subtree ,
no TYPE ty_char1 VALUE space ,
yes TYPE ty_char1 VALUE abap_on ,
legacy TYPE ty_char1 VALUE '+' ,
END OF c_draft_subtree ,
BEGIN OF c_stru_exp_coll ,
dynamic TYPE ty_char1 VALUE space ,
collapsed TYPE ty_char1 VALUE '-' ,
expanded TYPE ty_char1 VALUE '+' ,
END OF c_stru_exp_coll ,
BEGIN OF c_head_titles ,
tech_descr TYPE ty_char1 VALUE space ,
tech TYPE ty_char1 VALUE '1' ,
descr TYPE ty_char1 VALUE '2' ,
END OF c_head_titles ,
BEGIN OF c_drawing_size ,
fit_within_area TYPE ty_char1 VALUE space ,
from_context TYPE ty_char1 VALUE 'C' ,
END OF c_drawing_size ,
BEGIN OF c_respattern_place ,
before_subarea TYPE ty_char1 VALUE space ,
after_subarea TYPE ty_char1 VALUE 'X' ,
END OF c_respattern_place ,

c_objid_prefix TYPE wwwdatatab-objid VALUE 'ZXLWB_' ,


c_relid TYPE wwwdatatab-relid VALUE 'MI' ,
c_pgmid TYPE tadir-pgmid VALUE 'R3TR' ,
c_object TYPE tadir-object VALUE 'W3MI' ,
c_mimetype TYPE ty_char15 VALUE 'excel/xlsx' .

METHODS:
constructor
IMPORTING iv_formname TYPE any
iv_create_new TYPE flag DEFAULT abap_off
iv_editor TYPE flag DEFAULT abap_off
iv_template_path TYPE string OPTIONAL
EXCEPTIONS process_terminated ,
free ,
set_context
IMPORTING iv_contextname TYPE any ,
set_template
IMPORTING iv_rawdata TYPE any OPTIONAL
it_document_table TYPE tsfmime OPTIONAL
iv_document_size TYPE i OPTIONAL ,
get_relevant_child_comptypes
IMPORTING is_properties TYPE ty_s_properties
RETURNING value(rt_child_types) TYPE ty_t_comp_types ,
is_comptype_allowed
IMPORTING iv_id TYPE any
iv_child_type TYPE ty_comp_type
RETURNING value(rv_allowed) TYPE flag,
node_get_properties
IMPORTING iv_id TYPE any
RETURNING value(rs_properties) TYPE ty_s_properties ,
node_get_exceptions
IMPORTING iv_id TYPE any
RETURNING value(rs_exceptions) TYPE ty_s_exceptions ,
node_get_parent
IMPORTING iv_id TYPE any
RETURNING value(rv_id_parent) TYPE ty_s_hierarchy-parent ,
node_get_skipfolders
IMPORTING iv_id TYPE any
RETURNING value(rs_properties) TYPE ty_s_properties ,
node_get_legacy_info
IMPORTING iv_id TYPE any
EXPORTING es_exceptions TYPE ty_s_exceptions
ev_cb_fullpath TYPE any
ev_tb_sheet_exists TYPE any
ev_tb_sheet_compname TYPE any
ev_tb_sheetname TYPE any
ev_tb_chartsheet TYPE any
ev_tb_area_top TYPE any
ev_tb_area_left TYPE any
ev_tb_area_rows TYPE any
ev_tb_area_columns TYPE any
ev_real_level TYPE any
ev_comp_level TYPE any
ev_draft_subtree TYPE any ,
node_get_retcode_severity
IMPORTING iv_id TYPE any
RETURNING value(rv_retcode) TYPE sysubrc ,
node_get_protab_relevance
IMPORTING iv_id TYPE any OPTIONAL
is_properties TYPE ty_s_properties OPTIONAL
EXPORTING ev_rt_show TYPE any
ev_cm_show TYPE any
ev_pr_show TYPE any
ev_ms_show TYPE any ,
check_subtree
IMPORTING value(iv_id) TYPE any OPTIONAL ,
get_grid_fldseqprop
IMPORTING iv_id TYPE any
EXPORTING et_ctxt_hier TYPE lcl_context=>ty_t_hierarchy
et_ctxt_prop TYPE lcl_context=>ty_t_properties
et_fldseq TYPE ty_t_grid_fldseq
et_fldprop TYPE ty_t_grid_fldprop
ev_grid_fldseq TYPE any
ev_grid_fldprop TYPE any ,
get_sub_ctxt
IMPORTING value(iv_cb_fullpath) TYPE any OPTIONAL
is_form_prop TYPE ty_s_properties
RETURNING value(rs_ctxt_prop) TYPE lcl_context=>ty_s_properties ,
get_relevant_datasets
IMPORTING iv_id TYPE any
iv_same_sheet TYPE flag OPTIONAL
RETURNING value(rt_datasets) TYPE ty_t_nodetab ,
get_relevant_vbs_tables
RETURNING value(rt_vbs_tables_tab) TYPE ty_t_vbs_tables_tab .

PRIVATE SECTION .
DATA:
v_editor TYPE flag .
METHODS:
check_recurs
IMPORTING is_data_parent TYPE ty_s_check_data
is_legacy_parent TYPE ty_s_check_legacy_info ,
check_process
IMPORTING is_data_parent TYPE ty_s_check_data
is_legacy_parent TYPE ty_s_check_legacy_info
CHANGING cs_legacy TYPE ty_s_check_legacy_info
cs_data TYPE ty_s_check_data ,
check_process_root ,
check_process_component
IMPORTING is_data_parent TYPE ty_s_check_data
CHANGING cs_legacy TYPE ty_s_check_legacy_info
cs_data TYPE ty_s_check_data ,
check_process_cb
IMPORTING is_data_parent TYPE ty_s_check_data
CHANGING cs_legacy TYPE ty_s_check_legacy_info
cs_data TYPE ty_s_check_data ,
check_process_cb_appearance
IMPORTING is_data_parent TYPE ty_s_check_data
CHANGING cs_legacy TYPE ty_s_check_legacy_info
cs_data TYPE ty_s_check_data ,
check_process_cb_value
IMPORTING is_data_parent TYPE ty_s_check_data
CHANGING cs_legacy TYPE ty_s_check_legacy_info
cs_data TYPE ty_s_check_data ,
check_process_cb_valvld
IMPORTING is_data_parent TYPE ty_s_check_data
CHANGING cs_legacy TYPE ty_s_check_legacy_info
cs_data TYPE ty_s_check_data ,
check_process_tb_drawing
IMPORTING is_data_parent TYPE ty_s_check_data
CHANGING cs_legacy TYPE ty_s_check_legacy_info
cs_data TYPE ty_s_check_data ,
check_process_chart
IMPORTING is_data_parent TYPE ty_s_check_data
CHANGING cs_legacy TYPE ty_s_check_legacy_info
cs_data TYPE ty_s_check_data ,
check_process_tree
IMPORTING is_data_parent TYPE ty_s_check_data
CHANGING cs_legacy TYPE ty_s_check_legacy_info
cs_data TYPE ty_s_check_data ,
check_process_grid
IMPORTING is_data_parent TYPE ty_s_check_data
CHANGING cs_legacy TYPE ty_s_check_legacy_info
cs_data TYPE ty_s_check_data ,
check_process_tb_sheet
IMPORTING is_data_parent TYPE ty_s_check_data
CHANGING cs_legacy TYPE ty_s_check_legacy_info
cs_data TYPE ty_s_check_data ,
check_process_tb_area
IMPORTING is_data_parent TYPE ty_s_check_data
CHANGING cs_legacy TYPE ty_s_check_legacy_info
cs_data TYPE ty_s_check_data .

ENDCLASS . "lcl_form DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_form IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_form IMPLEMENTATION .
METHOD class_constructor .
DATA ls_comp_types TYPE ty_s_comp_types .

ls_comp_types-comp_type = c_comp_type-root .
ls_comp_types-icon = c_comp_icon-root .
ls_comp_types-description = 'ROOT' .
INSERT ls_comp_types INTO TABLE t_comp_types .

ls_comp_types-comp_type = c_comp_type-sheet .
ls_comp_types-icon = c_comp_icon-sheet .
ls_comp_types-description = v_text-t008 . " text: Sheet
INSERT ls_comp_types INTO TABLE t_comp_types .

ls_comp_types-comp_type = c_comp_type-loopstep .
ls_comp_types-icon = c_comp_icon-loopstep .
ls_comp_types-description = v_text-t009 . " text: Loop
INSERT ls_comp_types INTO TABLE t_comp_types .

ls_comp_types-comp_type = c_comp_type-pattern .
ls_comp_types-icon = c_comp_icon-pattern .
ls_comp_types-description = v_text-t010 . " text: Pattern
INSERT ls_comp_types INTO TABLE t_comp_types .

ls_comp_types-comp_type = c_comp_type-respattern .
ls_comp_types-icon = c_comp_icon-respattern .
ls_comp_types-description = v_text-t175 . " text: Pattern (resizable)
INSERT ls_comp_types INTO TABLE t_comp_types .

ls_comp_types-comp_type = c_comp_type-field .
ls_comp_types-icon = c_comp_icon-field .
ls_comp_types-description = v_text-t011 . " text: Value
INSERT ls_comp_types INTO TABLE t_comp_types .

ls_comp_types-comp_type = c_comp_type-folder .
ls_comp_types-icon = c_comp_icon-folder .
ls_comp_types-description = v_text-t012 . " text: Folder
INSERT ls_comp_types INTO TABLE t_comp_types .

ls_comp_types-comp_type = c_comp_type-drawing .
ls_comp_types-icon = c_comp_icon-drawing .
ls_comp_types-description = v_text-t139 . " text: Drawing
INSERT ls_comp_types INTO TABLE t_comp_types .

ls_comp_types-comp_type = c_comp_type-tree .
ls_comp_types-icon = c_comp_icon-tree .
ls_comp_types-description = v_text-t174 . " text: Tree
INSERT ls_comp_types INTO TABLE t_comp_types .

ls_comp_types-comp_type = c_comp_type-grid .
ls_comp_types-icon = c_comp_icon-grid .
ls_comp_types-description = v_text-t225 . " text: Grid
INSERT ls_comp_types INTO TABLE t_comp_types .

ls_comp_types-comp_type = c_comp_type-chart .
ls_comp_types-icon = c_comp_icon-chart .
ls_comp_types-description = v_text-t232 . " text: Chart
INSERT ls_comp_types INTO TABLE t_comp_types .

ENDMETHOD . "class_constructor
METHOD constructor .
super->constructor( ) .

DATA:
ls_head TYPE ty_s_head ,
ls_key TYPE wwwdatatab ,
lv_value TYPE wwwparams-value ,
lt_document_table TYPE tsfmime ,
lv_document_size TYPE i ,
lv_template_ok TYPE flag ,
lv_formstructure_ok TYPE flag .

SELECT SINGLE dcpfm


INTO v_dcpfm
FROM usr01
WHERE bname EQ sy-uname.

*======================================================================
* presets and checks
*======================================================================
CLEAR t_hierarchy[] .
CLEAR t_properties[] .
CLEAR t_exceptions[] .

CLEAR v_active .
CLEAR v_root_id .
CLEAR v_formdescr .
CLEAR v_created_uname .
CLEAR v_created_datum .
CLEAR v_changed_uname .
CLEAR v_changed_datum .

v_formname = iv_formname .
v_editor = iv_editor .

IF v_formname IS INITIAL .
MESSAGE i000(lp) WITH v_text-t013 " text: Specify a name of the form
RAISING process_terminated .
ENDIF .
v_devclass = get_devclass( iv_formname = v_formname ) .

IF v_editor IS NOT INITIAL .


IF abap_on EQ enq_lock( v_formname ) .
RAISE process_terminated .
ENDIF .

* enq_check( v_formname ) .
ENDIF .

*======================================================================
* try to upload Form's rawdata from the repository
* (Form is represented as XLSX-file)
*======================================================================
ls_key-relid = c_relid .
ls_key-objid = conv_formname_ei( v_formname ) .

CALL FUNCTION 'WWWDATA_IMPORT'


EXPORTING
key = ls_key
TABLES
mime = lt_document_table
EXCEPTIONS
OTHERS = 3.
IF sy-subrc EQ 0 .
IF iv_create_new IS NOT INITIAL .
MESSAGE i000(lp)
WITH v_text-t014 " text: A form already exists with the name
v_formname
RAISING process_terminated .
ENDIF .

SELECT SINGLE text


INTO v_formdescr
FROM wwwdata
WHERE relid EQ ls_key-relid
AND objid EQ ls_key-objid
AND srtf2 EQ 0 .

CALL FUNCTION 'WWWPARAMS_READ'


EXPORTING
relid = ls_key-relid
objid = ls_key-objid
name = 'filesize'
IMPORTING
value = lv_value
EXCEPTIONS
OTHERS = 0.
lv_document_size = lv_value .

IF lv_document_size IS INITIAL
OR lt_document_table[] IS INITIAL .
MESSAGE i000(lp) WITH v_formname ':' v_text-t015 " text: Form data is
interupted
INTO v_dummy .
msg_syst_catch( ) .
ELSE .
lv_template_ok = abap_on .
ENDIF .

ELSEIF iv_create_new IS INITIAL .


MESSAGE i000(lp) WITH v_formname ':' v_text-t016 " text: Form is not found
RAISING process_terminated .
ENDIF .

IF iv_editor IS NOT INITIAL


AND iv_create_new IS NOT INITIAL .
*======================================================================
* if the new form is creating,
* we try to upload rawdata of an initial Excel template
* (is represented as XLSX-file)
*======================================================================

* from frontend
IF iv_template_path IS NOT INITIAL .

cl_gui_frontend_services=>gui_upload(
EXPORTING filename = iv_template_path
filetype = 'BIN'
IMPORTING filelength = lv_document_size
CHANGING data_tab = lt_document_table
EXCEPTIONS OTHERS = 0 ) .
ENDIF .

* from the repository


IF lv_document_size IS INITIAL
OR lt_document_table IS INITIAL .
CLEAR ls_key .
CLEAR lt_document_table .
CLEAR lv_document_size .

ls_key-relid = c_relid .
ls_key-objid = conv_formname_ei( '&TEMPLATE&' ) .

CALL FUNCTION 'WWWDATA_IMPORT'


EXPORTING
key = ls_key
TABLES
mime = lt_document_table
EXCEPTIONS
OTHERS = 3.
IF sy-subrc EQ 0 .
CALL FUNCTION 'WWWPARAMS_READ'
EXPORTING
relid = ls_key-relid
objid = ls_key-objid
name = 'filesize'
IMPORTING
value = lv_value
EXCEPTIONS
OTHERS = 0.
lv_document_size = lv_value .
ENDIF .
ENDIF .
ENDIF .
*======================================================================
* parse XLSX-file (or create the new one)
*======================================================================
set_template( it_document_table = lt_document_table
iv_document_size = lv_document_size ) .
IF v_retcode EQ c_retcode-error .
MESSAGE e000(lp) WITH v_text-t336 " text: Error while reading template file
RAISING process_terminated .
ENDIF .

*======================================================================
* try to find form parameters and structure in the XLSX-file
*======================================================================
IF lv_template_ok EQ abap_on .

r_exceltemplate->formparameters_struc_get(
EXPORTING iv_path = r_exceltemplate->c_path-formhead
CHANGING cs_struc = ls_head ) .
r_exceltemplate->formparameters_table_get(
EXPORTING iv_path = r_exceltemplate->c_path-formproperties
CHANGING ct_tab = t_properties ) .
r_exceltemplate->formparameters_table_get(
EXPORTING iv_path = r_exceltemplate->c_path-formhierarchy
CHANGING ct_tab = t_hierarchy ) .

v_formdescr = ls_head-formdescr .
v_active = ls_head-active .
v_root_id = ls_head-root_id .
v_created_uname = ls_head-created_uname .
v_created_datum = ls_head-created_datum .
v_changed_uname = ls_head-changed_uname .
v_changed_datum = ls_head-changed_datum .

IF t_hierarchy[] IS INITIAL
OR t_properties[] IS INITIAL .
MESSAGE i000(lp) WITH v_formname ':' v_text-t015 " text: Form data is
interupted
INTO v_dummy .
msg_syst_catch( ) .
ELSE .
lv_formstructure_ok = abap_on .
ENDIF .
ENDIF .

*======================================================================
* if form parameters/structure does not exist,
* we create the init form structure
*======================================================================
IF lv_formstructure_ok IS INITIAL .
CALL FUNCTION 'RS_TREE_CREATE'
EXPORTING
root_name = v_formname
IMPORTING
root_id = v_root_id.

CALL FUNCTION 'RS_TREE_GET_CURRENT_TREE'


TABLES
nodeinfo = t_hierarchy.

DATA ls_properties TYPE ty_s_properties .


ls_properties-id = v_root_id .
ls_properties-comp_type = c_comp_type-root .
ls_properties-comp_name = v_formname .
APPEND ls_properties TO t_properties .
ENDIF .

IF iv_create_new IS NOT INITIAL .


v_created_uname = sy-uname .
v_created_datum = sy-datum .
CLEAR: v_changed_uname ,
v_changed_datum .
ENDIF .

CALL FUNCTION 'RS_TREE_SET_CURRENT_TREE' .

*======================================================================
* context initialization
*======================================================================
set_context( ls_head-contextname ) .
ENDMETHOD . "constructor
METHOD free .
CLEAR:
v_formname ,
v_active ,
v_root_id ,
t_properties ,
t_exceptions ,
t_hierarchy ,
t_patternarea .

IF r_context IS BOUND .
r_context->free( ) .
CLEAR r_context .
FREE r_context .
ENDIF .
IF r_exceltemplate IS BOUND .
r_exceltemplate->free( ) .
CLEAR r_exceltemplate .
FREE r_exceltemplate .
ENDIF .

IF v_editor IS NOT INITIAL .


enq_unlock( v_formname ) .
ENDIF .
ENDMETHOD . "free
METHOD conv_formname_ie .
DATA lv_offset TYPE i .
lv_offset = STRLEN( lcl_form=>c_objid_prefix ) .
SHIFT iv_objid LEFT BY lv_offset PLACES .
rv_formname = iv_objid .
ENDMETHOD . "conv_formname_ie
METHOD conv_formname_ei .
CONCATENATE c_objid_prefix iv_formname INTO rv_objid .
CONDENSE rv_objid .
ENDMETHOD . "conv_formname_ei
METHOD conv_sheetprotection_st .
CLEAR rs_sheetprotection .
CHECK iv_sheetprotection IS NOT INITIAL .

SPLIT iv_sheetprotection AT ';'


INTO rs_sheetprotection-mode
rs_sheetprotection-password
rs_sheetprotection-cb_val_relpath
rs_sheetprotection-selectlockedcells
rs_sheetprotection-selectunlockedcells
rs_sheetprotection-formatcells
rs_sheetprotection-formatcolumns
rs_sheetprotection-formatrows
rs_sheetprotection-insertcolumns
rs_sheetprotection-insertrows
rs_sheetprotection-inserthyperlinks
rs_sheetprotection-deletecolumns
rs_sheetprotection-deleterows
rs_sheetprotection-sort
rs_sheetprotection-autofilter
rs_sheetprotection-pivottables
rs_sheetprotection-objects
rs_sheetprotection-scenarios .
ENDMETHOD . "conv_sheetprotection_st
METHOD conv_sheetprotection_ts .
CLEAR rv_sheetprotection .
CHECK is_sheetprotection IS NOT INITIAL .

CONCATENATE
is_sheetprotection-mode
is_sheetprotection-password
is_sheetprotection-cb_val_relpath
is_sheetprotection-selectlockedcells
is_sheetprotection-selectunlockedcells
is_sheetprotection-formatcells
is_sheetprotection-formatcolumns
is_sheetprotection-formatrows
is_sheetprotection-insertcolumns
is_sheetprotection-insertrows
is_sheetprotection-inserthyperlinks
is_sheetprotection-deletecolumns
is_sheetprotection-deleterows
is_sheetprotection-sort
is_sheetprotection-autofilter
is_sheetprotection-pivottables
is_sheetprotection-objects
is_sheetprotection-scenarios
INTO rv_sheetprotection SEPARATED BY ';' .
ENDMETHOD . "conv_sheetprotection_ts
METHOD conv_vbs_tables_st .
DATA:
lv_line TYPE string ,
lt_table TYPE ty_t_string_tab ,
ls_vbs_tables_tab TYPE ty_s_vbs_tables_tab .
CLEAR rt_vbs_tables_tab[] .

SPLIT iv_vbs_tables AT '|' INTO TABLE lt_table .


LOOP AT lt_table INTO lv_line .
CLEAR ls_vbs_tables_tab .
SPLIT lv_line AT ';'
INTO ls_vbs_tables_tab-cb_relpath
ls_vbs_tables_tab-table_name .
APPEND ls_vbs_tables_tab TO rt_vbs_tables_tab .
ENDLOOP .
ENDMETHOD . "conv_vbs_tables_st
METHOD conv_vbs_tables_ts .
DATA:
lv_line TYPE string ,
ls_vbs_tables_tab TYPE ty_s_vbs_tables_tab .
CLEAR rv_vbs_tables .

LOOP AT it_vbs_tables_tab INTO ls_vbs_tables_tab .


CONCATENATE ls_vbs_tables_tab-cb_relpath
ls_vbs_tables_tab-table_name
INTO lv_line SEPARATED BY ';' .
IF sy-tabix EQ 1 .
rv_vbs_tables = lv_line .
ELSE .
CONCATENATE rv_vbs_tables
lv_line
INTO rv_vbs_tables SEPARATED BY '|' .
ENDIF .
ENDLOOP .
ENDMETHOD . "conv_vbs_tables_ts
METHOD conv_dataset_series_st .
DATA:
lv_line TYPE string ,
lt_table TYPE ty_t_string_tab ,
ls_dataset_series_tab TYPE ty_s_dataset_series_tab .
CLEAR rt_dataset_series_tab[] .

SPLIT iv_dataset_series AT '|' INTO TABLE lt_table .


LOOP AT lt_table INTO lv_line .
CLEAR ls_dataset_series_tab .
SPLIT lv_line AT ';'
INTO ls_dataset_series_tab-seridx
ls_dataset_series_tab-sercap
ls_dataset_series_tab-dtsfld .
APPEND ls_dataset_series_tab TO rt_dataset_series_tab .
ENDLOOP .
ENDMETHOD . "conv_dataset_series_st
METHOD conv_dataset_series_ts .
DATA:
lv_line TYPE string ,
ls_dataset_series_tab TYPE ty_s_dataset_series_tab .
CLEAR rv_dataset_series .

LOOP AT it_dataset_series_tab INTO ls_dataset_series_tab .


CONCATENATE ls_dataset_series_tab-seridx
ls_dataset_series_tab-sercap
ls_dataset_series_tab-dtsfld
INTO lv_line SEPARATED BY ';' .
IF sy-tabix EQ 1 .
rv_dataset_series = lv_line .
ELSE .
CONCATENATE rv_dataset_series
lv_line
INTO rv_dataset_series SEPARATED BY '|' .
ENDIF .
ENDLOOP .
ENDMETHOD . "conv_dataset_series_ts
METHOD conv_grid_fldseq_st .
DATA:
lv_line TYPE string ,
lt_table TYPE ty_t_string_tab ,
ls_grid_fldseq_tab TYPE ty_s_grid_fldseq .
CLEAR rt_grid_fldseq_tab[] .

SPLIT iv_grid_fldseq AT c_fldseq_separator INTO TABLE lt_table .


LOOP AT lt_table INTO lv_line .
CLEAR ls_grid_fldseq_tab .
ls_grid_fldseq_tab-field = lv_line .
APPEND ls_grid_fldseq_tab TO rt_grid_fldseq_tab .
ENDLOOP .
ENDMETHOD . "conv_grid_fldseq_st
METHOD conv_grid_fldseq_ts .
DATA:
lv_line TYPE string ,
ls_grid_fldseq_tab TYPE ty_s_grid_fldseq .
CLEAR rv_grid_fldseq .

LOOP AT it_grid_fldseq_tab INTO ls_grid_fldseq_tab .


IF rv_grid_fldseq IS INITIAL .
rv_grid_fldseq = ls_grid_fldseq_tab-field .
ELSE .
CONCATENATE rv_grid_fldseq
ls_grid_fldseq_tab-field
INTO rv_grid_fldseq SEPARATED BY c_fldseq_separator .
ENDIF .
ENDLOOP .
ENDMETHOD . "conv_grid_fldseq_ts
METHOD conv_grid_fldprop_st .
DATA:
lv_line TYPE string ,
lt_table TYPE ty_t_string_tab ,
ls_grid_fldprop_tab TYPE ty_s_grid_fldprop .
CLEAR rt_grid_fldprop_tab[] .

SPLIT iv_grid_fldprop AT c_fldseq_separator INTO TABLE lt_table .


LOOP AT lt_table INTO lv_line .
CLEAR ls_grid_fldprop_tab .
SPLIT lv_line AT ';'
INTO ls_grid_fldprop_tab-field
ls_grid_fldprop_tab-autofitmerged_r
ls_grid_fldprop_tab-autofitmerged_c .
APPEND ls_grid_fldprop_tab TO rt_grid_fldprop_tab .
ENDLOOP .
ENDMETHOD . "conv_grid_fldprop_st
METHOD conv_grid_fldprop_ts .
DATA:
lv_line TYPE string ,
ls_grid_fldprop_tab TYPE ty_s_grid_fldprop .
CLEAR rv_grid_fldprop .

LOOP AT it_grid_fldprop_tab INTO ls_grid_fldprop_tab .


CONCATENATE ls_grid_fldprop_tab-field
ls_grid_fldprop_tab-autofitmerged_r
ls_grid_fldprop_tab-autofitmerged_c
INTO lv_line SEPARATED BY ';' .
IF sy-tabix EQ 1 .
rv_grid_fldprop = lv_line .
ELSE .
CONCATENATE rv_grid_fldprop
lv_line
INTO rv_grid_fldprop SEPARATED BY c_fldseq_separator .
ENDIF .
ENDLOOP .
ENDMETHOD . "conv_grid_fldprop_ts
METHOD conv_container_fs .
CLEAR es_structure .
CHECK iv_field IS NOT INITIAL .

DATA lv_length TYPE i .

DESCRIBE FIELD es_structure .


lv_length = sy-folen .

CONSTANTS lc_sym_x TYPE x VALUE '00'.


FIELD-SYMBOLS <sym_x> TYPE x .
DATA lv_sym_c TYPE char1 .

ASSIGN lv_sym_c TO <sym_x> CASTING .


<sym_x> = lc_sym_x .
REPLACE ALL OCCURRENCES OF lv_sym_c IN iv_field WITH ' ' .

CLEAR es_structure .
cl_abap_container_utilities=>read_container_c(
EXPORTING im_container = iv_field(lv_length)
IMPORTING ex_value = es_structure
EXCEPTIONS OTHERS = 0 ) .
ENDMETHOD . "conv_container_fs
METHOD conv_container_sf .
DATA lv_length TYPE i .
DESCRIBE FIELD is_structure .
lv_length = sy-folen .

CLEAR ev_field .
cl_abap_container_utilities=>fill_container_c(
EXPORTING im_value = is_structure
IMPORTING ex_container = ev_field(lv_length)
EXCEPTIONS OTHERS = 0 ) .
ENDMETHOD . "conv_container_sf
METHOD get_devclass .
DATA lv_objid TYPE wwwdatatab-objid .

lv_objid = conv_formname_ei( iv_formname ) .


CLEAR rv_devclass .

SELECT SINGLE p~devclass


INTO rv_devclass
FROM wwwdata AS f
INNER JOIN tadir AS p
ON f~objid EQ p~obj_name
WHERE f~relid EQ c_relid
AND f~objid EQ lv_objid
AND f~srtf2 EQ 0
AND p~pgmid EQ c_pgmid
AND p~object EQ c_object .
ENDMETHOD . "get_devclass
METHOD enq_lock .
DATA:
lv_objid TYPE wwwdatatab-objid ,
lv_uname TYPE syuname ,
lv_msg_dummy TYPE dummy .

enq_unlock( iv_formname ) .

lv_objid = conv_formname_ei( iv_formname ) .


CALL FUNCTION 'ENQUEUE_E_WWW_HTML'
EXPORTING
mode_wwwdata = 'E'
relid = c_relid
objid = lv_objid
srtf2 = 0
EXCEPTIONS
foreign_lock = 1.
IF sy-subrc EQ 0 .
rv_foreign_lock = abap_off .
ELSE .
rv_foreign_lock = abap_on .
lv_uname = sy-msgv1 .
MESSAGE i000(lp)
WITH v_text-t017 iv_formname " text: Form
v_text-t018 lv_uname " text: is locked by the user
INTO lv_msg_dummy .
ENDIF .
ENDMETHOD . "enq_lock
METHOD enq_unlock .
DATA lv_objid TYPE wwwdatatab-objid .
lv_objid = conv_formname_ei( iv_formname ) .

CALL FUNCTION 'DEQUEUE_E_WWW_HTML'


EXPORTING
mode_wwwdata = 'E'
relid = c_relid
objid = lv_objid
srtf2 = 0.
ENDMETHOD . "enq_unlock
METHOD enq_check .
DATA:
lv_objid TYPE wwwdatatab-objid ,
lv_garg TYPE seqg3-garg ,
ls_enq TYPE seqg3 ,
lt_enq TYPE STANDARD TABLE OF seqg3 ,
lv_msg_dummy TYPE dummy .
rv_foreign_lock = abap_off .

lv_objid = conv_formname_ei( iv_formname ) .


CONCATENATE c_relid lv_objid INTO lv_garg .

CALL FUNCTION 'ENQUEUE_READ'


EXPORTING
gname = 'WWWDATA'
garg = lv_garg
guname = space
TABLES
enq = lt_enq
EXCEPTIONS
OTHERS = 0.
CHECK lt_enq[] IS NOT INITIAL .
READ TABLE lt_enq INTO ls_enq INDEX 1 .

rv_foreign_lock = abap_on .
MESSAGE i000(lp)
WITH v_text-t017 iv_formname " text: Form
v_text-t018 ls_enq-guname " text: is locked by the user
INTO lv_msg_dummy .
ENDMETHOD . "enq_check
METHOD is_val_convert_relevant .
IF is_ctxt_prop-type_edit_mask IS NOT INITIAL
OR is_ctxt_prop-type_kind EQ cl_abap_typedescr=>typekind_date
OR is_ctxt_prop-type_kind EQ cl_abap_typedescr=>typekind_time .
rv_is_relevant = abap_on .
ELSE .
rv_is_relevant = abap_off .
ENDIF .
ENDMETHOD . "is_val_convert_relevant
METHOD vbs_code_default_get .
CONCATENATE `Sub Entry()`
`' use object XLWB_Application instead Application`
`' use object XLWB_ActiveWorkbook instead ActiveWorkbook` space
space space
`End Sub`
INTO rv_vbs_code
SEPARATED BY cl_abap_char_utilities=>cr_lf .
ENDMETHOD . "vbs_code_default_get
METHOD vbs_code_validate .
DATA:
lv_vbs_code_default TYPE string ,
lv_vbs_code_current TYPE string .

lv_vbs_code_default = vbs_code_default_get( ) .
lv_vbs_code_current = cv_vbs_code .

REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN lv_vbs_code_default


WITH space .
CONDENSE lv_vbs_code_default NO-GAPS .
TRANSLATE lv_vbs_code_default TO UPPER CASE .

REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN lv_vbs_code_current


WITH space .
CONDENSE lv_vbs_code_current NO-GAPS .
TRANSLATE lv_vbs_code_current TO UPPER CASE .

CHECK lv_vbs_code_current EQ 'SUBENTRY()ENDSUB'


OR lv_vbs_code_current EQ lv_vbs_code_default .

CLEAR cv_vbs_code .
ENDMETHOD . "vbs_code_validate
METHOD check_subtree .

DATA ls_data TYPE ty_s_check_data.


DATA ls_legacy TYPE ty_s_check_legacy_info .
DATA lv_id TYPE snode-id .
IF iv_id IS INITIAL .
lv_id = v_root_id .
ELSE .
lv_id = iv_id .
ENDIF.

*------ find a parent node properties


IF lv_id EQ v_root_id.
CLEAR t_exceptions. FREE t_exceptions.
CLEAR t_patternarea. FREE t_patternarea.

ls_data-hierarchy-child = v_root_id.
ELSE.
lv_id = node_get_parent( lv_id ).
ls_data-properties = node_get_skipfolders( lv_id ).
lv_id = ls_data-properties-id.
READ TABLE t_hierarchy INTO ls_data-hierarchy WITH KEY id = lv_id.

ls_data-exceptions = node_get_exceptions( lv_id ).


ENDIF.

node_get_legacy_info( EXPORTING iv_id = lv_id


IMPORTING es_exceptions = ls_legacy-exceptions
ev_cb_fullpath = ls_legacy-cb_fullpath
ev_tb_sheetname = ls_legacy-tb_sheetname
ev_tb_sheet_exists = ls_legacy-tb_sheet_exists
ev_tb_area_top = ls_legacy-tb_area_top
ev_tb_area_left = ls_legacy-tb_area_left
ev_tb_area_rows = ls_legacy-tb_area_rows
ev_tb_area_columns = ls_legacy-tb_area_columns
ev_real_level = ls_legacy-real_level
ev_comp_level = ls_legacy-comp_level
ev_draft_subtree = ls_legacy-
draft_subtree ).

*------ start a recursive check process of child.nodes


check_recurs( is_data_parent = ls_data
is_legacy_parent = ls_legacy ).

*------ the whole form checks (check for Root node)


check_process_root( ) .

ENDMETHOD . "check_subtree
METHOD check_recurs .

DATA:
ls_data TYPE ty_s_check_data ,
ls_legacy TYPE ty_s_check_legacy_info ,
lv_id_next TYPE snode-id .
FIELD-SYMBOLS:
<properties> TYPE ty_s_properties .

lv_id_next = is_data_parent-hierarchy-child .

DO .
CLEAR ls_data .
* read a next node
READ TABLE t_hierarchy INTO ls_data-hierarchy
WITH KEY parent = is_data_parent-hierarchy-id
id = lv_id_next .
IF sy-subrc NE 0 .
EXIT .
ENDIF .

READ TABLE t_properties ASSIGNING <properties>


WITH KEY id = ls_data-hierarchy-id .
CHECK sy-subrc EQ 0 .
ls_data-properties = <properties> .

* check and validate an actual component


check_process( EXPORTING is_data_parent = is_data_parent
is_legacy_parent = is_legacy_parent
CHANGING cs_data = ls_data
cs_legacy = ls_legacy ) .
* update a properties record
<properties> = ls_data-properties .

* update an exceptions record


DELETE t_exceptions WHERE id EQ ls_data-exceptions-id .
APPEND ls_data-exceptions TO t_exceptions .

IF ls_data-hierarchy-child IS NOT INITIAL .


* recursive check of child components
check_recurs( is_data_parent = ls_data
is_legacy_parent = ls_legacy ) .
ENDIF .

IF ls_data-hierarchy-next IS INITIAL .
EXIT .
ELSE .
lv_id_next = ls_data-hierarchy-next .
ENDIF .
ENDDO .

ENDMETHOD . "check_recurs
METHOD check_process .

CLEAR cs_data-exceptions .
cs_data-exceptions-id = cs_data-properties-id .

*------ prepare legacy data


CLEAR cs_legacy .
cs_legacy-exceptions = is_legacy_parent-exceptions .
cs_legacy-cb_fullpath = is_legacy_parent-cb_fullpath .
cs_legacy-tb_sheetname = is_legacy_parent-tb_sheetname .
cs_legacy-tb_chartsheet = is_legacy_parent-tb_chartsheet .
cs_legacy-tb_sheet_exists = is_legacy_parent-tb_sheet_exists .
cs_legacy-tb_area_top = is_legacy_parent-tb_area_top .
cs_legacy-tb_area_left = is_legacy_parent-tb_area_left .
cs_legacy-tb_area_rows = is_legacy_parent-tb_area_rows .
cs_legacy-tb_area_columns = is_legacy_parent-tb_area_columns .
cs_legacy-summarybelow = is_legacy_parent-summarybelow .
cs_legacy-summaryright = is_legacy_parent-summaryright .
cs_legacy-real_level = is_legacy_parent-real_level + 1 .
IF cs_data-properties-comp_type NE c_comp_type-folder .
cs_legacy-comp_level = is_legacy_parent-comp_level + 1 .
ENDIF .

CASE is_legacy_parent-draft_subtree .
WHEN c_draft_subtree-yes . cs_legacy-draft_subtree = c_draft_subtree-
legacy .
WHEN c_draft_subtree-legacy . cs_legacy-draft_subtree = c_draft_subtree-
legacy .
WHEN OTHERS . cs_legacy-draft_subtree = c_draft_subtree-no .
ENDCASE .

CHECK cs_data-properties-id NE v_root_id .

*------ check process


check_process_component( " -->> check for name & type of component
EXPORTING is_data_parent = is_data_parent
CHANGING cs_data = cs_data
cs_legacy = cs_legacy ) .

check_process_cb( " -->> check for general context binding


EXPORTING is_data_parent = is_data_parent
CHANGING cs_data = cs_data
cs_legacy = cs_legacy ) .

check_process_cb_appearance( " -->> check for context binding which controls


an Appearance of component
EXPORTING is_data_parent = is_data_parent
CHANGING cs_data = cs_data
cs_legacy = cs_legacy ) .

check_process_cb_value( " -->> check for context binding which define a


field Value
EXPORTING is_data_parent = is_data_parent
CHANGING cs_data = cs_data
cs_legacy = cs_legacy ) .

check_process_cb_valvld( " -->> check for data validation option


EXPORTING is_data_parent = is_data_parent
CHANGING cs_data = cs_data
cs_legacy = cs_legacy ) .

check_process_tb_sheet( " -->> check for template Sheet binding:


EXPORTING is_data_parent = is_data_parent
CHANGING cs_data = cs_data
cs_legacy = cs_legacy ) .

check_process_tb_area( " -->> check for template Area binding


EXPORTING is_data_parent = is_data_parent
CHANGING cs_data = cs_data
cs_legacy = cs_legacy ) .

check_process_tb_drawing( " -->> check for Drawing


EXPORTING is_data_parent = is_data_parent
CHANGING cs_data = cs_data
cs_legacy = cs_legacy ) .

check_process_chart( " -->> check for Chart


EXPORTING is_data_parent = is_data_parent
CHANGING cs_data = cs_data
cs_legacy = cs_legacy ) .

check_process_tree( " -->> check for Tree


EXPORTING is_data_parent = is_data_parent
CHANGING cs_data = cs_data
cs_legacy = cs_legacy ) .

check_process_grid( " -->> check for Grid


EXPORTING is_data_parent = is_data_parent
CHANGING cs_data = cs_data
cs_legacy = cs_legacy ) .

*------ check grouping for Folders


IF cs_data-properties-comp_type NE c_comp_type-folder .
CLEAR cs_data-properties-tb_rowgroup .
CLEAR cs_data-properties-tb_colgroup .
ENDIF .
IF cs_data-properties-tb_rowgroup IS INITIAL .
CLEAR cs_data-properties-tb_rowgroup_clp .
ENDIF .
IF cs_data-properties-tb_colgroup IS INITIAL .
CLEAR cs_data-properties-tb_colgroup_clp .
ENDIF .

*------ set legacy data about exceptions


DEFINE mk_set_legacy_exception .
if &1 ne c_retcode-error
and &2 ne c_retcode-okey
and &2 ne c_retcode-legacy .
&1 = &2 .
endif .
END-OF-DEFINITION .

IF cs_data-properties-draft_subtree EQ c_draft_subtree-yes
AND cs_data-properties-comp_type NE c_comp_type-folder .
cs_data-properties-draft_subtree = c_draft_subtree-no .
ENDIF .
IF cs_data-properties-draft_subtree EQ c_draft_subtree-yes .
cs_legacy-draft_subtree = c_draft_subtree-legacy .
ELSE .
cs_data-properties-draft_subtree = cs_legacy-draft_subtree .
ENDIF .

mk_set_legacy_exception:
cs_legacy-exceptions-comp_type cs_data-exceptions-comp_type ,
cs_legacy-exceptions-comp_name cs_data-exceptions-comp_name ,
cs_legacy-exceptions-cb_relpath cs_data-exceptions-cb_relpath ,
cs_legacy-exceptions-cb_apr_relpath cs_data-exceptions-cb_apr_relpath ,
cs_legacy-exceptions-cb_val_relpath cs_data-exceptions-cb_val_relpath ,
cs_legacy-exceptions-tb_area cs_data-exceptions-tb_area ,
cs_legacy-exceptions-tb_sheetname cs_data-exceptions-tb_sheetname ,
cs_legacy-exceptions-dataset cs_data-exceptions-dataset .

*------ collect data about sheets including pattern areas


IF cs_data-properties-comp_type EQ c_comp_type-pattern
OR cs_data-properties-comp_type EQ c_comp_type-respattern
OR cs_data-properties-comp_type EQ c_comp_type-tree
OR cs_data-properties-comp_type EQ c_comp_type-grid .
FIELD-SYMBOLS <patternarea> TYPE ty_s_patternarea .

READ TABLE t_patternarea ASSIGNING <patternarea>


WITH KEY areaid = cs_data-properties-id .
IF sy-subrc NE 0 .
APPEND INITIAL LINE TO t_patternarea ASSIGNING <patternarea> .
<patternarea>-areaid = cs_data-properties-id .
ENDIF .
<patternarea>-sheetname = cs_legacy-tb_sheetname .
<patternarea>-areaid = cs_data-properties-id .
<patternarea>-areaname = cs_data-properties-comp_name .
<patternarea>-top = cs_data-properties-tb_area_top .
<patternarea>-left = cs_data-properties-tb_area_left .
<patternarea>-rows = cs_data-properties-tb_area_rows .
<patternarea>-columns = cs_data-properties-tb_area_columns .
<patternarea>-colprop = cs_data-properties-tb_colprop .
<patternarea>-rowprop = cs_data-properties-tb_rowprop .
ENDIF .

ENDMETHOD . "check_process
METHOD check_process_root . "the whole form checks (check for Root node)
DATA:
lv_vbs_code_tmp TYPE string ,
lt_vbs_tables_tab_s TYPE ty_t_vbs_tables_tab ,
lt_vbs_tables_tab_r TYPE ty_t_vbs_tables_tab .
FIELD-SYMBOLS:
<ls_properties> TYPE ty_s_properties ,
<ls_exceptions> TYPE ty_s_exceptions ,
<ls_vbs_tables_tab_s> TYPE ty_s_vbs_tables_tab .

*------ initialize a root exceptions record


DELETE t_exceptions WHERE id EQ v_root_id .
APPEND INITIAL LINE TO t_exceptions ASSIGNING <ls_exceptions> .
<ls_exceptions>-id = v_root_id .

*------ read root node


READ TABLE t_properties ASSIGNING <ls_properties>
WITH KEY id = v_root_id .
CHECK <ls_properties> IS NOT INITIAL .

*------ check availability of the sheets


READ TABLE t_properties TRANSPORTING NO FIELDS
WITH KEY comp_type = c_comp_type-sheet .
IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t151 INTO v_dummy . " text: Form must contain
at less one sheet
msg_syst_catch2( CHANGING ct_retmess = <ls_exceptions>-t_retmess ) .
<ls_exceptions>-tb_sheetname = c_retcode-error .
ENDIF .

*------ check post-processing procedure


vbs_code_validate( CHANGING cv_vbs_code = <ls_properties>-postproc_vbs_code ) .

IF <ls_properties>-postproc_vbs_code IS NOT INITIAL .

lv_vbs_code_tmp = <ls_properties>-postproc_vbs_code .
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN lv_vbs_code_tmp
WITH space .
CONDENSE lv_vbs_code_tmp NO-GAPS .
TRANSLATE lv_vbs_code_tmp TO UPPER CASE .

IF NOT lv_vbs_code_tmp CP '*SUBENTRY*ENDSUB*' .


SPLIT v_text-t290 AT '|' INTO sy-msgv1 sy-msgv2 . " text: Sub procedure
"Entry" is not found or incorrect |in the final post-processing VBScript
MESSAGE e000(lp) WITH sy-msgv1 sy-msgv2 INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = <ls_exceptions>-t_retmess ) .
<ls_exceptions>-postprocessing = c_retcode-error .
ENDIF .
ENDIF .

IF <ls_properties>-postproc_vbs_code IS INITIAL .
CLEAR <ls_properties>-postproc_vbs_tables .
ENDIF .

*------ check tables, which have to be provided from Context to post-processing


routine
IF <ls_properties>-postproc_vbs_tables IS NOT INITIAL .
lt_vbs_tables_tab_s = conv_vbs_tables_st( <ls_properties>-postproc_vbs_tables
) .
lt_vbs_tables_tab_r = get_relevant_vbs_tables( ) . " -->> relevant context
nested tables (on root level)

LOOP AT lt_vbs_tables_tab_s ASSIGNING <ls_vbs_tables_tab_s> .


READ TABLE lt_vbs_tables_tab_r TRANSPORTING NO FIELDS
WITH KEY cb_relpath = <ls_vbs_tables_tab_s>-cb_relpath .
CHECK sy-subrc NE 0 .
DELETE lt_vbs_tables_tab_s .
ENDLOOP .

LOOP AT lt_vbs_tables_tab_s ASSIGNING <ls_vbs_tables_tab_s> .


IF <ls_vbs_tables_tab_s>-table_name IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t287 ':' " text: Final post-processing
v_text-t292 " text: Specify Table name
<ls_vbs_tables_tab_s>-cb_relpath INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = <ls_exceptions>-t_retmess ) .
<ls_exceptions>-postprocessing = c_retcode-error .

ELSE .
LOOP AT lt_vbs_tables_tab_s TRANSPORTING NO FIELDS
WHERE table_name EQ <ls_vbs_tables_tab_s>-table_name
AND cb_relpath NE <ls_vbs_tables_tab_s>-cb_relpath .
EXIT .
ENDLOOP .
IF sy-subrc EQ 0 .
MESSAGE e000(lp)
WITH v_text-t287 ':' " text: Final post-
processing
v_text-t293 " text: Table name is not
unique
<ls_vbs_tables_tab_s>-table_name INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = <ls_exceptions>-t_retmess ) .
<ls_exceptions>-postprocessing = c_retcode-error .
ENDIF .
ENDIF .
ENDLOOP .
<ls_properties>-postproc_vbs_tables = conv_vbs_tables_ts( lt_vbs_tables_tab_s
) .
ENDIF .

ENDMETHOD . "check_process_root
METHOD check_process_component . "check the name & type of component

*------ check the type of component


IF space EQ is_comptype_allowed(
iv_id = is_data_parent-properties-id
iv_child_type = cs_data-properties-comp_type ) .
APPEND LINES OF t_retmess TO cs_data-exceptions-t_retmess .
cs_data-exceptions-comp_type = c_retcode-error .
ENDIF .

*------ check the name of component


LOOP AT t_properties TRANSPORTING NO FIELDS
WHERE id NE cs_data-properties-id
AND id NE v_root_id
AND comp_name EQ cs_data-properties-comp_name .
EXIT .
ENDLOOP .
IF sy-subrc EQ 0 .
MESSAGE w000(lp)
WITH v_text-t019 " text: a name of the component is not unique
cs_data-properties-comp_name INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-comp_name = c_retcode-warning .
ENDIF .

ENDMETHOD . "check_process_component
METHOD check_process_cb . "check for general context binding

DATA ls_ctxt_prop TYPE lcl_context=>ty_s_properties .

*------ set a legacy error (if occurs)


IF cs_data-exceptions-cb_relpath NE c_retcode-legacy .
CASE cs_legacy-exceptions-cb_relpath .
WHEN c_retcode-error
OR c_retcode-legacy .

MESSAGE e000(lp) WITH v_text-t020 " text: Context binding


is incorrect
v_text-t021 INTO v_dummy . " text: on the upper
levels
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_relpath = c_retcode-legacy .
ENDCASE .
ENDIF .

*------ validate
IF cs_data-properties-comp_type NE c_comp_type-loopstep
AND cs_data-properties-comp_type NE c_comp_type-folder .
CLEAR cs_data-properties-cb_relpath .
ENDIF .

IF cs_data-properties-comp_type EQ c_comp_type-loopstep .
IF cs_data-properties-cb_loop_from LE 0 .
cs_data-properties-cb_loop_from = 1 .
ENDIF .
IF cs_data-properties-cb_loop_to IS NOT INITIAL
AND cs_data-properties-cb_loop_to LT cs_data-properties-cb_loop_from .
cs_data-properties-cb_loop_to = cs_data-properties-cb_loop_from .
ENDIF .
ELSE .
CLEAR cs_data-properties-cb_loop_from .
CLEAR cs_data-properties-cb_loop_to .
ENDIF .

*------ check a path


IF cs_data-properties-cb_relpath IS INITIAL .
IF cs_data-properties-comp_type EQ c_comp_type-loopstep .
MESSAGE e000(lp) WITH v_text-t022 INTO v_dummy . " text: Context binding
is missing
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_relpath = c_retcode-error .
ENDIF .

ELSE .
ls_ctxt_prop = r_context->node_get_by_path(
iv_relpath = cs_data-properties-cb_relpath
iv_fullpath_parent = cs_legacy-cb_fullpath ) .
IF r_context->v_retcode EQ c_retcode-error
OR ( cs_data-properties-comp_type EQ c_comp_type-loopstep AND
ls_ctxt_prop-comp_type NE lcl_context=>c_comp_type-table )
OR ( cs_data-properties-comp_type EQ c_comp_type-field AND
ls_ctxt_prop-comp_type NE lcl_context=>c_comp_type-element ) .

MESSAGE e000(lp) WITH v_text-t020 INTO v_dummy . " text: Context binding is
incorrect
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_relpath = c_retcode-error .
EXIT .
ENDIF .

cs_legacy-cb_fullpath = get_fullpath( iv_parent_fullpath = cs_legacy-


cb_fullpath
iv_relpath = cs_data-
properties-cb_relpath ) .
ENDIF .

ENDMETHOD . "check_process_cb
METHOD check_process_cb_appearance . "check for context binding, which controls
an Appearance of component
DATA:
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
lv_length TYPE i .

*------ relevance of the property


CASE cs_data-properties-comp_type .
WHEN c_comp_type-sheet
OR c_comp_type-pattern
OR c_comp_type-respattern
OR c_comp_type-folder
OR c_comp_type-drawing .
WHEN OTHERS .
CLEAR cs_data-properties-cb_apr_relpath .
ENDCASE .

*------ validate
IF cs_data-properties-cb_apr_relpath IS INITIAL .
CLEAR cs_data-properties-cb_apr_offset .
CLEAR cs_data-properties-cb_apr_match .
ENDIF .

CHECK cs_data-properties-cb_apr_relpath IS NOT INITIAL .

*------ set a legacy error (if occurs)


IF cs_data-exceptions-cb_relpath NE c_retcode-legacy .
CASE cs_legacy-exceptions-cb_relpath .
WHEN c_retcode-error
OR c_retcode-legacy .

MESSAGE e000(lp) WITH v_text-t020 " text: Context binding


is incorrect
v_text-t021 INTO v_dummy . " text: on the upper
levels
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_relpath = c_retcode-legacy .

EXIT .
ENDCASE .

ELSE .
EXIT .
ENDIF .

*------
ls_ctxt_prop = r_context->node_get_by_path(
iv_relpath = cs_data-properties-cb_apr_relpath
iv_fullpath_parent = cs_legacy-cb_fullpath ) .
IF r_context->v_retcode EQ c_retcode-error .
MESSAGE e000(lp)
WITH v_text-t079 " text: Appearance in runtime:
v_text-t020 INTO v_dummy . " text: Context binding is incorrect
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_apr_relpath = c_retcode-error .

ELSEIF ls_ctxt_prop-type_kind EQ cl_abap_typedescr=>typekind_char


AND ls_ctxt_prop-type_length GT 1 .
lv_length = cs_data-properties-cb_apr_offset + cs_data-properties-
cb_apr_match .
IF lv_length GT ls_ctxt_prop-type_length .
MESSAGE i000(lp)
WITH v_text-t024 lv_length " text: Chars number
v_text-t025 ls_ctxt_prop-type_length " text: overlap the field
length
INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_apr_relpath = c_retcode-error .
ENDIF .
ELSE .
CLEAR cs_data-properties-cb_apr_offset .
CLEAR cs_data-properties-cb_apr_match .
ENDIF .
ENDMETHOD . "check_process_cb_appearance
METHOD check_process_cb_value . "check for context binding which define a field
Value
DATA:
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
lv_length TYPE i .

*------ relevance of the property


CASE cs_data-properties-comp_type .
WHEN c_comp_type-sheet .

WHEN c_comp_type-field .
IF cs_data-properties-cb_val_relpath IS INITIAL .
MESSAGE w000(lp)
WITH v_text-t011 ':' " text: Value
v_text-t022 INTO v_dummy . " text: Context binding is missing
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_val_relpath = c_retcode-warning .
ENDIF .

WHEN c_comp_type-drawing .
CLEAR cs_data-properties-cb_val_offset .
CLEAR cs_data-properties-cb_val_match .
CLEAR cs_data-properties-cb_val_convert .

IF cs_data-properties-tb_drwstat_flag IS INITIAL .
IF cs_data-properties-cb_val_relpath IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t011 ':' " text: Value
v_text-t022 INTO v_dummy . " text: Context binding is missing
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_val_relpath = c_retcode-error .
ENDIF .
ELSE .
CLEAR cs_data-properties-cb_val_relpath .
ENDIF .

WHEN c_comp_type-tree
OR c_comp_type-grid .
CLEAR cs_data-properties-cb_val_offset .
CLEAR cs_data-properties-cb_val_match .
CLEAR cs_data-properties-cb_val_convert .
CLEAR cs_data-properties-cb_val_sub_req .
CLEAR cs_data-properties-cb_val_sub_row .
CLEAR cs_data-properties-cb_val_sub_col .

IF cs_data-properties-cb_val_relpath IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t011 ':' " text: Value
v_text-t022 INTO v_dummy . " text: Context binding is missing
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_val_relpath = c_retcode-error .
ENDIF .

WHEN OTHERS .
CLEAR cs_data-properties-cb_val_relpath .
ENDCASE .
*------ validate
IF cs_data-properties-cb_val_relpath IS INITIAL .
CLEAR cs_data-properties-cb_val_offset .
CLEAR cs_data-properties-cb_val_match .
CLEAR cs_data-properties-cb_val_convert .
CLEAR cs_data-properties-cb_val_sub_req .
CLEAR cs_data-properties-cb_val_sub_row .
CLEAR cs_data-properties-cb_val_sub_col .

EXIT .
ENDIF .

*------ set a legacy error (if occurs)


IF cs_data-exceptions-cb_relpath NE c_retcode-legacy .
CASE cs_legacy-exceptions-cb_relpath .
WHEN c_retcode-error
OR c_retcode-legacy .

MESSAGE e000(lp) WITH v_text-t020 " text: Context binding


is incorrect
v_text-t021 INTO v_dummy . " text: on the upper
levels
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_relpath = c_retcode-legacy .

EXIT .
ENDCASE .
ELSE .
EXIT .
ENDIF .

*------ try to read context properties


ls_ctxt_prop = r_context->node_get_by_path(
iv_relpath = cs_data-properties-cb_val_relpath
iv_fullpath_parent = cs_legacy-cb_fullpath ) .
IF r_context->v_retcode EQ c_retcode-error .
MESSAGE e000(lp)
WITH v_text-t011 ':' " text: Value
v_text-t020 INTO v_dummy . " text: Context binding is incorrect
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_val_relpath = c_retcode-error .
EXIT .
ENDIF .

*------ check, if Context component type is allowed for the Form component
DO 1 TIMES .
CASE cs_data-properties-comp_type .
WHEN c_comp_type-sheet
OR c_comp_type-field
OR c_comp_type-drawing .
CHECK ls_ctxt_prop-comp_type NE lcl_context=>c_comp_type-element
AND ls_ctxt_prop-comp_type NE lcl_context=>c_comp_type-table .
WHEN c_comp_type-grid .
CHECK ls_ctxt_prop-comp_type NE lcl_context=>c_comp_type-table .
WHEN c_comp_type-tree .
CHECK ls_ctxt_prop-comp_type NE lcl_context=>c_comp_type-tree
AND ls_ctxt_prop-comp_type NE lcl_context=>c_comp_type-tree_s .
WHEN OTHERS . EXIT . " -->> do
ENDCASE .
MESSAGE e000(lp) WITH v_text-t020 INTO v_dummy . " text: Context binding is
incorrect
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_val_relpath = c_retcode-error .
ENDDO .

*------ Offset, Match, Convert option


CHECK cs_data-properties-comp_type EQ c_comp_type-sheet
OR cs_data-properties-comp_type EQ c_comp_type-field
OR cs_data-properties-comp_type EQ c_comp_type-drawing .

CASE ls_ctxt_prop-comp_type .
WHEN lcl_context=>c_comp_type-element .
cs_data-properties-cb_val_sub_req = abap_off .

WHEN lcl_context=>c_comp_type-table .
cs_data-properties-cb_val_sub_req = abap_on .

IF cs_data-properties-cb_val_sub_row IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t236 " text: Table row
v_text-t031 " text: is missing
':'
v_text-t020 INTO v_dummy . " text: Context binding is incorrect
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_val_relpath = c_retcode-error .
EXIT .
ENDIF .

IF cs_data-properties-cb_val_sub_col IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t237 " text: Column
v_text-t031 " text: is missing
':'
v_text-t020 INTO v_dummy . " text: Context binding is incorrect
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_val_relpath = c_retcode-error .
EXIT .
ENDIF .

ls_ctxt_prop =
get_sub_ctxt( iv_cb_fullpath = cs_legacy-cb_fullpath
is_form_prop = cs_data-properties ) .

IF r_context->v_retcode EQ c_retcode-error .
MESSAGE e000(lp)
WITH cs_data-properties-cb_val_relpath '-'
cs_data-properties-cb_val_sub_col
v_text-t020 INTO v_dummy . " text: Context binding is incorrect
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_val_relpath = c_retcode-error .
EXIT .
ENDIF .
ENDCASE .

CHECK cs_data-properties-comp_type NE c_comp_type-drawing .

IF ls_ctxt_prop-type_kind EQ cl_abap_typedescr=>typekind_char
AND ls_ctxt_prop-type_length GT 1 .
lv_length = cs_data-properties-cb_val_offset + cs_data-properties-
cb_val_match .
IF lv_length GT ls_ctxt_prop-type_length .
MESSAGE i000(lp)
WITH v_text-t024 lv_length " text: Chars number
v_text-t025 ls_ctxt_prop-type_length " text: overlap the field
length
INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_val_relpath = c_retcode-error .
ENDIF .
ELSE .
CLEAR cs_data-properties-cb_val_offset .
CLEAR cs_data-properties-cb_val_match .
ENDIF .

IF is_val_convert_relevant( ls_ctxt_prop ) EQ space .


CLEAR cs_data-properties-cb_val_convert .
ENDIF .

ENDMETHOD . "check_process_cb_value
METHOD check_process_cb_valvld . "check for data validation option
DATA:
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
lt_dtsets TYPE ty_t_nodetab ,
ls_dtset_fldseq TYPE ty_s_grid_fldseq ,
lt_dtset_fldseq TYPE ty_t_grid_fldseq ,
ls_dtset_ctxt_prop TYPE lcl_context=>ty_s_properties ,
lt_dtset_ctxt_prop TYPE lcl_context=>ty_t_properties ,
lv_msg_prefix TYPE string ,
lv_error_flag TYPE flag ,
lr_typedescr TYPE REF TO cl_abap_typedescr ,
lr_tabledescr TYPE REF TO cl_abap_tabledescr ,
lr_structdescr TYPE REF TO cl_abap_structdescr .
FIELD-SYMBOLS:
<components> TYPE abap_compdescr .

*------ relevance of the property


CASE cs_data-properties-comp_type .
WHEN c_comp_type-field .

*------ set a legacy error (if occurs)


IF cs_data-exceptions-cb_relpath NE c_retcode-legacy .
CASE cs_legacy-exceptions-cb_relpath .
WHEN c_retcode-error
OR c_retcode-legacy .

MESSAGE e000(lp) WITH v_text-t020 " text: Context


binding is incorrect
v_text-t021 INTO v_dummy . " text: on the upper
levels
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess )
.
cs_data-exceptions-cb_relpath = c_retcode-legacy .

EXIT .
ENDCASE .
ELSE .
EXIT .
ENDIF .

*------ attributes
IF cs_data-properties-cb_valvld_attr_relpath IS NOT INITIAL .
DO 1 TIMES .
ls_ctxt_prop = r_context->node_get_by_path(
iv_relpath = cs_data-properties-cb_valvld_attr_relpath
iv_fullpath_parent = cs_legacy-cb_fullpath ) .

* check: it must be table


IF r_context->v_retcode EQ c_retcode-error
OR ls_ctxt_prop-comp_type NE lcl_context=>c_comp_type-table .
lv_error_flag = abap_on .
EXIT .
ENDIF .

* check: the table must contain two leading fields with char/string type
cl_abap_datadescr=>describe_by_name(
EXPORTING p_name = ls_ctxt_prop-type_absname_t
RECEIVING p_descr_ref = lr_typedescr
EXCEPTIONS type_not_found = 4 ) .
IF sy-subrc NE 0 .
lv_error_flag = abap_on .
EXIT .
ENDIF .

TRY .
lr_tabledescr ?= lr_typedescr .
lr_structdescr ?= lr_tabledescr->get_table_line_type( ) .
CATCH cx_sy_move_cast_error .
lv_error_flag = abap_on .
EXIT .
ENDTRY .

DO 2 TIMES .
READ TABLE lr_structdescr->components ASSIGNING <components> INDEX
sy-index .
IF sy-subrc NE 0 .
lv_error_flag = abap_on .
EXIT .
ENDIF .
CASE <components>-type_kind .
WHEN cl_abap_datadescr=>typekind_clike
OR cl_abap_datadescr=>typekind_string
OR cl_abap_datadescr=>typekind_csequence
OR cl_abap_datadescr=>typekind_char .
WHEN OTHERS .
lv_error_flag = abap_on .
EXIT .
ENDCASE .
ENDDO .
ENDDO .

IF lv_error_flag IS NOT INITIAL .


MESSAGE e000(lp)
WITH v_text-t348 " text: Data validation
v_text-t350 " text: Table for dynamic substitution
(attribute/value)
':'
v_text-t020 INTO v_dummy . " text: Context binding is
incorrect

msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .


cs_data-exceptions-cb_val_relpath = c_retcode-error .
ENDIF .
ENDIF .

*------ formula1
CONCATENATE v_text-t348 " text: Data validation
v_text-t351 " text: Value (Formula)
'[1] :'
INTO lv_msg_prefix SEPARATED BY space .

* binding with context field by relpath


IF cs_data-properties-cb_valvld_for1_relpath IS NOT INITIAL .
CLEAR cs_data-properties-cb_valvld_for1_dataset_id .
CLEAR cs_data-properties-cb_valvld_for1_dataset_fld .

ls_ctxt_prop = r_context->node_get_by_path(
iv_relpath = cs_data-properties-
cb_valvld_for1_relpath
iv_fullpath_parent = cs_legacy-cb_fullpath ) .
IF r_context->v_retcode EQ c_retcode-error
OR ls_ctxt_prop-comp_type NE lcl_context=>c_comp_type-element .
MESSAGE e000(lp)
WITH lv_msg_prefix
v_text-t020 INTO v_dummy . " text: Context binding is
incorrect

msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .


cs_data-exceptions-cb_val_relpath = c_retcode-error .
ENDIF .
ENDIF .

* binding with template dataset (grid)


DO 1 TIMES .
IF cs_data-properties-cb_valvld_for1_dataset_id IS INITIAL .
cs_data-properties-cb_valvld_for1_dataset_fld = space .
EXIT .
ENDIF .

* check dataset
lt_dtsets = get_relevant_datasets( cs_data-properties-id ) .

READ TABLE lt_dtsets TRANSPORTING NO FIELDS


WITH KEY id = cs_data-properties-cb_valvld_for1_dataset_id .
IF sy-subrc EQ 0 .
CASE node_get_retcode_severity( cs_data-properties-
cb_valvld_for1_dataset_id ) .
WHEN c_retcode-legacy OR c_retcode-error .
MESSAGE e000(lp)
WITH lv_msg_prefix
v_text-t234 " text: Dataset
v_text-t248 INTO v_dummy . " text: has problems
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess
) .
cs_data-exceptions-tb_drawing = c_retcode-error .
EXIT .
ENDCASE .
ELSE .
MESSAGE e000(lp)
WITH lv_msg_prefix
v_text-t244 INTO v_dummy . " text: Incorrect Dataset is
specified
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .
EXIT .
ENDIF .

* check field of dataset


IF cs_data-properties-cb_valvld_for1_dataset_fld IS INITIAL .
MESSAGE e000(lp)
WITH lv_msg_prefix
v_text-t353 INTO v_dummy . " text: Field of Dataset is
missing
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .
ELSE .
get_grid_fldseqprop( EXPORTING iv_id = cs_data-properties-
cb_valvld_for1_dataset_id
IMPORTING et_ctxt_prop = lt_dtset_ctxt_prop[]
et_fldseq = lt_dtset_fldseq[] ) .

READ TABLE lt_dtset_fldseq TRANSPORTING NO FIELDS


WITH KEY field = cs_data-properties-cb_valvld_for1_dataset_fld .
IF sy-subrc NE 0 .
READ TABLE lt_dtset_ctxt_prop INTO ls_dtset_ctxt_prop
WITH KEY comp_fullpath = cs_data-properties-
cb_valvld_for1_dataset_fld .
IF sy-subrc EQ 0 .
MESSAGE e000(lp)
WITH lv_msg_prefix
v_text-t249 " text: Dataset: Grid has hidden
column
ls_dtset_ctxt_prop-comp_name
INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess
) .
cs_data-exceptions-tb_drawing = c_retcode-error .
ELSE .
MESSAGE e000(lp)
WITH lv_msg_prefix
v_text-t354 INTO v_dummy . " text: Field of Dataset is
incorrect
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess
) .
cs_data-exceptions-tb_drawing = c_retcode-error .
ENDIF .
ENDIF .
ENDIF .

ENDDO .

*------ formula2
CONCATENATE v_text-t348 " text: Data validation
v_text-t351 " text: Value (Formula)
'[2] :'
INTO lv_msg_prefix SEPARATED BY space .

* binding with context field by relpath


IF cs_data-properties-cb_valvld_for2_relpath IS NOT INITIAL .
ls_ctxt_prop = r_context->node_get_by_path(
iv_relpath = cs_data-properties-
cb_valvld_for2_relpath
iv_fullpath_parent = cs_legacy-cb_fullpath ) .
IF r_context->v_retcode EQ c_retcode-error
OR ls_ctxt_prop-comp_type NE lcl_context=>c_comp_type-element .
MESSAGE e000(lp)
WITH lv_msg_prefix
v_text-t020 INTO v_dummy . " text: Context binding is
incorrect

msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .


cs_data-exceptions-cb_val_relpath = c_retcode-error .
ENDIF .
ENDIF .

WHEN OTHERS .
CLEAR cs_data-properties-cb_valvld_attr_relpath .
CLEAR cs_data-properties-cb_valvld_for1_dataset_id .
CLEAR cs_data-properties-cb_valvld_for1_dataset_fld .
CLEAR cs_data-properties-cb_valvld_for1_relpath .
CLEAR cs_data-properties-cb_valvld_for2_relpath .
ENDCASE .

ENDMETHOD . "check_process_cb_valvld
METHOD check_process_tb_sheet . " check for template Sheet binding

*------ set a legacy error (if occurs)


CASE cs_legacy-exceptions-tb_sheetname .
WHEN c_retcode-error
OR c_retcode-legacy .

MESSAGE e000(lp)
WITH v_text-t026 " text: problem occurs with component
v_text-t008 " text: Sheet
v_text-t021 INTO v_dummy . " text: on the upper levels
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_sheetname = c_retcode-legacy .
ENDCASE .

*------ validate
CASE cs_data-properties-comp_type .
WHEN c_comp_type-sheet .
WHEN OTHERS .
CLEAR cs_data-properties-tb_sheetname .
CLEAR cs_data-properties-tb_sheetstate .
CLEAR cs_data-properties-tb_sheetprotection .
ENDCASE .

*------ check
CASE cs_data-properties-comp_type .
WHEN c_comp_type-loopstep
OR c_comp_type-folder .
WHEN c_comp_type-sheet .
IF cs_legacy-tb_sheet_exists IS NOT INITIAL .
MESSAGE e000(lp)
WITH v_text-t027 " text: A component
v_text-t008 " text: Sheet
v_text-t028 " text: already presents
v_text-t021 INTO v_dummy ." text: on the upper levels
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_sheetname = c_retcode-error .
ENDIF .

IF cs_data-properties-tb_sheetname IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t029 " text: Binding with Sheet of the template missing
INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_sheetname = c_retcode-error .
ELSE .
DATA ls_sheets TYPE lcl_excel=>ty_s_sheets .
ls_sheets =
r_exceltemplate->get_sheet( iv_sheetname = cs_data-properties-
tb_sheetname ) .

IF ls_sheets IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t030 " text: Template does not contain a Sheet
'[' cs_data-properties-tb_sheetname ']' INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_sheetname = c_retcode-error .
ELSE .
cs_legacy-tb_chartsheet = ls_sheets-chartsheet .
cs_legacy-tb_sheetname = cs_data-properties-tb_sheetname .
cs_legacy-summarybelow = ls_sheets-summarybelow .
cs_legacy-summaryright = ls_sheets-summaryright .
ENDIF .
ENDIF .

cs_legacy-tb_sheet_exists = abap_on .

*------>> sheet protection


DATA:
ls_sheetprotection TYPE lcl_form=>ty_s_sheetprotection ,
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
lv_relpath TYPE string ,
lv_password TYPE string .

ls_sheetprotection = conv_sheetprotection_st( cs_data-properties-


tb_sheetprotection ) .

CASE ls_sheetprotection-mode .
WHEN c_sheetprotection_mode-off .
CLEAR ls_sheetprotection .

WHEN c_sheetprotection_mode-from_template .
CLEAR ls_sheetprotection .
ls_sheetprotection-mode = c_sheetprotection_mode-
from_template.

WHEN c_sheetprotection_mode-from_context .
lv_relpath = ls_sheetprotection-cb_val_relpath .
lv_password = ls_sheetprotection-password .
CLEAR ls_sheetprotection .
ls_sheetprotection-mode = c_sheetprotection_mode-from_context
.
ls_sheetprotection-cb_val_relpath = lv_relpath .
ls_sheetprotection-password = lv_password .

DO 1 TIMES .
IF ls_sheetprotection-cb_val_relpath IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t298 ':' " text: Sheet protection
v_text-t022 INTO v_dummy . " text: Context binding is
missing
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess
) .
cs_data-exceptions-cb_val_relpath = c_retcode-error .
EXIT .
ENDIF .

CHECK cs_data-exceptions-cb_relpath NE c_retcode-legacy .


CASE cs_legacy-exceptions-cb_relpath .
WHEN c_retcode-error
OR c_retcode-legacy .

MESSAGE e000(lp) WITH v_text-t020 " text: Context


binding is incorrect
v_text-t021 INTO v_dummy . " text: on the
upper levels
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-
t_retmess ) .
cs_data-exceptions-cb_relpath = c_retcode-legacy .
EXIT .
ENDCASE .

ls_ctxt_prop = r_context->node_get_by_path(
iv_relpath = ls_sheetprotection-
cb_val_relpath
iv_fullpath_parent = cs_legacy-cb_fullpath ) .
IF r_context->v_retcode EQ c_retcode-error .
MESSAGE e000(lp)
WITH v_text-t298 ':' " text: Sheet protection
v_text-t020 INTO v_dummy . " text: Context binding is
incorrect
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess
) .
cs_data-exceptions-cb_val_relpath = c_retcode-error .
EXIT .
ENDIF .
ENDDO .

WHEN c_sheetprotection_mode-static .
CLEAR ls_sheetprotection-cb_val_relpath .
ENDCASE .

cs_data-properties-tb_sheetprotection =
lcl_form=>conv_sheetprotection_ts( ls_sheetprotection ) .
*<<------ sheet protection
WHEN OTHERS .
IF cs_legacy-tb_sheet_exists IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t027 " text: A component
v_text-t008 " text: Sheet
v_text-t031 " text: is missing
v_text-t021 INTO v_dummy ." text: on the upper levels
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_sheetname = c_retcode-error .

ELSE .
IF cs_legacy-tb_chartsheet IS NOT INITIAL
AND cs_data-properties-comp_type NE c_comp_type-chart .
MESSAGE e000(lp)
WITH v_text-t274 INTO v_dummy ." text: Chart Sheet can contain the
Charts only' .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_sheetname = c_retcode-error .
ENDIF .
ENDIF .

ENDCASE .

IF cs_data-properties-comp_type EQ c_comp_type-tree
AND ( cs_legacy-summarybelow IS NOT INITIAL ) .
* OR cs_legacy-summaryright IS NOT INITIAL ) .

MESSAGE e000(lp)
WITH v_text-t182 " text: follow to Excel menu: DATA-
>OUTLINE
v_text-t183 " text: and uncheck SUMMARY ROWS BELOW
DETAIL
INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-comp_type = c_retcode-error .
ENDIF .

ENDMETHOD . "check_process_tb_sheet
METHOD check_process_tb_area . " check for template Area binding
DATA:
lv_top TYPE i ,
lv_left TYPE i ,
lv_bottom TYPE i ,
lv_right TYPE i .
DATA:
lv_parent_top TYPE i ,
lv_parent_left TYPE i ,
lv_parent_bottom TYPE i ,
lv_parent_right TYPE i .

* [template binding area] option


CASE cs_data-properties-comp_type .
WHEN c_comp_type-sheet
OR c_comp_type-loopstep
OR c_comp_type-folder .

CLEAR:
cs_data-properties-tb_area_top ,
cs_data-properties-tb_area_left ,
cs_data-properties-tb_area_rows ,
cs_data-properties-tb_area_columns .

WHEN c_comp_type-field .
IF cs_data-properties-tb_area_textmark IS INITIAL
AND cs_data-properties-tb_area_top IS INITIAL
AND cs_data-properties-tb_area_left IS INITIAL
AND cs_data-properties-tb_area_rows IS INITIAL
AND cs_data-properties-tb_area_columns IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t032 INTO v_dummy . " text: An area is not specified in
the template
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_area = c_retcode-error .
ENDIF .

WHEN OTHERS .
IF cs_data-properties-tb_area_top IS INITIAL
AND cs_data-properties-tb_area_left IS INITIAL
AND cs_data-properties-tb_area_rows IS INITIAL
AND cs_data-properties-tb_area_columns IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t032 INTO v_dummy . " text: An area is not specified in
the template
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_area = c_retcode-error .
ENDIF .
ENDCASE .

CASE is_data_parent-exceptions-tb_area .
WHEN c_retcode-error
OR c_retcode-legacy .

MESSAGE e000(lp)
WITH v_text-t033 " text: A problem with area
determination occurs
v_text-t021 INTO v_dummy . " text: on the upper levels
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_area = c_retcode-legacy .

WHEN OTHERS .
IF is_data_parent-properties-comp_type EQ c_comp_type-respattern
AND cs_data-properties-comp_type NE c_comp_type-field .

ELSE .
IF ( is_data_parent-properties-tb_area_top IS NOT INITIAL
OR is_data_parent-properties-tb_area_left IS NOT INITIAL
OR is_data_parent-properties-tb_area_rows IS NOT INITIAL
OR is_data_parent-properties-tb_area_columns IS NOT INITIAL )
AND ( cs_data-properties-tb_area_top IS NOT INITIAL
OR cs_data-properties-tb_area_left IS NOT INITIAL
OR cs_data-properties-tb_area_rows IS NOT INITIAL
OR cs_data-properties-tb_area_columns IS NOT INITIAL ) .

lv_top = cs_data-properties-tb_area_top .
lv_left = cs_data-properties-tb_area_left .
lv_bottom = lv_top + cs_data-properties-tb_area_rows .
lv_right = lv_left + cs_data-properties-tb_area_columns .
lv_parent_top = is_data_parent-properties-tb_area_top .
lv_parent_left = is_data_parent-properties-tb_area_left .
lv_parent_bottom = lv_parent_top + is_data_parent-properties-
tb_area_rows .
lv_parent_right = lv_parent_left + is_data_parent-properties-
tb_area_columns .

IF lv_top LT lv_parent_top
OR lv_left LT lv_parent_left
OR lv_bottom GT lv_parent_bottom
OR lv_right GT lv_parent_right .
MESSAGE e000(lp)
WITH v_text-t034 " text: An area is beyond the scope of upper-
level areas
INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess )
.
cs_data-exceptions-tb_area = c_retcode-error .
ENDIF .
ENDIF .
ENDIF .

IF cs_data-properties-tb_area_top IS NOT INITIAL


OR cs_data-properties-tb_area_left IS NOT INITIAL
OR cs_data-properties-tb_area_rows IS NOT INITIAL
OR cs_data-properties-tb_area_columns IS NOT INITIAL .
cs_legacy-tb_area_top = cs_data-properties-tb_area_top .
cs_legacy-tb_area_left = cs_data-properties-tb_area_left .
cs_legacy-tb_area_rows = cs_data-properties-tb_area_rows .
cs_legacy-tb_area_columns = cs_data-properties-tb_area_columns .
ENDIF .
ENDCASE .

* [matrix layout] option for fields


IF cs_data-properties-comp_type EQ c_comp_type-field
AND cs_data-properties-tb_area_textmark IS INITIAL .
ELSE .
CLEAR cs_data-properties-tb_val_matrix .
ENDIF .
IF cs_data-properties-tb_val_matrix IS INITIAL .
CLEAR cs_data-properties-tb_val_matr_c .
CLEAR cs_data-properties-tb_val_matr_r .
ENDIF .

* [copy of columns/rows properties] option


CASE cs_data-properties-comp_type .
WHEN c_comp_type-pattern
OR c_comp_type-respattern .
WHEN c_comp_type-tree
OR c_comp_type-grid .
cs_data-properties-tb_rowprop = abap_on .
cs_data-properties-tb_colprop = abap_on .
WHEN OTHERS .
CLEAR cs_data-properties-tb_rowprop .
CLEAR cs_data-properties-tb_colprop .
ENDCASE .

* [merge cells] option


CASE cs_data-properties-comp_type .
WHEN c_comp_type-respattern .
IF cs_data-properties-tb_mergecells EQ c_tb_mergecells-rows
AND cs_data-properties-tb_area_rows GT 1 .
MESSAGE e000(lp)
WITH v_text-t179 " text: Specify area inside single row
INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_area = c_retcode-error .

ELSEIF cs_data-properties-tb_mergecells EQ c_tb_mergecells-cols


AND cs_data-properties-tb_area_columns GT 1 .
MESSAGE e000(lp)
WITH v_text-t180 " text: Specify area inside single column
INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_area = c_retcode-error .
ENDIF .

WHEN OTHERS .
CLEAR cs_data-properties-tb_mergecells .

ENDCASE .

* [AutoFit for merged cells] option


CASE cs_data-properties-comp_type .
WHEN c_comp_type-pattern
OR c_comp_type-respattern .
IF cs_data-properties-tb_autofitmerged_r IS NOT INITIAL .
CLEAR cs_data-properties-tb_autofitmerged_c .
ENDIF .

WHEN OTHERS .
CLEAR cs_data-properties-tb_autofitmerged_r .
CLEAR cs_data-properties-tb_autofitmerged_c .
ENDCASE .

ENDMETHOD . "check_process_tb_area
METHOD check_process_tb_drawing .

*------ validate
CASE cs_data-properties-comp_type .
WHEN c_comp_type-drawing .
CLEAR: cs_data-properties-cb_val_convert .
WHEN c_comp_type-chart .
CLEAR: cs_data-properties-cb_val_convert .
EXIT .
WHEN OTHERS .
CLEAR: cs_data-properties-tb_drwstat_flag ,
cs_data-properties-tb_drwstat_name ,
cs_data-properties-drawing_size ,
cs_data-properties-drawing_size_h_relpath ,
cs_data-properties-drawing_size_w_relpath .
EXIT .
ENDCASE .

*------ checks
CASE cs_data-properties-tb_drwstat_flag .
WHEN abap_on .
IF cs_data-properties-tb_drwstat_name IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t145 INTO v_dummy . " text: Name of the drawing is not
specified
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .

ELSEIF cs_data-exceptions-tb_sheetname NE c_retcode-legacy


AND cs_data-exceptions-tb_sheetname NE c_retcode-error .

DATA ls_drawings TYPE lcl_excel=>ty_s_drawings_tmp .


ls_drawings =
r_exceltemplate->get_drawing_static( iv_sheetname = cs_legacy-
tb_sheetname
iv_drwstat_name = cs_data-
properties-tb_drwstat_name ) .
IF ls_drawings IS INITIAL
OR ( ls_drawings-drawing_type NE r_exceltemplate->c_drawing_type-vector
AND
ls_drawings-drawing_type NE r_exceltemplate->c_drawing_type-bitmap )
.
MESSAGE e000(lp)
WITH v_text-t008 " text: Sheet
cs_legacy-tb_sheetname
v_text-t146 " text: does not contain any drawings
cs_data-properties-tb_drwstat_name INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .
ENDIF .
ENDIF .

WHEN abap_off .
CLEAR:
cs_data-properties-tb_drwstat_name .
ENDCASE .

*------ checks 2
DATA:
ls_ctxt_prop TYPE lcl_context=>ty_s_properties .
CASE cs_data-properties-drawing_size .
WHEN c_drawing_size-fit_within_area .
CLEAR:
cs_data-properties-drawing_size_h_relpath ,
cs_data-properties-drawing_size_w_relpath .

WHEN c_drawing_size-from_context .
IF cs_data-exceptions-cb_relpath NE c_retcode-legacy
AND ( cs_legacy-exceptions-cb_relpath EQ c_retcode-error OR
cs_legacy-exceptions-cb_relpath EQ c_retcode-legacy ) .
" set a legacy error (if occurs)
MESSAGE e000(lp) WITH v_text-t020 " text: Context binding
is incorrect
v_text-t021 INTO v_dummy . " text: on the upper
levels
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_relpath = c_retcode-legacy .

ELSE .
* --- Height
IF cs_data-properties-drawing_size_h_relpath IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t139 " text: Drawing
v_text-t340 ':' " text: Height
v_text-t022 INTO v_dummy . " text: Context binding is missing
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_val_relpath = c_retcode-error .

ELSE .
" check relpath for chart title
ls_ctxt_prop = r_context->node_get_by_path(
iv_relpath = cs_data-properties-
drawing_size_h_relpath
iv_fullpath_parent = cs_legacy-cb_fullpath ) .
IF r_context->v_retcode EQ c_retcode-error .
MESSAGE e000(lp)
WITH v_text-t139 " text: Drawing
v_text-t340 ':' " text: Height
v_text-t020 INTO v_dummy . " text: Context binding is
incorrect
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess )
.
cs_data-exceptions-tb_drawing = c_retcode-error .
ENDIF .
ENDIF .
* --- Width
IF cs_data-properties-drawing_size_w_relpath IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t139 " text: Drawing
v_text-t341 ':' " text: Width
v_text-t022 INTO v_dummy . " text: Context binding is missing
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_val_relpath = c_retcode-error .

ELSE .
" check relpath for chart title
ls_ctxt_prop = r_context->node_get_by_path(
iv_relpath = cs_data-properties-
drawing_size_w_relpath
iv_fullpath_parent = cs_legacy-cb_fullpath ) .
IF r_context->v_retcode EQ c_retcode-error .
MESSAGE e000(lp)
WITH v_text-t139 " text: Drawing
v_text-t341 ':' " text: Width
v_text-t020 INTO v_dummy . " text: Context binding is
incorrect
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess )
.
cs_data-exceptions-tb_drawing = c_retcode-error .
ENDIF .
ENDIF .
ENDIF .
ENDCASE .

ENDMETHOD . "check_process_tb_drawing
METHOD check_process_chart .
DATA:
ls_drawings TYPE lcl_excel=>ty_s_drawings_tmp ,
ls_chart_series TYPE lcl_excel=>ty_s_chart_series ,
lt_dtsets TYPE ty_t_nodetab ,
ls_dtset_fldseq TYPE ty_s_grid_fldseq ,
lt_dtset_fldseq TYPE ty_t_grid_fldseq ,
ls_dtset_series_tab TYPE ty_s_dataset_series_tab ,
lt_dtset_series_tab TYPE ty_t_dataset_series_tab ,
lt_dtset_series_tab_tmp TYPE ty_t_dataset_series_tab ,
lv_dtset_series_n_a TYPE ty_char10 ,
lv_dtset_series_all TYPE ty_char10 ,
ls_dtset_ctxt_prop TYPE lcl_context=>ty_s_properties ,
lt_dtset_ctxt_prop TYPE lcl_context=>ty_t_properties ,
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
lv_msg_tmp TYPE string .

CHECK cs_data-properties-comp_type EQ c_comp_type-chart .


cs_data-properties-tb_drwstat_flag = abap_on .

*======================================================================
* Model
*======================================================================
IF cs_data-properties-tb_drwstat_name IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t241 INTO v_dummy . " text: Name of the Chart model is
not specified
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .

ELSEIF cs_data-exceptions-tb_sheetname NE c_retcode-legacy


AND cs_data-exceptions-tb_sheetname NE c_retcode-error .

ls_drawings =
r_exceltemplate->get_drawing_static( iv_sheetname = cs_legacy-tb_sheetname
iv_drwstat_name = cs_data-properties-
tb_drwstat_name ) .
IF ls_drawings IS INITIAL
OR ls_drawings-drawing_type NE r_exceltemplate->c_drawing_type-chart .
MESSAGE e000(lp)
WITH v_text-t008 " text: Sheet
cs_legacy-tb_sheetname
v_text-t242 " text: does not contain any Charts
cs_data-properties-tb_drwstat_name INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .
ENDIF .
ENDIF .

CASE cs_data-properties-chart_title .
WHEN space .
CLEAR cs_data-properties-chart_title_relpath .

WHEN OTHERS .
IF cs_data-properties-chart_title_relpath IS INITIAL .
MESSAGE w000(lp)
WITH v_text-t251 ':' " text: Chart title
v_text-t022 INTO v_dummy . " text: Context binding is missing
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .

ELSE .
IF cs_data-exceptions-cb_relpath NE c_retcode-legacy
AND ( cs_legacy-exceptions-cb_relpath EQ c_retcode-error OR
cs_legacy-exceptions-cb_relpath EQ c_retcode-legacy ) .
" set a legacy error (if occurs)
MESSAGE e000(lp) WITH v_text-t020 " text: Context
binding is incorrect
v_text-t021 INTO v_dummy . " text: on the upper
levels
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_relpath = c_retcode-legacy .
ELSE .
" check relpath for chart title
ls_ctxt_prop = r_context->node_get_by_path(
iv_relpath = cs_data-properties-
chart_title_relpath
iv_fullpath_parent = cs_legacy-cb_fullpath ) .
IF r_context->v_retcode EQ c_retcode-error .
MESSAGE e000(lp)
WITH v_text-t251 ':' " text: Chart title
v_text-t020 INTO v_dummy . " text: Context binding is
incorrect
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess )
.
cs_data-exceptions-tb_drawing = c_retcode-error .
ENDIF .
ENDIF .
ENDIF .
ENDCASE .

CASE cs_data-properties-chart_catax_title .
WHEN space
OR '1' . " -->> From header of grid column
CLEAR cs_data-properties-chart_catax_title_relpath .

WHEN OTHERS .
IF cs_data-properties-chart_catax_title_relpath IS INITIAL .
MESSAGE w000(lp)
WITH v_text-t232 " text: Chart
v_text-t343 ':' " text: Value Axis title
v_text-t022 INTO v_dummy . " text: Context binding is missing
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .

ELSE .

IF cs_data-exceptions-cb_relpath NE c_retcode-legacy
AND ( cs_legacy-exceptions-cb_relpath EQ c_retcode-error OR
cs_legacy-exceptions-cb_relpath EQ c_retcode-legacy ) .
" set a legacy error (if occurs)
MESSAGE e000(lp) WITH v_text-t020 " text: Context
binding is incorrect
v_text-t021 INTO v_dummy . " text: on the upper
levels
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_relpath = c_retcode-legacy .
ELSE .
" check relpath for chart title
ls_ctxt_prop = r_context->node_get_by_path(
iv_relpath = cs_data-properties-
chart_catax_title_relpath
iv_fullpath_parent = cs_legacy-cb_fullpath ) .
IF r_context->v_retcode EQ c_retcode-error .
MESSAGE w000(lp)
WITH v_text-t232 " text: Chart
v_text-t343 ':' " text: Value Axis title
v_text-t022 INTO v_dummy . " text: Context binding is
missing
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess )
.
cs_data-exceptions-tb_drawing = c_retcode-error .
ENDIF .
ENDIF .
ENDIF .
ENDCASE .

CASE cs_data-properties-chart_valax_title .
WHEN space .
CLEAR cs_data-properties-chart_valax_title_relpath .

WHEN OTHERS .
IF cs_data-properties-chart_valax_title_relpath IS INITIAL .
MESSAGE w000(lp)
WITH v_text-t232 " text: Chart
v_text-t343 ':' " text: Value Axis title
v_text-t022 INTO v_dummy . " text: Context binding is missing
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .

ELSE .

IF cs_data-exceptions-cb_relpath NE c_retcode-legacy
AND ( cs_legacy-exceptions-cb_relpath EQ c_retcode-error OR
cs_legacy-exceptions-cb_relpath EQ c_retcode-legacy ) .
" set a legacy error (if occurs)
MESSAGE e000(lp) WITH v_text-t020 " text: Context
binding is incorrect
v_text-t021 INTO v_dummy . " text: on the upper
levels
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_relpath = c_retcode-legacy .
ELSE .
" check relpath for chart title
ls_ctxt_prop = r_context->node_get_by_path(
iv_relpath = cs_data-properties-
chart_valax_title_relpath
iv_fullpath_parent = cs_legacy-cb_fullpath ) .
IF r_context->v_retcode EQ c_retcode-error .
MESSAGE w000(lp)
WITH v_text-t232 " text: Chart
v_text-t343 ':' " text: Value Axis title
v_text-t022 INTO v_dummy . " text: Context binding is
missing
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess )
.
cs_data-exceptions-tb_drawing = c_retcode-error .
ENDIF .
ENDIF .
ENDIF .
ENDCASE .

*======================================================================
* Dataset
*======================================================================
IF cs_data-properties-dataset_id IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t243 INTO v_dummy . " text: Dataset is not specified
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .
EXIT .
ENDIF .

lt_dtsets = get_relevant_datasets( cs_data-properties-id ) .


READ TABLE lt_dtsets TRANSPORTING NO FIELDS
WITH KEY id = cs_data-properties-dataset_id .
IF sy-subrc EQ 0 .
CASE node_get_retcode_severity( cs_data-properties-dataset_id ) .
WHEN c_retcode-legacy OR c_retcode-error .
MESSAGE e000(lp)
WITH v_text-t234 " text: Dataset
v_text-t248 INTO v_dummy . " text: has problems
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .
EXIT .
ENDCASE .
ELSE .
MESSAGE e000(lp)
WITH v_text-t244 INTO v_dummy . " text: Incorrect Dataset is
specified
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .
EXIT .
ENDIF .

*======================================================================
* Series
*======================================================================
CHECK cs_data-exceptions-tb_drawing NE c_retcode-error
AND cs_data-exceptions-tb_drawing NE c_retcode-legacy .

CHECK ls_drawings-chart_series[] IS NOT INITIAL .

* Get Link between Chart series and Dataset fields


lt_dtset_series_tab_tmp[] = conv_dataset_series_st( cs_data-properties-
dataset_series ) .

* Get Available Dataset fields


get_grid_fldseqprop( EXPORTING iv_id = cs_data-properties-dataset_id
IMPORTING et_ctxt_prop = lt_dtset_ctxt_prop[]
et_fldseq = lt_dtset_fldseq[] ) .

CLEAR ls_chart_series .
ls_chart_series-idx = c_chart_category_idx .
ls_chart_series-caption = v_text-t250 . " text: Horizontal (Category)
axis labels
APPEND ls_chart_series TO ls_drawings-chart_series .

LOOP AT ls_drawings-chart_series INTO ls_chart_series .


CLEAR ls_dtset_series_tab .
READ TABLE lt_dtset_series_tab_tmp INTO ls_dtset_series_tab
WITH KEY seridx = ls_chart_series-idx .
IF sy-subrc NE 0 .
ls_dtset_series_tab-seridx = ls_chart_series-idx .
ENDIF .
ls_dtset_series_tab-sercap = ls_chart_series-caption .
IF ls_dtset_series_tab-dtsfld IS NOT INITIAL .
READ TABLE lt_dtset_fldseq TRANSPORTING NO FIELDS
WITH KEY field = ls_dtset_series_tab-dtsfld.
IF sy-subrc NE 0 .
READ TABLE lt_dtset_ctxt_prop INTO ls_dtset_ctxt_prop
WITH KEY comp_fullpath = ls_dtset_series_tab-dtsfld.
IF sy-subrc EQ 0 .
MESSAGE e000(lp)
WITH v_text-t249 " text: Dataset: Grid has hidden
column
ls_dtset_ctxt_prop-comp_name
INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .
ELSE .
CLEAR ls_dtset_series_tab-dtsfld .
ENDIF .
ENDIF .
ENDIF .
APPEND ls_dtset_series_tab TO lt_dtset_series_tab .

CHECK ls_chart_series-idx NE c_chart_category_idx .

IF ls_dtset_series_tab-dtsfld IS INITIAL .
ADD 1 TO lv_dtset_series_n_a .
ENDIF .
ADD 1 TO lv_dtset_series_all .
ENDLOOP .

IF lv_dtset_series_n_a EQ lv_dtset_series_all .
MESSAGE e000(lp)
WITH v_text-t235 " text: Series
':'
v_text-t247 " text: assignment
v_text-t031 " text: is missing
INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .

ELSEIF lv_dtset_series_n_a IS NOT INITIAL .


CONCATENATE '(' lv_dtset_series_n_a
'~' v_text-t246 " text: from
'~' lv_dtset_series_all ') :' INTO lv_msg_tmp .
TRANSLATE lv_msg_tmp USING '~ ' . CONDENSE lv_msg_tmp .

MESSAGE e000(lp)
WITH v_text-t235 " text: Series
lv_msg_tmp
v_text-t247 " text: assignment
v_text-t031 " text: is missing
INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_drawing = c_retcode-error .
ENDIF .

* Set Link between Chart series and Dataset fields


cs_data-properties-dataset_series =
conv_dataset_series_ts( lt_dtset_series_tab[] ) .

ENDMETHOD . "check_process_chart
METHOD check_process_tree .
DATA ls_tree_layout TYPE ty_s_tree_layout .
DATA ls_ctxt_prop TYPE lcl_context=>ty_s_properties .

CASE cs_data-properties-comp_type .
WHEN c_comp_type-tree .
WHEN OTHERS .
CLEAR cs_data-properties-tree_layout .
EXIT .
ENDCASE .

conv_container_fs(
EXPORTING iv_field = cs_data-properties-tree_layout
IMPORTING es_structure = ls_tree_layout ) .

ls_ctxt_prop = r_context->node_get_by_path(
iv_relpath = cs_data-properties-cb_val_relpath
iv_fullpath_parent = cs_legacy-cb_fullpath ) .

*------ validate
IF ls_tree_layout-stru IS INITIAL .
CLEAR ls_tree_layout-stru_exp_coll .

ELSEIF ls_ctxt_prop-comp_type EQ lcl_context=>c_comp_type-tree_s


AND ls_tree_layout-stru_exp_coll EQ lcl_form=>c_stru_exp_coll-dynamic .
ls_tree_layout-stru_exp_coll = lcl_form=>c_stru_exp_coll-collapsed .
ENDIF .

IF ls_tree_layout-col_hier IS INITIAL .
CLEAR ls_tree_layout-col_hier_shift .
CLEAR ls_tree_layout-col_hier_after .
ENDIF .

IF ls_tree_layout-col_othr IS INITIAL .
CLEAR ls_tree_layout-col_othr_width .
CLEAR ls_tree_layout-allow_formulas .
ENDIF .

*------ checks
IF cs_data-exceptions-tb_area NE c_retcode-error
AND ( cs_data-properties-tb_area_rows LT 2 OR cs_data-properties-
tb_area_columns LT 2 ) .
SPLIT v_text-t196 " text: As area specify 2x2(or more) |cell range (see
documentation)
AT '|'
INTO sy-msgv1 sy-msgv2 .
MESSAGE e000(lp)
WITH sy-msgv1 sy-msgv2
INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_area = c_retcode-error .
ENDIF .

IF ls_tree_layout-stru IS INITIAL
AND ls_tree_layout-col_hier IS INITIAL
AND ls_tree_layout-col_othr IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t203 " text: Nothing to output (structure/ hier.col/ other
cols)
INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-tb_area = c_retcode-error .
ENDIF .

conv_container_sf(
EXPORTING is_structure = ls_tree_layout
IMPORTING ev_field = cs_data-properties-tree_layout ) .

ENDMETHOD . "check_process_tree
METHOD check_process_grid .
DATA ls_grid_layout TYPE ty_s_grid_layout .

CASE cs_data-properties-comp_type .
WHEN c_comp_type-grid .
WHEN OTHERS .
CLEAR cs_data-properties-grid_layout .
CLEAR cs_data-properties-grid_fldseq .
CLEAR cs_data-properties-grid_fldprop .
EXIT .
ENDCASE .

conv_container_fs(
EXPORTING iv_field = cs_data-properties-grid_layout
IMPORTING es_structure = ls_grid_layout ) .

*------ validate
IF cs_data-properties-cb_val_relpath IS INITIAL .
CLEAR cs_data-properties-grid_fldseq .
CLEAR cs_data-properties-grid_fldprop .
ELSE .
get_grid_fldseqprop(
EXPORTING iv_id = cs_data-properties-id
IMPORTING ev_grid_fldseq = cs_data-properties-grid_fldseq
ev_grid_fldprop = cs_data-properties-grid_fldprop ) .
ENDIF .

*------ checks
IF cs_data-properties-grid_fldseq IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t231 " text: No column list is specified
INTO v_dummy .
msg_syst_catch2( CHANGING ct_retmess = cs_data-exceptions-t_retmess ) .
cs_data-exceptions-cb_val_relpath = c_retcode-error .
ENDIF .
* IF cs_data-exceptions-tb_area NE c_retcode-error
* AND ( cs_data-properties-tb_area_rows LT 2 OR cs_data-properties-
tb_area_columns LT 2 ) .
*
* ENDIF .

conv_container_sf(
EXPORTING is_structure = ls_grid_layout
IMPORTING ev_field = cs_data-properties-grid_layout ) .

ENDMETHOD . "check_process_grid
METHOD set_context .
msg_init( ) .

IF r_context IS BOUND .
cl_abap_datadescr=>describe_by_name(
EXPORTING p_name = iv_contextname
EXCEPTIONS OTHERS = 4 ) .
IF sy-subrc NE 0 .
MESSAGE e000(lp)
WITH v_text-t004 INTO v_dummy . " text: Specify valid name of the
context
msg_syst_catch( ) .
CHECK v_retcode NE c_retcode-error .
ENDIF .

CLEAR r_context .
FREE r_context .
ENDIF .

CREATE OBJECT r_context


EXPORTING
iv_contextname = iv_contextname.
CHECK v_retcode NE c_retcode-error .

FIELD-SYMBOLS <properties> TYPE ty_s_properties .


READ TABLE t_properties ASSIGNING <properties> WITH KEY id = v_root_id .
IF sy-subrc EQ 0 .
<properties>-cb_relpath = iv_contextname .
ENDIF.

check_subtree( ) .

ENDMETHOD . "set_context
METHOD set_template .
msg_init( ) .

IF r_exceltemplate IS BOUND .
r_exceltemplate->free( ) .
CLEAR r_exceltemplate .
FREE r_exceltemplate .
ENDIF .

CREATE OBJECT r_exceltemplate


EXPORTING
iv_rawdata = iv_rawdata
it_document_table = it_document_table
iv_document_size = iv_document_size
EXCEPTIONS
error_file_reading = 1.
CASE sy-subrc .
WHEN 1 .
v_retcode = c_retcode-error .

ENDCASE .

ENDMETHOD . "set_template
METHOD get_relevant_child_comptypes .
msg_init( ) .

CLEAR rt_child_types[] .

DATA ls_comp_types TYPE ty_s_comp_types .


DATA ls_sheets TYPE lcl_excel=>ty_s_sheets .

IF is_properties-comp_type EQ c_comp_type-sheet
AND is_properties-tb_sheetname IS NOT INITIAL .
ls_sheets = r_exceltemplate->get_sheet( iv_sheetname = is_properties-
tb_sheetname ) .
ENDIF .

LOOP AT t_comp_types INTO ls_comp_types .

CASE is_properties-comp_type .
WHEN c_comp_type-root .
CHECK ls_comp_types-comp_type EQ c_comp_type-sheet
OR ls_comp_types-comp_type EQ c_comp_type-loopstep
OR ls_comp_types-comp_type EQ c_comp_type-folder .
WHEN c_comp_type-sheet .
CASE ls_sheets-chartsheet .
WHEN space .
CHECK ls_comp_types-comp_type EQ c_comp_type-loopstep
OR ls_comp_types-comp_type EQ c_comp_type-pattern
OR ls_comp_types-comp_type EQ c_comp_type-respattern
OR ls_comp_types-comp_type EQ c_comp_type-tree
OR ls_comp_types-comp_type EQ c_comp_type-grid
OR ls_comp_types-comp_type EQ c_comp_type-folder .
WHEN OTHERS .
CHECK ls_comp_types-comp_type EQ c_comp_type-chart .
ENDCASE .
WHEN c_comp_type-loopstep .
CHECK ls_comp_types-comp_type EQ c_comp_type-sheet
OR ls_comp_types-comp_type EQ c_comp_type-loopstep
OR ls_comp_types-comp_type EQ c_comp_type-pattern
OR ls_comp_types-comp_type EQ c_comp_type-respattern
OR ls_comp_types-comp_type EQ c_comp_type-tree
OR ls_comp_types-comp_type EQ c_comp_type-grid
OR ls_comp_types-comp_type EQ c_comp_type-folder .
WHEN c_comp_type-pattern .
CHECK ls_comp_types-comp_type EQ c_comp_type-field
OR ls_comp_types-comp_type EQ c_comp_type-drawing
OR ls_comp_types-comp_type EQ c_comp_type-chart .
WHEN c_comp_type-folder .
CHECK ls_comp_types-comp_type EQ c_comp_type-sheet
OR ls_comp_types-comp_type EQ c_comp_type-loopstep
OR ls_comp_types-comp_type EQ c_comp_type-pattern
OR ls_comp_types-comp_type EQ c_comp_type-respattern
OR ls_comp_types-comp_type EQ c_comp_type-folder
OR ls_comp_types-comp_type EQ c_comp_type-tree
OR ls_comp_types-comp_type EQ c_comp_type-grid .
WHEN c_comp_type-respattern .
CHECK ls_comp_types-comp_type EQ c_comp_type-field
OR ls_comp_types-comp_type EQ c_comp_type-drawing
OR ls_comp_types-comp_type EQ c_comp_type-loopstep
OR ls_comp_types-comp_type EQ c_comp_type-pattern
OR ls_comp_types-comp_type EQ c_comp_type-respattern
OR ls_comp_types-comp_type EQ c_comp_type-folder
OR ls_comp_types-comp_type EQ c_comp_type-tree
OR ls_comp_types-comp_type EQ c_comp_type-grid .

WHEN OTHERS .
* WHEN c_comp_type-field
* OR c_comp_type-drawing
* OR c_comp_type-tree
* OR c_comp_type-grid
* OR c_comp_type-chart .
CONTINUE .
ENDCASE .

INSERT ls_comp_types INTO TABLE rt_child_types .


ENDLOOP .
ENDMETHOD . "get_relevant_child_comptypes
METHOD is_comptype_allowed .
msg_init( ) .
DATA:
ls_properties TYPE ty_s_properties ,
lt_child_types TYPE ty_t_comp_types ,
ls_child_type TYPE ty_s_comp_types ,
ls_comp_type TYPE ty_s_comp_types .

rv_allowed = abap_off .

ls_properties = node_get_skipfolders( iv_id ) .


CHECK v_retcode NE c_retcode-error .
lt_child_types = get_relevant_child_comptypes( ls_properties ) .

READ TABLE lt_child_types TRANSPORTING NO FIELDS


WITH KEY comp_type = iv_child_type BINARY SEARCH .
CASE sy-subrc .
WHEN 0 .
rv_allowed = abap_on .
WHEN OTHERS .
rv_allowed = abap_off .
READ TABLE t_comp_types INTO ls_comp_type
WITH KEY comp_type = ls_properties-comp_type .
READ TABLE t_comp_types INTO ls_child_type
WITH KEY comp_type = iv_child_type .

MESSAGE e000(lp)
WITH v_text-t027 " text: A component
ls_child_type-description
v_text-t035 " text: is inappropriate under the
component
ls_comp_type-description INTO v_dummy .
msg_syst_catch( ) .
ENDCASE .
ENDMETHOD . "is_comptype_allowed
METHOD node_get_properties .
msg_init( ) .

CLEAR rs_properties .
READ TABLE t_properties INTO rs_properties WITH KEY id = iv_id .
IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t005 " text: Requested node was not found in
the structure
INTO v_dummy .
msg_syst_catch( ) .
ENDIF .
CHECK v_retcode NE c_retcode-error .
ENDMETHOD . " node_get_properties
METHOD node_get_exceptions .
msg_init( ) .

CLEAR rs_exceptions .
READ TABLE t_exceptions INTO rs_exceptions WITH KEY id = iv_id .
CHECK sy-subrc NE 0 .
rs_exceptions-id = iv_id .
ENDMETHOD . " node_get_exceptions
METHOD node_get_parent .
msg_init( ) .

DATA ls_hierarchy TYPE ty_s_hierarchy .


*
CLEAR rv_id_parent .

READ TABLE t_hierarchy INTO ls_hierarchy WITH KEY id = iv_id .


IF sy-subrc EQ 0 .
rv_id_parent = ls_hierarchy-parent .
ELSE .
MESSAGE e000(lp) WITH v_text-t005 " text: Requested node was not found in
the structure
INTO v_dummy .
msg_syst_catch( ) .
ENDIF .
ENDMETHOD . "node_get_parent
METHOD node_get_skipfolders .
msg_init( ) .

DATA ls_hierarchy TYPE ty_s_hierarchy .


*
CLEAR rs_properties .
rs_properties-id = iv_id .
DO .
rs_properties = node_get_properties( rs_properties-id ) .
IF v_retcode EQ c_retcode-error .
CLEAR rs_properties .
EXIT .
ENDIF .
IF rs_properties-comp_type NE c_comp_type-folder .
EXIT .
ENDIF .

READ TABLE t_hierarchy INTO ls_hierarchy WITH KEY id = rs_properties-id .


IF sy-subrc NE 0 .
EXIT .
ENDIF .
CLEAR rs_properties .
rs_properties-id = ls_hierarchy-parent .
ENDDO .
ENDMETHOD . " node_get_skipfolders
METHOD node_get_legacy_info .

DATA ls_properties TYPE lcl_form=>ty_s_properties .


DATA ls_exceptions TYPE lcl_form=>ty_s_exceptions .

CLEAR es_exceptions .
CLEAR ev_cb_fullpath .
CLEAR ev_tb_sheetname .
CLEAR ev_tb_sheet_exists .
CLEAR ev_tb_area_top .
CLEAR ev_tb_area_left .
CLEAR ev_tb_area_rows .
CLEAR ev_tb_area_columns .
CLEAR ev_real_level .
CLEAR ev_comp_level .
CLEAR ev_draft_subtree .
ls_properties-id = iv_id .

DEFINE mk_set_legacy_exception .
if &1 eq c_retcode-okey and &2 eq c_retcode-warning .
&1 = c_retcode-warning .
elseif &1 eq c_retcode-okey and &2 eq c_retcode-error .
&1 = c_retcode-error .
elseif &1 eq c_retcode-warning and &2 eq c_retcode-error .
&1 = c_retcode-error .
endif .
END-OF-DEFINITION .

DO .
*------ level
ADD 1 TO ev_real_level .
ADD 1 TO ev_comp_level .

*------
* IF ls_properties-id EQ v_root_id.
* EXIT.
* ENDIF.
ls_properties = node_get_properties( ls_properties-id ) .
ls_exceptions = node_get_exceptions( ls_properties-id ) .

*------ context binding fullpath


IF ls_properties-id NE v_root_id .
ev_cb_fullpath = get_fullpath( iv_parent_fullpath = ls_properties-
cb_relpath " <<--| because a direction is reversed
iv_relpath = ev_cb_fullpath ) .
" <<--|
ENDIF .

*------ name of sheet and sheets existing flag


IF ls_properties-comp_type EQ c_comp_type-sheet .
ev_tb_sheet_exists = abap_on .

IF ls_properties-tb_sheetname IS NOT INITIAL


AND ev_tb_sheetname IS INITIAL .
ev_tb_sheetname = ls_properties-tb_sheetname .
ev_tb_sheet_compname = ls_properties-comp_name .

DATA ls_sheets TYPE lcl_excel=>ty_s_sheets .


ls_sheets = r_exceltemplate->get_sheet( iv_sheetname = ls_properties-
tb_sheetname ) .
ev_tb_chartsheet = ls_sheets-chartsheet .
ENDIF .
ENDIF .

*------ draft ?
IF ls_properties-comp_type EQ c_comp_type-folder
AND ls_properties-draft_subtree EQ c_draft_subtree-yes .
IF ls_properties-id EQ iv_id .
ev_draft_subtree = c_draft_subtree-yes .
ELSE .
ev_draft_subtree = c_draft_subtree-legacy .
ENDIF .
ENDIF .

*------ exceptions
mk_set_legacy_exception:
es_exceptions-comp_type ls_exceptions-comp_type ,
es_exceptions-comp_name ls_exceptions-comp_name ,
es_exceptions-cb_relpath ls_exceptions-cb_relpath ,
es_exceptions-cb_apr_relpath ls_exceptions-cb_apr_relpath ,
es_exceptions-cb_val_relpath ls_exceptions-cb_val_relpath ,
es_exceptions-tb_area ls_exceptions-tb_area ,
es_exceptions-tb_sheetname ls_exceptions-tb_sheetname ,
es_exceptions-tb_drawing ls_exceptions-tb_drawing ,
es_exceptions-dataset ls_exceptions-dataset .
IF ls_properties-id EQ v_root_id .
EXIT .
ENDIF .

*------
ls_properties-id = node_get_parent( ls_properties-id ) .
ENDDO .

ENDMETHOD . "node_get_legacy_info
METHOD node_get_retcode_severity .
DATA ls_exceptions TYPE ty_s_exceptions .
ls_exceptions = node_get_exceptions( iv_id ) .
rv_retcode = c_retcode-okey .

IF ls_exceptions-comp_type EQ c_retcode-error
OR ls_exceptions-comp_name EQ c_retcode-error
OR ls_exceptions-cb_relpath EQ c_retcode-error
OR ls_exceptions-cb_apr_relpath EQ c_retcode-error
OR ls_exceptions-cb_val_relpath EQ c_retcode-error
OR ls_exceptions-tb_area EQ c_retcode-error
OR ls_exceptions-tb_sheetname EQ c_retcode-error
OR ls_exceptions-tb_drawing EQ c_retcode-error
OR ls_exceptions-dataset EQ c_retcode-error
OR ls_exceptions-postprocessing EQ c_retcode-error .
rv_retcode = c_retcode-error .
ELSEIF ls_exceptions-comp_type EQ c_retcode-legacy
OR ls_exceptions-comp_name EQ c_retcode-legacy
OR ls_exceptions-cb_relpath EQ c_retcode-legacy
OR ls_exceptions-cb_apr_relpath EQ c_retcode-legacy
OR ls_exceptions-cb_val_relpath EQ c_retcode-legacy
OR ls_exceptions-tb_area EQ c_retcode-legacy
OR ls_exceptions-tb_sheetname EQ c_retcode-legacy
OR ls_exceptions-tb_drawing EQ c_retcode-legacy
OR ls_exceptions-dataset EQ c_retcode-legacy
OR ls_exceptions-postprocessing EQ c_retcode-legacy .
rv_retcode = c_retcode-legacy .
ELSEIF ls_exceptions-comp_type EQ c_retcode-warning
OR ls_exceptions-comp_name EQ c_retcode-warning
OR ls_exceptions-cb_relpath EQ c_retcode-warning
OR ls_exceptions-cb_apr_relpath EQ c_retcode-warning
OR ls_exceptions-cb_val_relpath EQ c_retcode-warning
OR ls_exceptions-tb_area EQ c_retcode-warning
OR ls_exceptions-tb_sheetname EQ c_retcode-warning
OR ls_exceptions-tb_drawing EQ c_retcode-warning
OR ls_exceptions-dataset EQ c_retcode-warning
OR ls_exceptions-postprocessing EQ c_retcode-warning .
rv_retcode = c_retcode-warning .
ENDIF .
ENDMETHOD . "node_get_retcode_severity
METHOD node_get_protab_relevance .
msg_init( ) .

DATA ls_properties TYPE ty_s_properties .


DATA ls_exceptions TYPE ty_s_exceptions .

IF is_properties IS INITIAL .
ls_properties = node_get_properties( iv_id ) .
CHECK v_retcode NE c_retcode-error .
ELSE .
ls_properties = is_properties .
ENDIF .

CASE ls_properties-comp_type .
WHEN c_comp_type-root .
ev_rt_show = abap_on .
ev_cm_show = abap_off .
ev_pr_show = abap_off .
WHEN OTHERS .
ev_rt_show = abap_off .
ev_pr_show = abap_on .
ev_cm_show = abap_on .
ENDCASE .

IF ev_ms_show IS REQUESTED .
ls_exceptions = node_get_exceptions( ls_properties-id ) .
IF v_retcode NE c_retcode-error
AND ls_exceptions-t_retmess[] IS NOT INITIAL .
ev_ms_show = abap_on .
ELSE .
ev_ms_show = abap_off .
ENDIF .
ENDIF .
ENDMETHOD . "node_get_protab_relevance

METHOD get_grid_fldseqprop .
msg_init( ) .
DATA:
ls_form_prop TYPE ty_s_properties ,
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
lv_begin_fullpath TYPE ty_comp_path ,
ls_fldseq TYPE ty_s_grid_fldseq ,
ls_fldprop TYPE ty_s_grid_fldprop ,
lt_fldprop_tmp TYPE ty_t_grid_fldprop ,
lv_tabix TYPE sytabix ,
lv_fldseq TYPE ty_s_properties-grid_fldseq ,
lv_fldprop TYPE ty_s_properties-grid_fldprop .

ls_form_prop = node_get_properties( iv_id ) .


CHECK v_retcode NE c_retcode-error .

node_get_legacy_info(
EXPORTING iv_id = ls_form_prop-id
IMPORTING ev_cb_fullpath = lv_begin_fullpath ) .

lv_begin_fullpath =
get_fullpath( iv_parent_fullpath = lv_begin_fullpath
iv_relpath = ls_form_prop-cb_val_relpath ) .

r_context->gridfld_get(
EXPORTING iv_begin_fullpath = lv_begin_fullpath
IMPORTING et_hierarchy = et_ctxt_hier
et_properties = et_ctxt_prop ) .

CLEAR ev_grid_fldseq .
CLEAR ev_grid_fldprop .
CLEAR et_fldseq .
CLEAR et_fldprop .

* field sequence
et_fldseq = conv_grid_fldseq_st( iv_grid_fldseq = ls_form_prop-grid_fldseq ) .

LOOP AT et_fldseq INTO ls_fldseq .


lv_tabix = sy-tabix + 1 .
DELETE et_fldseq FROM lv_tabix WHERE field EQ ls_fldseq-field .

READ TABLE et_ctxt_prop INTO ls_ctxt_prop WITH KEY comp_fullpath = ls_fldseq-


field .
CHECK sy-subrc NE 0 .

DELETE et_fldseq .
ENDLOOP .

ev_grid_fldseq = lv_fldseq = conv_grid_fldseq_ts( et_fldseq ) .

* field properties
lt_fldprop_tmp = conv_grid_fldprop_st( iv_grid_fldprop = ls_form_prop-
grid_fldprop ) .

LOOP AT et_fldseq INTO ls_fldseq .


CLEAR ls_fldprop .
READ TABLE lt_fldprop_tmp INTO ls_fldprop
WITH KEY field = ls_fldseq-field .
IF sy-subrc NE 0 .
ls_fldprop-field = ls_fldseq-field .
ENDIF .
APPEND ls_fldprop TO et_fldprop .
ENDLOOP .

ev_grid_fldprop = lv_fldprop = conv_grid_fldprop_ts( et_fldprop ) .

ENDMETHOD . "get_grid_fldseqprop

METHOD get_sub_ctxt .
msg_init( ) .

DATA:
lv_cb_fullpath_sub TYPE ty_comp_path ,
lv_cb_relpath_sub TYPE ty_comp_path .

IF iv_cb_fullpath IS NOT SUPPLIED .


node_get_legacy_info( EXPORTING iv_id = is_form_prop-id
IMPORTING ev_cb_fullpath = iv_cb_fullpath ) .
ENDIF .

lv_cb_fullpath_sub = get_fullpath( iv_parent_fullpath = iv_cb_fullpath


iv_relpath = is_form_prop-
cb_val_relpath ) .

CONCATENATE 'LINE-' is_form_prop-cb_val_sub_col INTO lv_cb_relpath_sub .

rs_ctxt_prop =
r_context->node_get_by_path( iv_relpath = lv_cb_relpath_sub
iv_fullpath_parent = lv_cb_fullpath_sub ) .

ENDMETHOD . "get_sub_ctxt

METHOD get_relevant_datasets .
DATA:
ls_properties TYPE ty_s_properties ,
ls_datasets TYPE ty_s_nodetab ,
lv_cb_fullpath TYPE ty_comp_path ,
lv_cb_fullpath_ds TYPE ty_comp_path ,
lv_tb_sheetname TYPE string ,
lv_tb_sheetname_ds TYPE string .

node_get_legacy_info( EXPORTING iv_id = iv_id


IMPORTING ev_cb_fullpath = lv_cb_fullpath
ev_tb_sheetname = lv_tb_sheetname ) .

LOOP AT t_properties INTO ls_properties WHERE comp_type EQ c_comp_type-grid .


CLEAR lv_cb_fullpath_ds .
node_get_legacy_info( EXPORTING iv_id = ls_properties-id
IMPORTING ev_cb_fullpath = lv_cb_fullpath_ds
ev_tb_sheetname = lv_tb_sheetname_ds ) .
CHECK lv_cb_fullpath EQ lv_cb_fullpath_ds .

IF iv_same_sheet IS NOT INITIAL .


CHECK lv_tb_sheetname EQ lv_tb_sheetname_ds .
ENDIF .

ls_datasets-id = ls_properties-id .
APPEND ls_datasets TO rt_datasets .
ENDLOOP .
ENDMETHOD . "get_relevant_datasets
METHOD get_relevant_vbs_tables .
DATA:
lt_ctxt_hier TYPE lcl_context=>ty_t_hierarchy ,
ls_ctxt_prop TYPE lcl_context=>ty_s_properties .
FIELD-SYMBOLS:
<ls_ctxt_hier> TYPE lcl_context=>ty_s_hierarchy ,
<ls_vbs_tables_tab> TYPE ty_s_vbs_tables_tab .

CLEAR rt_vbs_tables_tab .

*------ get a subtree of relevant context nested tables (on root level)
r_context->subtree_get(
EXPORTING iv_begin_fullpath = space
iv_f4_strategy = r_context->c_f4_strategy-loopstep
IMPORTING et_hierarchy = lt_ctxt_hier ) .
CHECK lt_ctxt_hier[] IS NOT INITIAL .

*------ relevant tables list


LOOP AT lt_ctxt_hier ASSIGNING <ls_ctxt_hier> .
CLEAR ls_ctxt_prop .
ls_ctxt_prop = r_context->node_get( <ls_ctxt_hier>-hide ) .
CHECK v_retcode NE c_retcode-error .
CHECK ls_ctxt_prop-comp_type EQ r_context->c_comp_type-table .

APPEND INITIAL LINE TO rt_vbs_tables_tab ASSIGNING <ls_vbs_tables_tab> .


<ls_vbs_tables_tab>-cb_relpath = ls_ctxt_prop-comp_fullpath .
<ls_vbs_tables_tab>-cb_shortdescr = ls_ctxt_prop-comp_shortdescr .
ENDLOOP .

ENDMETHOD . "get_relevant_vbs_tables
ENDCLASS . "lcl_form IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_formruntime DEFINITION
*----------------------------------------------------------------------*
* Runtime form composer
*----------------------------------------------------------------------*
CLASS lcl_formruntime DEFINITION INHERITING FROM lcl_form .
PUBLIC SECTION .
TYPES:
BEGIN OF ty_s_compose_data ,
properties TYPE ty_s_properties ,
shift_relpath TYPE ty_comp_path ,
shift_apr_relpath TYPE ty_comp_path ,
shift_val_relpath TYPE ty_comp_path ,
shift_cellrng_relpath TYPE ty_comp_path ,
hierarchy TYPE ty_s_hierarchy ,
END OF ty_s_compose_data .
TYPES:
BEGIN OF ty_s_compose_legacy_info ,
cb_fullpath TYPE ty_comp_path ,
shift_fullpath TYPE ty_comp_path ,
rt_path_1 TYPE ty_comp_path ,
tb_sheetname TYPE ty_s_properties-tb_sheetname ,
tb_area_top TYPE ty_s_properties-tb_area_top ,
tb_area_left TYPE ty_s_properties-tb_area_left ,
tb_area_rows TYPE ty_s_properties-tb_area_rows ,
tb_area_columns TYPE ty_s_properties-tb_area_columns ,
tb_area_prew_top TYPE i ,
tb_area_prew_left TYPE i ,
tb_area_prew_rows TYPE i ,
tb_area_prew_columns TYPE i ,
tb_rowgroup_level TYPE i ,
tb_colgroup_level TYPE i ,
real_level TYPE i ,
comp_level TYPE i ,
tb_printtitles_r TYPE snode-id ,
tb_printtitles_c TYPE snode-id ,
summarybelow TYPE flag ,
summaryright TYPE flag ,
END OF ty_s_compose_legacy_info .
TYPES:
BEGIN OF ty_s_buffer_icon ,
id TYPE icon-id ,
name TYPE icon-name ,
rawdata TYPE xstring ,
END OF ty_s_buffer_icon ,
ty_t_buffer_icon TYPE HASHED TABLE OF ty_s_buffer_icon
WITH UNIQUE KEY id .
TYPES:
BEGIN OF ty_s_tree_subtotals ,
nodekey TYPE lvc_nkey ,
fieldname TYPE lvc_fname ,
fieldvalue TYPE string ,
END OF ty_s_tree_subtotals ,
ty_t_tree_subtotals TYPE HASHED TABLE OF ty_s_tree_subtotals
WITH UNIQUE KEY nodekey fieldname .
TYPES:
BEGIN OF ty_s_grid_rowvalues ,
index TYPE i ,
position TYPE i ,
position_rel TYPE i ,
value_fullpath TYPE string ,
value_relpath TYPE string ,
ctxt_prop TYPE lcl_context=>ty_s_properties ,
autofitmerged_r TYPE flag , " -->> for res.pattern
autofitmerged_c TYPE flag , " -->> for res.pattern
END OF ty_s_grid_rowvalues ,
ty_t_grid_rowvalues TYPE STANDARD TABLE OF ty_s_grid_rowvalues
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_grid_rowpattrens ,
position TYPE i ,
position_rel TYPE i ,
columns TYPE i ,
t_autofitmerged_r TYPE ty_t_int_tab ,
t_autofitmerged_c TYPE ty_t_int_tab ,
patterns TYPE lcl_excel=>ty_t_patterns ,
rowvalues TYPE ty_t_grid_rowvalues ,
END OF ty_s_grid_rowpattrens ,
ty_t_grid_rowpattrens TYPE STANDARD TABLE OF ty_s_grid_rowpattrens
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_grid_rowstructure ,
level TYPE i ,
loop_fullpath TYPE string ,
loop_relpath TYPE string ,
rowvalues TYPE ty_t_grid_rowvalues ,
rowpattrens TYPE ty_t_grid_rowpattrens ,
END OF ty_s_grid_rowstructure ,
ty_t_grid_rowstructure TYPE STANDARD TABLE OF ty_s_grid_rowstructure
WITH DEFAULT KEY .
TYPES:
BEGIN OF ty_s_grid_rowstructure_buf ,
form_id TYPE ty_s_hierarchy-id ,
maxlevel TYPE i ,
maxsubpattern TYPE i ,
maxposition TYPE i ,
rowvalues TYPE ty_t_grid_rowvalues ,
patterns_h TYPE lcl_excel=>ty_s_patterns ,
rowstructure TYPE ty_t_grid_rowstructure ,
END OF ty_s_grid_rowstructure_buf ,
ty_t_grid_rowstructure_buf
TYPE HASHED TABLE OF ty_s_grid_rowstructure_buf
WITH UNIQUE KEY form_id .
METHODS:
constructor
IMPORTING iv_formname TYPE any
iv_context_ref TYPE any
iv_protect TYPE any OPTIONAL
iv_startup_macro TYPE any OPTIONAL
it_docproperties TYPE ckf_field_value_table OPTIONAL
EXCEPTIONS process_terminated ,
free REDEFINITION ,
get_rawdata
RETURNING value(rv_rawdata) TYPE xstring ,
get_extension
RETURNING value(rv_extension) TYPE ty_char10 ,
pbo .

DATA:
r_excelruntime TYPE REF TO lcl_excelruntime READ-ONLY .

PROTECTED SECTION .
DATA:
v_proc TYPE i ,
v_step TYPE i ,
t_buffer_icon TYPE ty_t_buffer_icon ,
t_buffer_rs TYPE ty_t_grid_rowstructure_buf .

METHODS:
postprocessing
IMPORTING iv_context_ref TYPE any
iv_startup_macro TYPE any ,
compose_recurs
IMPORTING is_parent_data TYPE ty_s_compose_data
is_parent_context_ref TYPE any
it_comp_type_filter TYPE ty_t_comp_type_rng OPTIONAL
CHANGING cs_parent_legacy TYPE ty_s_compose_legacy_info ,
compose_process
IMPORTING is_parent_data TYPE ty_s_compose_data
is_parent_context_ref TYPE any
CHANGING cs_data TYPE ty_s_compose_data
cs_parent_legacy TYPE ty_s_compose_legacy_info ,
compose_process_sheet
IMPORTING is_parent_data TYPE ty_s_compose_data
is_parent_context_ref TYPE any
is_data TYPE ty_s_compose_data
CHANGING cs_legacy TYPE ty_s_compose_legacy_info
cs_parent_legacy TYPE ty_s_compose_legacy_info ,
compose_process_loopstep
IMPORTING is_parent_data TYPE ty_s_compose_data
is_parent_context_ref TYPE any
is_data TYPE ty_s_compose_data
CHANGING cs_legacy TYPE ty_s_compose_legacy_info
cs_parent_legacy TYPE ty_s_compose_legacy_info ,
compose_process_pattern
IMPORTING is_parent_data TYPE ty_s_compose_data
is_parent_context_ref TYPE any
is_data TYPE ty_s_compose_data
CHANGING cs_legacy TYPE ty_s_compose_legacy_info
cs_parent_legacy TYPE ty_s_compose_legacy_info ,
compose_process_respattern_a
IMPORTING is_parent_data TYPE ty_s_compose_data
is_parent_context_ref TYPE any
is_data TYPE ty_s_compose_data
CHANGING cs_legacy TYPE ty_s_compose_legacy_info
cs_parent_legacy TYPE ty_s_compose_legacy_info ,
compose_process_respattern_b
IMPORTING is_parent_data TYPE ty_s_compose_data
is_parent_context_ref TYPE any
is_data TYPE ty_s_compose_data
CHANGING cs_legacy TYPE ty_s_compose_legacy_info
cs_parent_legacy TYPE ty_s_compose_legacy_info ,
compose_process_folder
IMPORTING is_parent_data TYPE ty_s_compose_data
is_parent_context_ref TYPE any
is_data TYPE ty_s_compose_data
CHANGING cs_legacy TYPE ty_s_compose_legacy_info
cs_parent_legacy TYPE ty_s_compose_legacy_info ,
compose_process_field
IMPORTING is_parent_data TYPE ty_s_compose_data
is_parent_context_ref TYPE any
is_data TYPE ty_s_compose_data
CHANGING cs_legacy TYPE ty_s_compose_legacy_info
cs_parent_legacy TYPE ty_s_compose_legacy_info ,
compose_process_drawing
IMPORTING is_parent_data TYPE ty_s_compose_data
is_parent_context_ref TYPE any
is_data TYPE ty_s_compose_data
CHANGING cs_legacy TYPE ty_s_compose_legacy_info
cs_parent_legacy TYPE ty_s_compose_legacy_info ,
compose_process_chart
IMPORTING is_parent_data TYPE ty_s_compose_data
is_parent_context_ref TYPE any
is_data TYPE ty_s_compose_data
CHANGING cs_legacy TYPE ty_s_compose_legacy_info
cs_parent_legacy TYPE ty_s_compose_legacy_info ,
compose_process_tree
IMPORTING is_parent_data TYPE ty_s_compose_data
is_parent_context_ref TYPE any
is_data TYPE ty_s_compose_data
CHANGING cs_legacy TYPE ty_s_compose_legacy_info
cs_parent_legacy TYPE ty_s_compose_legacy_info ,
compose_process_tree_recurs
IMPORTING iv_parent_node_key TYPE lvc_nkey
iv_parent_level TYPE i
is_parent_patterns_a TYPE lcl_excel=>ty_s_patterns
is_parent_patterns_b TYPE lcl_excel=>ty_s_patterns
it_patterns_a TYPE lcl_excel=>ty_t_patterns
it_patterns_b TYPE lcl_excel=>ty_t_patterns
it_fcat_lvc TYPE lvc_t_fcat
is_tree_layout TYPE ty_s_tree_layout
it_expanded_nodes TYPE lvc_t_nkey
it_subtotals TYPE ty_t_tree_subtotals
CHANGING cr_alvtree TYPE ty_r_tree
cs_outtab_line TYPE any
cs_legacy TYPE ty_s_compose_legacy_info
cv_top TYPE i
cv_left TYPE i
cv_firstrow TYPE flag ,
compose_process_tree_recsub
IMPORTING iv_parent_node_key TYPE lvc_nkey
it_fcat_lvc TYPE lvc_t_fcat
EXPORTING ev_leaf TYPE flag
CHANGING cr_alvtree TYPE ty_r_tree
cs_outtab_line TYPE any
ct_subtotals TYPE ty_t_tree_subtotals ,
compose_process_tree_s
IMPORTING is_parent_data TYPE ty_s_compose_data
is_parent_context_ref TYPE any
is_data TYPE ty_s_compose_data
CHANGING cs_legacy TYPE ty_s_compose_legacy_info
cs_parent_legacy TYPE ty_s_compose_legacy_info ,
compose_process_tree_s_recurs
IMPORTING ir_salv_node_parent TYPE REF TO cl_salv_node
iv_parent_level TYPE i
is_parent_patterns_a TYPE lcl_excel=>ty_s_patterns
is_parent_patterns_b TYPE lcl_excel=>ty_s_patterns
it_patterns_a TYPE lcl_excel=>ty_t_patterns
it_patterns_b TYPE lcl_excel=>ty_t_patterns
it_fcat_lvc TYPE lvc_t_fcat
is_tree_layout TYPE ty_s_tree_layout
it_expanded_nodes TYPE lvc_t_nkey
it_subtotals TYPE ty_t_tree_subtotals
CHANGING cr_salvtree TYPE REF TO cl_salv_tree
cs_legacy TYPE ty_s_compose_legacy_info
cv_top TYPE i
cv_left TYPE i
cv_firstrow TYPE flag ,
compose_process_tree_s_recsub
IMPORTING ir_salv_node_parent TYPE REF TO cl_salv_node
it_fcat_lvc TYPE lvc_t_fcat
EXPORTING ev_leaf TYPE flag
CHANGING cs_outtab_line TYPE any
cr_salvtree TYPE REF TO cl_salv_tree
ct_subtotals TYPE ty_t_tree_subtotals ,
compose_process_grid
IMPORTING is_parent_data TYPE ty_s_compose_data
is_parent_context_ref TYPE any
is_data TYPE ty_s_compose_data
CHANGING cs_legacy TYPE ty_s_compose_legacy_info
cs_parent_legacy TYPE ty_s_compose_legacy_info ,
compose_process_grid_r
IMPORTING iv_parent_level TYPE any
ir_parent_context TYPE any
iv_maxlevel TYPE any
iv_maxsubpattern TYPE any
is_grid_layout TYPE ty_s_grid_layout
CHANGING ct_rowstructure TYPE ty_t_grid_rowstructure
cs_legacy TYPE ty_s_compose_legacy_info
cv_top TYPE i
cv_left TYPE i
cv_subpattern TYPE any
cv_firstcall TYPE flag ,
get_appearance_req
IMPORTING is_parent_context_ref TYPE any
iv_apr_relpath TYPE any
iv_apr_offset TYPE any
iv_apr_match TYPE any
RETURNING value(rv_required) TYPE flag ,
get_value_simple
IMPORTING is_parent_context_ref TYPE any
iv_relpath TYPE any
iv_offset TYPE any
iv_match TYPE any
EXPORTING ev_value TYPE any ,
get_value
IMPORTING is_parent_context_ref TYPE any
iv_shift_val_relpath TYPE any
iv_val_relpath TYPE any
iv_val_sub_req TYPE any DEFAULT space
iv_val_sub_col TYPE any DEFAULT space
iv_val_sub_row TYPE any DEFAULT 0
iv_val_offset TYPE any DEFAULT 0
iv_val_match TYPE any DEFAULT 0
iv_val_convert TYPE any
iv_fullpath TYPE any
value(is_ctxt_prop) TYPE lcl_context=>ty_s_properties
OPTIONAL
RETURNING value(rv_value) TYPE string ,
get_icon_rawdata
IMPORTING iv_icon TYPE any "icon_d
RETURNING value(rv_rawdata) TYPE xstring ,
shift_relpath
CHANGING cv_relpath TYPE any ,
salv_node_get_children
IMPORTING ir_salv_node TYPE REF TO cl_salv_node
RETURNING value(rt_nodes) TYPE salv_t_nodes .

ENDCLASS . "lcl_formruntime DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_formruntime IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_formruntime IMPLEMENTATION .
METHOD constructor .
super->constructor( EXPORTING iv_formname = iv_formname
EXCEPTIONS process_terminated = 1 ) .
IF sy-subrc NE 0 .
RAISE process_terminated .
ENDIF .
IF v_active IS INITIAL .
MESSAGE i000(lp) WITH v_text-t036 " text: Form is inactive
RAISING process_terminated .
ENDIF .

tech_presets_rt_load( ) .

CREATE OBJECT r_excelruntime


EXCEPTIONS
error_file_reading = 1.
IF sy-subrc NE 0 .
RAISE process_terminated .
ENDIF .

r_exceltemplate->bufferization_patterns( t_patternarea ) .

DATA:
ls_properties TYPE ty_s_properties .

READ TABLE t_properties INTO ls_properties


WITH KEY id = v_root_id .

r_excelruntime->begin_model( is_model = r_exceltemplate->s_model


iv_extension = r_exceltemplate->v_extension
ir_zipfolder = r_exceltemplate->r_zipfolder
iv_protect = iv_protect
iv_definednames_dont_remove = ls_properties-
definednames_dont_remove ) .
DATA:
ls_data TYPE ty_s_compose_data ,
ls_legacy TYPE ty_s_compose_legacy_info .

ls_data-hierarchy-child = v_root_id .

msg_init( ) .
compose_recurs( EXPORTING is_parent_data = ls_data
is_parent_context_ref = iv_context_ref
CHANGING cs_parent_legacy = ls_legacy ) .
msg_show( ) .

progressbar( iv_percentage = 80
iv_text = v_text-t197 ) . " -->> text: Writing of data to
XLSX-file

r_excelruntime->finalize_model( EXPORTING it_docproperties =


it_docproperties
EXCEPTIONS process_terminated = 1 ) .
IF sy-subrc NE 0 .
RAISE process_terminated .
ENDIF .

* OLE/VBScript post-processing (if required)


postprocessing( iv_context_ref = iv_context_ref
iv_startup_macro = iv_startup_macro ) .

ENDMETHOD . "constructor
METHOD free .
super->free( ).
ENDMETHOD . "free
METHOD get_rawdata .
rv_rawdata = r_excelruntime->rawdata_get( ) .
ENDMETHOD . "get_rawdata
METHOD get_extension .
rv_extension = r_excelruntime->v_extension .
ENDMETHOD . "get_extension
METHOD pbo .

ENDMETHOD . "pbo
METHOD postprocessing .
DATA:
ls_properties TYPE ty_s_properties ,
lt_vbs_tables_tab TYPE ty_t_vbs_tables_tab .
FIELD-SYMBOLS:
<ls_vbs_tables_tab> TYPE ty_s_vbs_tables_tab ,
<lt_context_tab> TYPE ANY TABLE .

*------ read root node


ls_properties = node_get_properties( v_root_id ) .

*------ get tables list


lt_vbs_tables_tab = conv_vbs_tables_st( ls_properties-postproc_vbs_tables ) .

*------ get tables data


LOOP AT lt_vbs_tables_tab ASSIGNING <ls_vbs_tables_tab> .

* get data from context nested table


shift_relpath( CHANGING cv_relpath = <ls_vbs_tables_tab>-cb_relpath ) .

IF <ls_vbs_tables_tab>-cb_relpath IS INITIAL .
ASSIGN iv_context_ref TO <lt_context_tab> .
ELSE .
ASSIGN COMPONENT <ls_vbs_tables_tab>-cb_relpath
OF STRUCTURE iv_context_ref TO <lt_context_tab> .
CHECK <lt_context_tab> IS ASSIGNED .
ENDIF .

GET REFERENCE OF <lt_context_tab>


INTO <ls_vbs_tables_tab>-table_data .
ENDLOOP .

*------ process
r_excelruntime->postprocessing( EXPORTING iv_startup_macro = iv_startup_macro
CHANGING cv_vbs_code = ls_properties-
postproc_vbs_code
ct_vbs_tables_tab = lt_vbs_tables_tab
) .
ENDMETHOD . "postprocessing
METHOD compose_recurs .
DATA:
ls_data TYPE ty_s_compose_data ,
lv_id_next TYPE snode-id .

lv_id_next = is_parent_data-hierarchy-child .

DO .
CLEAR ls_data .

* read a next node


READ TABLE t_hierarchy INTO ls_data-hierarchy
WITH KEY parent = is_parent_data-hierarchy-id
id = lv_id_next .
IF sy-subrc NE 0 .
EXIT .
ENDIF .

IF c_retcode-error NE node_get_retcode_severity( ls_data-hierarchy-id ) .

READ TABLE t_properties INTO ls_data-properties


WITH KEY id = ls_data-hierarchy-id .
IF sy-subrc NE 0 .
EXIT .
ENDIF .

IF ls_data-properties-comp_type IN it_comp_type_filter[] .

* process an actual component


compose_process( EXPORTING is_parent_data = is_parent_data
is_parent_context_ref = is_parent_context_ref
CHANGING cs_data = ls_data
cs_parent_legacy = cs_parent_legacy ) .
ENDIF .
ENDIF .

IF ls_data-hierarchy-next IS INITIAL .
EXIT .
ELSE .
lv_id_next = ls_data-hierarchy-next .
ENDIF .
ENDDO .

ENDMETHOD . "compose_recurs
METHOD compose_process .
DATA:
ls_legacy TYPE ty_s_compose_legacy_info ,
lv_progress_text TYPE ty_char100 .

* progress indicator
IF v_step GE 654 .
v_step = 0 .
lv_progress_text = v_proc .
CONDENSE lv_progress_text NO-GAPS .

CONCATENATE v_text-t184 " text: Preparing of form data. Step:


lv_progress_text INTO lv_progress_text SEPARATED BY space .

progressbar( iv_percentage = 0
iv_text = lv_progress_text ) .
ENDIF .
ADD 1 TO v_step .
ADD 1 TO v_proc .

* check: is this component (and subcomponents) not a draft ?


CHECK cs_data-properties-draft_subtree EQ c_draft_subtree-no .

* preset runtime path


ls_legacy-rt_path_1 = cs_parent_legacy-rt_path_1 .

* preset a fullpath
ls_legacy-cb_fullpath = get_fullpath( iv_parent_fullpath = cs_parent_legacy-
cb_fullpath
iv_relpath = cs_data-properties-
cb_relpath ) .
* preset shifted values
cs_data-shift_relpath = cs_data-properties-cb_relpath .
cs_data-shift_apr_relpath = cs_data-properties-cb_apr_relpath .
cs_data-shift_val_relpath = cs_data-properties-cb_val_relpath .
cs_data-shift_cellrng_relpath = cs_data-properties-cb_cellrng_relpath .
shift_relpath( CHANGING cv_relpath = cs_data-shift_relpath ) .
shift_relpath( CHANGING cv_relpath = cs_data-shift_apr_relpath ) .
shift_relpath( CHANGING cv_relpath = cs_data-shift_val_relpath ) .
shift_relpath( CHANGING cv_relpath = cs_data-shift_cellrng_relpath ) .

ls_legacy-shift_fullpath = get_fullpath( iv_parent_fullpath =


cs_parent_legacy-shift_fullpath
iv_relpath = cs_data-shift_relpath ) .
* preset other legacy data
ls_legacy-tb_area_top = cs_parent_legacy-tb_area_top .
ls_legacy-tb_area_left = cs_parent_legacy-tb_area_left .
ls_legacy-tb_area_rows = cs_parent_legacy-tb_area_rows .
ls_legacy-tb_area_columns = cs_parent_legacy-tb_area_columns .
ls_legacy-tb_area_prew_left = cs_parent_legacy-tb_area_prew_left .
ls_legacy-tb_area_prew_top = cs_parent_legacy-tb_area_prew_top .
ls_legacy-tb_area_prew_rows = cs_parent_legacy-tb_area_prew_rows .
ls_legacy-tb_area_prew_columns = cs_parent_legacy-tb_area_prew_columns .
ls_legacy-tb_sheetname = cs_parent_legacy-tb_sheetname .
ls_legacy-tb_rowgroup_level = cs_parent_legacy-tb_rowgroup_level .
ls_legacy-tb_colgroup_level = cs_parent_legacy-tb_colgroup_level .
ls_legacy-tb_printtitles_r = cs_parent_legacy-tb_printtitles_r .
ls_legacy-tb_printtitles_c = cs_parent_legacy-tb_printtitles_c .
ls_legacy-summarybelow = cs_parent_legacy-summarybelow .
ls_legacy-summaryright = cs_parent_legacy-summaryright .
ls_legacy-comp_level = cs_parent_legacy-comp_level + 1 .
IF cs_data-properties-comp_type EQ c_comp_type-folder .
ls_legacy-real_level = cs_parent_legacy-real_level .
ELSE .
ls_legacy-real_level = cs_parent_legacy-real_level + 1 .
ENDIF .

* check: is this component (and subcomponents) have to appear in runtime ?


CHECK space NE
get_appearance_req(
is_parent_context_ref = is_parent_context_ref
iv_apr_relpath = cs_data-shift_apr_relpath
iv_apr_offset = cs_data-properties-cb_apr_offset
iv_apr_match = cs_data-properties-cb_apr_match ) .

* component processing
CASE cs_data-properties-comp_type .
WHEN c_comp_type-root .
CLEAR ls_legacy-cb_fullpath .
CLEAR ls_legacy-shift_fullpath .

IF cs_data-hierarchy-child IS NOT INITIAL .


compose_recurs( EXPORTING is_parent_data = cs_data
is_parent_context_ref = is_parent_context_ref
CHANGING cs_parent_legacy = ls_legacy ) .
ENDIF .
WHEN c_comp_type-sheet .
compose_process_sheet(
EXPORTING
is_parent_data = is_parent_data
is_parent_context_ref = is_parent_context_ref
is_data = cs_data
CHANGING
cs_legacy = ls_legacy
cs_parent_legacy = cs_parent_legacy ).

WHEN c_comp_type-loopstep .
compose_process_loopstep(
EXPORTING
is_parent_data = is_parent_data
is_parent_context_ref = is_parent_context_ref
is_data = cs_data
CHANGING
cs_legacy = ls_legacy
cs_parent_legacy = cs_parent_legacy ).

WHEN c_comp_type-pattern .
compose_process_pattern(
EXPORTING
is_parent_data = is_parent_data
is_parent_context_ref = is_parent_context_ref
is_data = cs_data
CHANGING
cs_legacy = ls_legacy
cs_parent_legacy = cs_parent_legacy ).

WHEN c_comp_type-respattern .
CASE cs_data-properties-tb_respattern_place .
WHEN c_respattern_place-before_subarea .
compose_process_respattern_b(
EXPORTING
is_parent_data = is_parent_data
is_parent_context_ref = is_parent_context_ref
is_data = cs_data
CHANGING
cs_legacy = ls_legacy
cs_parent_legacy = cs_parent_legacy ).

WHEN c_respattern_place-after_subarea .
compose_process_respattern_a(
EXPORTING
is_parent_data = is_parent_data
is_parent_context_ref = is_parent_context_ref
is_data = cs_data
CHANGING
cs_legacy = ls_legacy
cs_parent_legacy = cs_parent_legacy ).
ENDCASE .

WHEN c_comp_type-field .
compose_process_field(
EXPORTING
is_parent_data = is_parent_data
is_parent_context_ref = is_parent_context_ref
is_data = cs_data
CHANGING
cs_legacy = ls_legacy
cs_parent_legacy = cs_parent_legacy ).

WHEN c_comp_type-drawing .
compose_process_drawing(
EXPORTING
is_parent_data = is_parent_data
is_parent_context_ref = is_parent_context_ref
is_data = cs_data
CHANGING
cs_legacy = ls_legacy
cs_parent_legacy = cs_parent_legacy ).

WHEN c_comp_type-chart .
compose_process_chart(
EXPORTING
is_parent_data = is_parent_data
is_parent_context_ref = is_parent_context_ref
is_data = cs_data
CHANGING
cs_legacy = ls_legacy
cs_parent_legacy = cs_parent_legacy ).

WHEN c_comp_type-folder .
compose_process_folder(
EXPORTING
is_parent_data = is_parent_data
is_parent_context_ref = is_parent_context_ref
is_data = cs_data
CHANGING
cs_legacy = ls_legacy
cs_parent_legacy = cs_parent_legacy ).

WHEN c_comp_type-tree .
compose_process_tree(
EXPORTING
is_parent_data = is_parent_data
is_parent_context_ref = is_parent_context_ref
is_data = cs_data
CHANGING
cs_legacy = ls_legacy
cs_parent_legacy = cs_parent_legacy ).

WHEN c_comp_type-grid .
compose_process_grid(
EXPORTING
is_parent_data = is_parent_data
is_parent_context_ref = is_parent_context_ref
is_data = cs_data
CHANGING
cs_legacy = ls_legacy
cs_parent_legacy = cs_parent_legacy ).
WHEN OTHERS.
ENDCASE.

DATA:
lv_new_rows TYPE i ,
lv_new_columns TYPE i .
lv_new_rows = ls_legacy-tb_area_top + ls_legacy-tb_area_rows -
cs_parent_legacy-tb_area_top .
lv_new_columns = ls_legacy-tb_area_left + ls_legacy-tb_area_columns -
cs_parent_legacy-tb_area_left .

IF cs_parent_legacy-tb_area_rows LT lv_new_rows .
cs_parent_legacy-tb_area_rows = lv_new_rows .
ENDIF .
IF cs_parent_legacy-tb_area_columns LT lv_new_columns .
cs_parent_legacy-tb_area_columns = lv_new_columns .
ENDIF .

ENDMETHOD . "compose_process
METHOD compose_process_sheet .
DATA:
lv_sheetname_template TYPE string ,
lv_sheetname_target TYPE string ,
ls_sheets TYPE lcl_excel=>ty_s_sheets ,
lv_val_fullpath TYPE string ,
lv_shift_val_relpath TYPE string ,
lv_hidden TYPE flag ,
ls_sheetprotection TYPE ty_s_sheetprotection ,
ls_sheetprotection_flags TYPE ty_s_sheetprotection_flags ,
lv_sheetprotection_flags TYPE string .
FIELD-SYMBOLS:
<context_ref> TYPE ANY .

* binding with reference of context data


IF is_data-shift_relpath IS INITIAL .
ASSIGN is_parent_context_ref TO <context_ref> .
ELSE .
ASSIGN COMPONENT is_data-shift_relpath
OF STRUCTURE is_parent_context_ref TO <context_ref> .
CHECK <context_ref> IS ASSIGNED .
ENDIF .

* name of sheet in the template


lv_sheetname_template = is_data-properties-tb_sheetname .
cs_legacy-tb_sheetname = is_data-properties-tb_sheetname .

* name of sheet in the runtime form (may be not specified)


lv_val_fullpath = get_fullpath( iv_parent_fullpath = cs_legacy-cb_fullpath
iv_relpath = is_data-properties-
cb_val_relpath ) .

lv_sheetname_target =
get_value(
is_parent_context_ref = is_parent_context_ref
iv_shift_val_relpath = is_data-shift_val_relpath
iv_val_relpath = is_data-properties-cb_val_relpath
iv_val_sub_req = is_data-properties-cb_val_sub_req
iv_val_sub_col = is_data-properties-cb_val_sub_col
iv_val_sub_row = is_data-properties-cb_val_sub_row
iv_val_offset = is_data-properties-cb_val_offset
iv_val_match = is_data-properties-cb_val_match
iv_val_convert = is_data-properties-cb_val_convert
iv_fullpath = lv_val_fullpath ) .
IF lv_sheetname_target IS INITIAL .
lv_sheetname_target = lv_sheetname_template .
ENDIF .
IF is_data-properties-tb_sheetstate IS NOT INITIAL .
lv_hidden = abap_on .
ENDIF .

* sheet protection options


ls_sheetprotection = lcl_form=>conv_sheetprotection_st( is_data-properties-
tb_sheetprotection ) .
MOVE-CORRESPONDING ls_sheetprotection TO ls_sheetprotection_flags .

DO 1 TIMES .
CHECK ls_sheetprotection-mode EQ c_sheetprotection_mode-from_context
AND ls_sheetprotection-cb_val_relpath IS NOT INITIAL .

lv_val_fullpath = get_fullpath( iv_parent_fullpath = cs_legacy-cb_fullpath


iv_relpath = ls_sheetprotection-
cb_val_relpath ) .

lv_shift_val_relpath = ls_sheetprotection-cb_val_relpath .
shift_relpath( CHANGING cv_relpath = lv_shift_val_relpath ) .

lv_sheetprotection_flags =
get_value(
is_parent_context_ref = is_parent_context_ref
iv_shift_val_relpath = lv_shift_val_relpath
iv_val_relpath = ls_sheetprotection-cb_val_relpath
iv_val_convert = space
iv_fullpath = lv_val_fullpath ) .

CLEAR ls_sheetprotection_flags .
ls_sheetprotection_flags = lv_sheetprotection_flags .
ENDDO .

MOVE-CORRESPONDING ls_sheetprotection_flags TO ls_sheetprotection .

* initialize a sheet in runtime form (based on the the template sheet)


ls_sheets =
r_exceltemplate->get_sheet( lv_sheetname_template ) .

lv_sheetname_target =
r_excelruntime->begin_sheet(
iv_sheetname = lv_sheetname_target
iv_hidden = lv_hidden
iv_ixml_doc = ls_sheets-ixml_doc
it_sheetrels = ls_sheets-sheetdata_template-t_sheetrels[]
iv_summarybelow = ls_sheets-summarybelow
iv_summaryright = ls_sheets-summaryright
iv_active = ls_sheets-active
is_sheetprotection = ls_sheetprotection
is_vmldrawings = ls_sheets-sheetdata_template-vmldrawings ) .

cs_legacy-tb_area_top = 0 .
cs_legacy-tb_area_left = 0 .
cs_legacy-tb_area_rows = 0 .
cs_legacy-tb_area_columns = 0 .
cs_legacy-tb_area_prew_left = 0 .
cs_legacy-tb_area_prew_top = 0 .
cs_legacy-tb_area_prew_rows = 0 .
cs_legacy-tb_area_prew_columns = 0 .
cs_legacy-tb_printtitles_r = is_data-properties-tb_printtitles_r .
cs_legacy-tb_printtitles_c = is_data-properties-tb_printtitles_c .
cs_legacy-summarybelow = ls_sheets-summarybelow .
cs_legacy-summaryright = ls_sheets-summaryright .

* recursive processing of child components (if one exists)


IF is_data-hierarchy-child IS NOT INITIAL .
compose_recurs( EXPORTING is_parent_data = is_data
is_parent_context_ref = <context_ref>
CHANGING cs_parent_legacy = cs_legacy ) .
ENDIF .

* finalize the sheet in runtime form


r_excelruntime->finalize_sheet( ) .

ENDMETHOD . "compose_process_sheet
METHOD compose_process_loopstep .
DATA:
lv_lines TYPE i ,
lv_from TYPE i ,
lv_to TYPE i ,
lv_tabix TYPE i ,
lv_seqnr TYPE c LENGTH 20 ,
lr_descr_tab TYPE REF TO cl_abap_tabledescr .
FIELD-SYMBOLS:
<cb_reftable_any> TYPE ANY TABLE ,
<cb_reftable_std> TYPE STANDARD TABLE ,
<context_ref> TYPE ANY .

* check existence of child components


CHECK is_data-hierarchy-child IS NOT INITIAL.

* binding with reference of context data (it only can have a type of nested
table)
IF is_data-shift_relpath IS INITIAL .
ASSIGN is_parent_context_ref TO <cb_reftable_any> .
ELSE .
ASSIGN COMPONENT is_data-shift_relpath
OF STRUCTURE is_parent_context_ref TO <cb_reftable_any> .
CHECK <cb_reftable_any> IS ASSIGNED .
ENDIF .

DEFINE mk_process .
* preset runtime path
add 1 to lv_seqnr . condense lv_seqnr no-gaps .
concatenate cs_legacy-cb_fullpath '(' lv_seqnr ')' into cs_legacy-rt_path_1 .

compose_recurs( exporting is_parent_data = is_data


is_parent_context_ref = <context_ref>
changing cs_parent_legacy = cs_legacy ) .
cs_parent_legacy-tb_area_prew_top = cs_legacy-tb_area_prew_top =
cs_legacy-tb_area_top .
cs_parent_legacy-tb_area_prew_rows = cs_legacy-tb_area_prew_rows =
cs_legacy-tb_area_rows .
cs_parent_legacy-tb_area_prew_left = cs_legacy-tb_area_prew_left =
cs_legacy-tb_area_left .
cs_parent_legacy-tb_area_prew_columns = cs_legacy-tb_area_prew_columns =
cs_legacy-tb_area_columns .
END-OF-DEFINITION .

* all records (without conditions)


IF is_data-properties-cb_loop_from BETWEEN 0 AND 1
AND is_data-properties-cb_loop_to EQ 0 .
LOOP AT <cb_reftable_any> ASSIGNING <context_ref> .
mk_process .
ENDLOOP .
EXIT . " -->> RETURN
ENDIF .

* check and validate From and To conditions


lv_lines = LINES( <cb_reftable_any> ) .
CHECK lv_lines GT 0 .

IF is_data-properties-cb_loop_from LE 1 .
lv_from = 1 .
ELSEIF is_data-properties-cb_loop_from BETWEEN 2 AND lv_lines .
lv_from = is_data-properties-cb_loop_from .
ELSE .
EXIT .
ENDIF .

IF is_data-properties-cb_loop_to BETWEEN lv_from AND lv_lines .


lv_to = is_data-properties-cb_loop_to .
ELSE .
lv_to = lv_lines .
ENDIF .

* all records (without conditions)


IF lv_to EQ 0
AND lv_from LE 1 .

LOOP AT <cb_reftable_any> ASSIGNING <context_ref> .


mk_process .
ENDLOOP .
EXIT . " -->> RETURN
ENDIF .

* kind of table ?
lr_descr_tab ?= cl_abap_typedescr=>describe_by_data( <cb_reftable_any> ) .

IF lr_descr_tab IS BOUND
AND lr_descr_tab->table_kind EQ cl_abap_tabledescr=>tablekind_std .
* process Sorted table
ASSIGN <cb_reftable_any> TO <cb_reftable_std> .
LOOP AT <cb_reftable_std> ASSIGNING <context_ref> FROM lv_from TO lv_to .
mk_process .
ENDLOOP .
ELSE .
* process Other table
LOOP AT <cb_reftable_any> ASSIGNING <context_ref> .
ADD 1 TO lv_tabix .
CHECK lv_tabix BETWEEN lv_from AND lv_to .
mk_process .
ENDLOOP .
ENDIF .

ENDMETHOD . "compose_process_loopstep
METHOD compose_process_pattern .
DATA:
ls_patterns TYPE lcl_excel=>ty_s_patterns ,
lv_printtitles_r_flag TYPE flag ,
lv_printtitles_c_flag TYPE flag .
FIELD-SYMBOLS:
<context_ref> TYPE ANY .

* binding with reference of context data


IF is_data-shift_relpath IS INITIAL .
ASSIGN is_parent_context_ref TO <context_ref> .
ELSE .
ASSIGN COMPONENT is_data-shift_relpath
OF STRUCTURE is_parent_context_ref TO <context_ref> .
CHECK <context_ref> IS ASSIGNED .
ENDIF .

* get a content of pattern area


ls_patterns =
r_exceltemplate->get_pattern( iv_sheetname = cs_parent_legacy-tb_sheetname
iv_id = is_data-properties-id ) .

* initialize a pattern in runtime form


r_excelruntime->begin_pattern( is_patterns = ls_patterns ) .

* recursive processing of child components (if one exists)


IF is_data-hierarchy-child IS NOT INITIAL .
compose_recurs( EXPORTING is_parent_data = is_data
is_parent_context_ref = <context_ref>
CHANGING cs_parent_legacy = cs_legacy ) .
ENDIF .

* finalize pattetn
cs_legacy-tb_area_rows = ls_patterns-rows .
cs_legacy-tb_area_columns = ls_patterns-columns .

CASE is_data-properties-tb_direction .
WHEN c_tb_direction-up2down .
cs_legacy-tb_area_top = cs_parent_legacy-tb_area_prew_top +
cs_parent_legacy-tb_area_prew_rows .

cs_legacy-tb_area_left = cs_parent_legacy-tb_area_prew_left .

WHEN c_tb_direction-left2right .
cs_legacy-tb_area_left = cs_parent_legacy-tb_area_prew_left +
cs_parent_legacy-tb_area_prew_columns .

cs_legacy-tb_area_top = cs_parent_legacy-tb_area_prew_top .
ENDCASE .

cs_parent_legacy-tb_area_prew_top = cs_legacy-tb_area_prew_top =
cs_legacy-tb_area_top .
cs_parent_legacy-tb_area_prew_rows = cs_legacy-tb_area_prew_rows =
cs_legacy-tb_area_rows .
cs_parent_legacy-tb_area_prew_left = cs_legacy-tb_area_prew_left =
cs_legacy-tb_area_left .
cs_parent_legacy-tb_area_prew_columns = cs_legacy-tb_area_prew_columns =
cs_legacy-tb_area_columns .

* finalize the pattern in runtime form


IF is_data-properties-id EQ cs_legacy-tb_printtitles_r .
lv_printtitles_r_flag = abap_on .
ENDIF .
IF is_data-properties-id EQ cs_legacy-tb_printtitles_c .
lv_printtitles_c_flag = abap_on .
ENDIF .
r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r =
lv_printtitles_r_flag
iv_printtitles_c =
lv_printtitles_c_flag
iv_autofitmerged_r = is_data-
properties-tb_autofitmerged_r
iv_autofitmerged_c = is_data-
properties-tb_autofitmerged_c
CHANGING cv_top = cs_legacy-tb_area_top
cv_left = cs_legacy-
tb_area_left ) .

ENDMETHOD . "compose_process_pattern
METHOD compose_process_respattern_a .

* place resizable pattern AFTER it's subarea

DATA:
ls_patterns TYPE lcl_excel=>ty_s_patterns ,
lv_printtitles_r_flag TYPE flag ,
lv_printtitles_c_flag TYPE flag ,
ls_comp_type_filter TYPE ty_s_comp_type_rng ,
lt_comp_type_filter TYPE ty_t_comp_type_rng ,
lv_tb_area_top TYPE i ,
lv_tb_area_left TYPE i ,
lv_tb_area_rows TYPE i ,
lv_tb_area_columns TYPE i ,
lv_tb_mergecells TYPE ty_char1 .
FIELD-SYMBOLS:
<context_ref> TYPE ANY .

* binding with reference of context data


IF is_data-shift_relpath IS INITIAL .
ASSIGN is_parent_context_ref TO <context_ref> .
ELSE .
ASSIGN COMPONENT is_data-shift_relpath
OF STRUCTURE is_parent_context_ref TO <context_ref> .
CHECK <context_ref> IS ASSIGNED .
ENDIF .

lv_tb_mergecells = is_data-properties-tb_mergecells .

*================================================================================
* print Sub-patterns
*================================================================================
cs_legacy-tb_area_rows = 0 .
cs_legacy-tb_area_columns = 0 .

CASE is_data-properties-tb_direction .
WHEN c_tb_direction-up2down .
cs_legacy-tb_area_top = cs_parent_legacy-tb_area_prew_top +
cs_parent_legacy-tb_area_prew_rows .
cs_legacy-tb_area_left = cs_parent_legacy-tb_area_prew_left .

WHEN c_tb_direction-left2right .
cs_legacy-tb_area_left = cs_parent_legacy-tb_area_prew_left +
cs_parent_legacy-tb_area_prew_columns .
cs_legacy-tb_area_top = cs_parent_legacy-tb_area_prew_top .
ENDCASE .

cs_legacy-tb_area_prew_left = cs_legacy-tb_area_left .
cs_legacy-tb_area_prew_top = cs_legacy-tb_area_top .
cs_legacy-tb_area_prew_rows = cs_legacy-tb_area_rows .
cs_legacy-tb_area_prew_columns = cs_legacy-tb_area_columns .

* recursive processing of child components (if one exists)


IF is_data-hierarchy-child IS NOT INITIAL .
CLEAR lt_comp_type_filter .
ls_comp_type_filter-sign = rs_c_range_sign-excluding .
ls_comp_type_filter-option = rs_c_range_opt-equal .
ls_comp_type_filter-low = c_comp_type-field .
COLLECT ls_comp_type_filter INTO lt_comp_type_filter .

compose_recurs( EXPORTING is_parent_data = is_data


is_parent_context_ref = <context_ref>
it_comp_type_filter = lt_comp_type_filter
CHANGING cs_parent_legacy = cs_legacy ) .
ENDIF .

lv_tb_area_top = cs_legacy-tb_area_top .
lv_tb_area_left = cs_legacy-tb_area_left .
lv_tb_area_rows = cs_legacy-tb_area_rows .
lv_tb_area_columns = cs_legacy-tb_area_columns .

*================================================================================
* print a resizable (spanned) pattern
*================================================================================

* get a content of pattern area


ls_patterns =
r_exceltemplate->get_pattern( iv_sheetname = cs_parent_legacy-tb_sheetname
iv_id = is_data-properties-id ) .

* initialize a pattern in runtime form


r_excelruntime->begin_pattern( is_patterns = ls_patterns ) .

CASE is_data-properties-tb_mergecells .
WHEN c_tb_mergecells-cols .
cs_legacy-tb_area_top = cs_legacy-tb_area_top +
cs_legacy-tb_area_rows .
WHEN c_tb_mergecells-rows .
cs_legacy-tb_area_left = cs_legacy-tb_area_left +
cs_legacy-tb_area_columns .
ENDCASE .

* recursive processing of child components (Fields only)


IF is_data-hierarchy-child IS NOT INITIAL .
CLEAR lt_comp_type_filter .
ls_comp_type_filter-sign = rs_c_range_sign-including .
ls_comp_type_filter-option = rs_c_range_opt-equal .
ls_comp_type_filter-low = c_comp_type-field .
COLLECT ls_comp_type_filter INTO lt_comp_type_filter .

compose_recurs( EXPORTING is_parent_data = is_data


is_parent_context_ref = <context_ref>
it_comp_type_filter = lt_comp_type_filter
CHANGING cs_parent_legacy = cs_legacy ) .
ENDIF .

* finalize pattetn
cs_legacy-tb_area_rows = ls_patterns-rows .
cs_legacy-tb_area_columns = ls_patterns-columns .

* finalize the pattern in runtime form


IF is_data-properties-id EQ cs_legacy-tb_printtitles_r .
lv_printtitles_r_flag = abap_on .
ENDIF .
IF is_data-properties-id EQ cs_legacy-tb_printtitles_c .
lv_printtitles_c_flag = abap_on .
ENDIF .
r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r =
lv_printtitles_r_flag
iv_printtitles_c =
lv_printtitles_c_flag
iv_autofitmerged_r = is_data-
properties-tb_autofitmerged_r
iv_autofitmerged_c = is_data-
properties-tb_autofitmerged_c
CHANGING cv_top = cs_legacy-
tb_area_top
cv_left = cs_legacy-
tb_area_left ) .

CASE lv_tb_mergecells .
WHEN c_tb_mergecells-cols . cs_legacy-tb_area_columns = cs_legacy-
tb_area_columns + lv_tb_area_columns - 1 .
WHEN c_tb_mergecells-rows . cs_legacy-tb_area_rows = cs_legacy-
tb_area_rows + lv_tb_area_rows - 1 .
ENDCASE .

cs_parent_legacy-tb_area_prew_top = cs_legacy-tb_area_prew_top =
cs_legacy-tb_area_top .
cs_parent_legacy-tb_area_prew_rows = cs_legacy-tb_area_prew_rows =
cs_legacy-tb_area_rows .
cs_parent_legacy-tb_area_prew_left = cs_legacy-tb_area_prew_left =
cs_legacy-tb_area_left .
cs_parent_legacy-tb_area_prew_columns = cs_legacy-tb_area_prew_columns =
cs_legacy-tb_area_columns .

*================================================================================
* merge Rows/Columns in the Spanned pattern
*================================================================================
CASE lv_tb_mergecells .
WHEN c_tb_mergecells-rows .
r_excelruntime->finalize_respattern(
EXPORTING iv_rowspan = abap_on
iv_top = cs_legacy-tb_area_top
iv_left = cs_legacy-tb_area_left
iv_rows = lv_tb_area_rows
iv_columns = cs_legacy-tb_area_columns
iv_autofitmerged_r = is_data-properties-tb_autofitmerged_r
iv_autofitmerged_c = is_data-properties-
tb_autofitmerged_c ) .

WHEN c_tb_mergecells-cols .
r_excelruntime->finalize_respattern(
EXPORTING iv_colspan = abap_on
iv_top = cs_legacy-tb_area_top
iv_left = cs_legacy-tb_area_left
iv_rows = cs_legacy-tb_area_rows
iv_columns = lv_tb_area_columns
iv_autofitmerged_r = is_data-properties-tb_autofitmerged_r
iv_autofitmerged_c = is_data-properties-
tb_autofitmerged_c ) .
ENDCASE .

ENDMETHOD . "compose_process_respattern_a
METHOD compose_process_respattern_b .

* place resizable pattern BEFORE it's subarea

DATA:
ls_patterns TYPE lcl_excel=>ty_s_patterns ,
lv_printtitles_r_flag TYPE flag ,
lv_printtitles_c_flag TYPE flag ,
ls_comp_type_filter TYPE ty_s_comp_type_rng ,
lt_comp_type_filter TYPE ty_t_comp_type_rng ,
lv_tb_area_top TYPE i ,
lv_tb_area_left TYPE i ,
lv_tb_area_rows TYPE i ,
lv_tb_area_columns TYPE i ,
lv_tb_mergecells TYPE ty_char1 .
FIELD-SYMBOLS:
<context_ref> TYPE ANY .

* binding with reference of context data


IF is_data-shift_relpath IS INITIAL .
ASSIGN is_parent_context_ref TO <context_ref> .
ELSE .
ASSIGN COMPONENT is_data-shift_relpath
OF STRUCTURE is_parent_context_ref TO <context_ref> .
CHECK <context_ref> IS ASSIGNED .
ENDIF .

*================================================================================
* print a resizable (spanned) pattern
*================================================================================

* get a content of pattern area


ls_patterns =
r_exceltemplate->get_pattern( iv_sheetname = cs_parent_legacy-tb_sheetname
iv_id = is_data-properties-id ) .

* initialize a pattern in runtime form


r_excelruntime->begin_pattern( is_patterns = ls_patterns ) .

* recursive processing of child components (Fields only)


IF is_data-hierarchy-child IS NOT INITIAL .
CLEAR lt_comp_type_filter .
ls_comp_type_filter-sign = rs_c_range_sign-including .
ls_comp_type_filter-option = rs_c_range_opt-equal .
ls_comp_type_filter-low = c_comp_type-field .
COLLECT ls_comp_type_filter INTO lt_comp_type_filter .

compose_recurs( EXPORTING is_parent_data = is_data


is_parent_context_ref = <context_ref>
it_comp_type_filter = lt_comp_type_filter
CHANGING cs_parent_legacy = cs_legacy ) .
ENDIF .

* finalize pattetn
cs_legacy-tb_area_rows = ls_patterns-rows .
cs_legacy-tb_area_columns = ls_patterns-columns .

CASE is_data-properties-tb_direction .
WHEN c_tb_direction-up2down .
cs_legacy-tb_area_top = cs_parent_legacy-tb_area_prew_top +
cs_parent_legacy-tb_area_prew_rows .
cs_legacy-tb_area_left = cs_parent_legacy-tb_area_prew_left .

WHEN c_tb_direction-left2right .
cs_legacy-tb_area_left = cs_parent_legacy-tb_area_prew_left +
cs_parent_legacy-tb_area_prew_columns .
cs_legacy-tb_area_top = cs_parent_legacy-tb_area_prew_top .
ENDCASE .
lv_tb_area_top = cs_legacy-tb_area_top .
lv_tb_area_left = cs_legacy-tb_area_left .
lv_tb_area_rows = cs_legacy-tb_area_rows .
lv_tb_area_columns = cs_legacy-tb_area_columns .

* finalize the pattern in runtime form


IF is_data-properties-id EQ cs_legacy-tb_printtitles_r .
lv_printtitles_r_flag = abap_on .
ENDIF .
IF is_data-properties-id EQ cs_legacy-tb_printtitles_c .
lv_printtitles_c_flag = abap_on .
ENDIF .
r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r =
lv_printtitles_r_flag
iv_printtitles_c =
lv_printtitles_c_flag
iv_autofitmerged_r = is_data-
properties-tb_autofitmerged_r
iv_autofitmerged_c = is_data-
properties-tb_autofitmerged_c
CHANGING cv_top = cs_legacy-
tb_area_top
cv_left = cs_legacy-
tb_area_left ) .

*================================================================================
* print Sub-patterns
*================================================================================
lv_tb_mergecells = is_data-properties-tb_mergecells .

CASE is_data-properties-tb_mergecells .
WHEN c_tb_mergecells-cols .
cs_legacy-tb_area_top = cs_legacy-tb_area_top +
cs_legacy-tb_area_rows .
WHEN c_tb_mergecells-rows .
cs_legacy-tb_area_left = cs_legacy-tb_area_left +
cs_legacy-tb_area_columns .
ENDCASE .

cs_legacy-tb_area_rows = 0 .
cs_legacy-tb_area_columns = 0 .

cs_legacy-tb_area_prew_left = cs_legacy-tb_area_left .
cs_legacy-tb_area_prew_top = cs_legacy-tb_area_top .
cs_legacy-tb_area_prew_rows = cs_legacy-tb_area_rows .
cs_legacy-tb_area_prew_columns = cs_legacy-tb_area_columns .

* CASE is_data-properties-tb_mergecells .
* WHEN c_tb_mergecells-cols .
* cs_legacy-tb_area_top = cs_legacy-tb_area_top +
* cs_legacy-tb_area_rows .
* cs_legacy-tb_area_columns = 0 .
*
* WHEN c_tb_mergecells-rows .
* cs_legacy-tb_area_left = cs_legacy-tb_area_left +
* cs_legacy-tb_area_columns .
* cs_legacy-tb_area_rows = 0 .
* ENDCASE .
*
*
* cs_legacy-tb_area_prew_left = cs_legacy-tb_area_left .
* cs_legacy-tb_area_prew_top = cs_legacy-tb_area_top .
* cs_legacy-tb_area_prew_rows = cs_legacy-tb_area_rows .
* cs_legacy-tb_area_prew_columns = cs_legacy-tb_area_columns .
*
* cs_legacy-tb_area_rows = 0 .
* cs_legacy-tb_area_columns = 0 .

* recursive processing of child components (if one exists)


IF is_data-hierarchy-child IS NOT INITIAL .
CLEAR lt_comp_type_filter .
ls_comp_type_filter-sign = rs_c_range_sign-excluding .
ls_comp_type_filter-option = rs_c_range_opt-equal .
ls_comp_type_filter-low = c_comp_type-field .
COLLECT ls_comp_type_filter INTO lt_comp_type_filter .
compose_recurs( EXPORTING is_parent_data = is_data
is_parent_context_ref = <context_ref>
it_comp_type_filter = lt_comp_type_filter
CHANGING cs_parent_legacy = cs_legacy ) .
ENDIF .

cs_legacy-tb_area_top = lv_tb_area_top .
cs_legacy-tb_area_left = lv_tb_area_left .
CASE lv_tb_mergecells .
WHEN c_tb_mergecells-cols . ADD lv_tb_area_rows TO cs_legacy-tb_area_rows .
WHEN c_tb_mergecells-rows . ADD lv_tb_area_columns TO cs_legacy-
tb_area_columns .
ENDCASE .

cs_parent_legacy-tb_area_prew_top = cs_legacy-tb_area_prew_top =
cs_legacy-tb_area_top .
cs_parent_legacy-tb_area_prew_rows = cs_legacy-tb_area_prew_rows =
cs_legacy-tb_area_rows .
cs_parent_legacy-tb_area_prew_left = cs_legacy-tb_area_prew_left =
cs_legacy-tb_area_left .
cs_parent_legacy-tb_area_prew_columns = cs_legacy-tb_area_prew_columns =
cs_legacy-tb_area_columns .

*================================================================================
* merge Rows/Columns in the Spanned pattern
*================================================================================
CASE lv_tb_mergecells .
WHEN c_tb_mergecells-rows .
r_excelruntime->finalize_respattern(
EXPORTING iv_rowspan = abap_on
iv_top = lv_tb_area_top
iv_left = lv_tb_area_left
iv_rows = cs_legacy-tb_area_prew_rows
iv_columns = lv_tb_area_columns
iv_autofitmerged_r = is_data-properties-tb_autofitmerged_r
iv_autofitmerged_c = is_data-properties-
tb_autofitmerged_c ) .

WHEN c_tb_mergecells-cols .
r_excelruntime->finalize_respattern(
EXPORTING iv_colspan = abap_on
iv_top = lv_tb_area_top
iv_left = lv_tb_area_left
iv_rows = lv_tb_area_rows
iv_columns = cs_legacy-tb_area_prew_columns
iv_autofitmerged_r = is_data-properties-tb_autofitmerged_r
iv_autofitmerged_c = is_data-properties-
tb_autofitmerged_c ) .
ENDCASE .

ENDMETHOD . "compose_process_respattern_b

METHOD compose_process_folder .

DATA:
lv_nopgbrk_beg_x TYPE i ,
lv_nopgbrk_end_x TYPE i ,
lv_nopgbrk_beg_y TYPE i ,
lv_nopgbrk_end_y TYPE i ,
lv_cellrng_name TYPE string .
FIELD-SYMBOLS:
<context_ref> TYPE ANY .

* binding with reference of context data


IF is_data-shift_relpath IS INITIAL .
ASSIGN is_parent_context_ref TO <context_ref> .
ELSE .
ASSIGN COMPONENT is_data-shift_relpath
OF STRUCTURE is_parent_context_ref TO <context_ref> .
CHECK <context_ref> IS ASSIGNED .
ENDIF .

cs_legacy-tb_area_rows = 0 .
cs_legacy-tb_area_columns = 0 .

CASE is_data-properties-tb_direction .
WHEN c_tb_direction-up2down .
cs_legacy-tb_area_top = cs_parent_legacy-tb_area_prew_top +
cs_parent_legacy-tb_area_prew_rows .
cs_legacy-tb_area_left = cs_parent_legacy-tb_area_prew_left .

WHEN c_tb_direction-left2right .
cs_legacy-tb_area_left = cs_parent_legacy-tb_area_prew_left +
cs_parent_legacy-tb_area_prew_columns .
cs_legacy-tb_area_top = cs_parent_legacy-tb_area_prew_top .
ENDCASE .

cs_legacy-tb_area_prew_left = cs_legacy-tb_area_left .
cs_legacy-tb_area_prew_top = cs_legacy-tb_area_top .
cs_legacy-tb_area_prew_rows = cs_legacy-tb_area_rows .
cs_legacy-tb_area_prew_columns = cs_legacy-tb_area_columns .

IF is_data-properties-tb_rowgroup IS NOT INITIAL .


ADD 1 TO cs_legacy-tb_rowgroup_level .
ENDIF .
IF is_data-properties-tb_colgroup IS NOT INITIAL .
ADD 1 TO cs_legacy-tb_colgroup_level .
ENDIF .

* initialize a folder in runtime form


r_excelruntime->begin_folder( ) .

* recursive processing of child components (if one exists)


IF is_data-hierarchy-child IS NOT INITIAL .
compose_recurs( EXPORTING is_parent_data = is_data
is_parent_context_ref = <context_ref>
CHANGING cs_parent_legacy = cs_legacy ) .
ENDIF .

* preventing page break settings


IF is_data-properties-tb_nopgbrk_left IS INITIAL .
CLEAR: lv_nopgbrk_beg_x ,
lv_nopgbrk_end_x .
ELSE .
lv_nopgbrk_beg_x = cs_legacy-tb_area_left + 1 - is_data-properties-
tb_nopgbrk_left_shift .
lv_nopgbrk_end_x = cs_legacy-tb_area_left + cs_legacy-tb_area_columns .
ENDIF .

IF is_data-properties-tb_nopgbrk_top IS INITIAL .
CLEAR: lv_nopgbrk_beg_y ,
lv_nopgbrk_end_y .
ELSE .
lv_nopgbrk_beg_y = cs_legacy-tb_area_top + 1 - is_data-properties-
tb_nopgbrk_top_shift .
lv_nopgbrk_end_y = cs_legacy-tb_area_top + cs_legacy-tb_area_rows .
ENDIF .

* name if cell range


IF is_data-properties-cb_cellrng_relpath IS NOT INITIAL .
get_value_simple(
EXPORTING is_parent_context_ref = <context_ref>
iv_relpath = is_data-shift_cellrng_relpath
iv_offset = is_data-properties-cb_cellrng_offset
iv_match = is_data-properties-cb_cellrng_match
IMPORTING ev_value = lv_cellrng_name ) .
IF lv_cellrng_name CA ` '!@#$%^&**()[]{}<>,./\~+-=` .
MESSAGE e000(lp)
WITH v_text-t331 " text: Incorrect name of cell range
':' lv_cellrng_name
INTO v_dummy .
msg_syst_catch( ) .
CLEAR lv_cellrng_name .
ENDIF .
ENDIF .

* finalize folder
r_excelruntime->finalize_folder(
iv_left = cs_legacy-tb_area_left
iv_top = cs_legacy-tb_area_top
iv_rows = cs_legacy-tb_area_rows
iv_columns = cs_legacy-tb_area_columns
iv_rowgroup_level = cs_legacy-tb_rowgroup_level
iv_colgroup_level = cs_legacy-tb_colgroup_level
iv_rowgroup_clp = is_data-properties-tb_rowgroup_clp
iv_colgroup_clp = is_data-properties-tb_colgroup_clp
iv_nopgbrk_top = is_data-properties-tb_nopgbrk_top
iv_nopgbrk_left = is_data-properties-tb_nopgbrk_left
iv_nopgbrk_beg_x = lv_nopgbrk_beg_x
iv_nopgbrk_end_x = lv_nopgbrk_end_x
iv_nopgbrk_beg_y = lv_nopgbrk_beg_y
iv_nopgbrk_end_y = lv_nopgbrk_end_y
iv_pgbrk_top = is_data-properties-tb_pgbrk_top
iv_pgbrk_left = is_data-properties-tb_pgbrk_left
iv_cellrng_name = lv_cellrng_name ) .

cs_parent_legacy-tb_area_prew_top = cs_legacy-tb_area_prew_top =
cs_legacy-tb_area_top .
cs_parent_legacy-tb_area_prew_rows = cs_legacy-tb_area_prew_rows =
cs_legacy-tb_area_rows .
cs_parent_legacy-tb_area_prew_left = cs_legacy-tb_area_prew_left =
cs_legacy-tb_area_left .
cs_parent_legacy-tb_area_prew_columns = cs_legacy-tb_area_prew_columns =
cs_legacy-tb_area_columns .

ENDMETHOD . "compose_process_folder
METHOD compose_process_field .

DATA:
lv_value TYPE string ,
lv_val_fullpath TYPE string ,
lr_valvld_attr_table_dummy TYPE REF TO data,
lv_valvld_fullpath TYPE string ,
lv_valvld_relpath_shift TYPE string ,
lv_valvld_for1_value_x TYPE flag ,
lv_valvld_for1_value TYPE string ,
lv_valvld_for2_value_x TYPE flag ,
lv_valvld_for2_value TYPE string .
FIELD-SYMBOLS:
<valvld_attr_table> TYPE ANY TABLE .

CHECK is_data-properties-cb_val_relpath IS NOT INITIAL


OR is_data-properties-cb_valvld_attr_relpath IS NOT INITIAL
OR is_data-properties-cb_valvld_for1_dataset_id IS NOT INITIAL
OR is_data-properties-cb_valvld_for1_relpath IS NOT INITIAL
OR is_data-properties-cb_valvld_for2_relpath IS NOT INITIAL .

DO 1 TIMES .
CHECK is_data-properties-cb_val_relpath IS NOT INITIAL .
lv_val_fullpath = get_fullpath( iv_parent_fullpath = cs_legacy-cb_fullpath
iv_relpath = is_data-properties-
cb_val_relpath ) .

lv_value =
get_value( is_parent_context_ref = is_parent_context_ref
iv_shift_val_relpath = is_data-shift_val_relpath
iv_val_relpath = is_data-properties-cb_val_relpath
iv_val_sub_req = is_data-properties-cb_val_sub_req
iv_val_sub_col = is_data-properties-cb_val_sub_col
iv_val_sub_row = is_data-properties-cb_val_sub_row
iv_val_offset = is_data-properties-cb_val_offset
iv_val_match = is_data-properties-cb_val_match
iv_val_convert = is_data-properties-cb_val_convert
iv_fullpath = lv_val_fullpath ) .
ENDDO .

DO 1 TIMES .
CHECK is_data-properties-cb_valvld_attr_relpath IS NOT INITIAL .

lv_valvld_relpath_shift = is_data-properties-cb_valvld_attr_relpath .
shift_relpath( CHANGING cv_relpath = lv_valvld_relpath_shift ) .

IF lv_valvld_relpath_shift IS INITIAL .
ASSIGN is_parent_context_ref TO <valvld_attr_table> .
ELSE .
ASSIGN COMPONENT lv_valvld_relpath_shift
OF STRUCTURE is_parent_context_ref TO <valvld_attr_table> .
ENDIF .
ENDDO .
IF <valvld_attr_table> IS NOT ASSIGNED .
CREATE DATA lr_valvld_attr_table_dummy TYPE lvc_t_fcat .
ASSIGN lr_valvld_attr_table_dummy->* TO <valvld_attr_table> .
ENDIF .
DO 1 TIMES .
CHECK is_data-properties-cb_valvld_for1_relpath IS NOT INITIAL .
lv_valvld_for1_value_x = abap_on .

lv_valvld_fullpath =
get_fullpath( iv_parent_fullpath = cs_legacy-cb_fullpath
iv_relpath = is_data-properties-cb_valvld_for1_relpath ) .

lv_valvld_relpath_shift = is_data-properties-cb_valvld_for1_relpath .
shift_relpath( CHANGING cv_relpath = lv_valvld_relpath_shift ) .

lv_valvld_for1_value =
get_value( is_parent_context_ref = is_parent_context_ref
iv_shift_val_relpath = lv_valvld_relpath_shift
iv_val_relpath = is_data-properties-cb_valvld_for1_relpath
iv_val_convert = space
iv_fullpath = lv_valvld_fullpath ) .
ENDDO .

DO 1 TIMES .
CHECK is_data-properties-cb_valvld_for2_relpath IS NOT INITIAL .
lv_valvld_for2_value_x = abap_on .

lv_valvld_fullpath =
get_fullpath( iv_parent_fullpath = cs_legacy-cb_fullpath
iv_relpath = is_data-properties-cb_valvld_for2_relpath ) .

lv_valvld_relpath_shift = is_data-properties-cb_valvld_for2_relpath .
shift_relpath( CHANGING cv_relpath = lv_valvld_relpath_shift ) .

lv_valvld_for2_value =
get_value( is_parent_context_ref = is_parent_context_ref
iv_shift_val_relpath = lv_valvld_relpath_shift
iv_val_relpath = is_data-properties-cb_valvld_for2_relpath
iv_val_convert = space
iv_fullpath = lv_valvld_fullpath ) .
ENDDO .

IF is_data-properties-tb_val_matrix IS NOT INITIAL .


CHECK lv_value IS NOT INITIAL .

DATA:
lv_x TYPE i ,
lv_y TYPE i ,
lv_tb_area_top TYPE i ,
lv_tb_area_left TYPE i ,
lv_value_tmp TYPE string ,
lv_offset TYPE i ,
lv_strlen TYPE i .

lv_strlen = STRLEN( lv_value ) .

lv_y = 1 .
DO .
lv_x = 1 .
DO .
lv_tb_area_top = is_data-properties-tb_area_top + lv_y - 1 .
lv_tb_area_left = is_data-properties-tb_area_left + lv_x - 1 .

lv_value_tmp = lv_value+lv_offset(1) .

r_excelruntime->begin_field(
iv_top = lv_tb_area_top
iv_left = lv_tb_area_left
iv_value = lv_value_tmp ) .

ADD 1 TO lv_offset .
lv_x = lv_x + 1 + is_data-properties-tb_val_matr_c .

IF lv_x GT is_data-properties-tb_area_columns
OR lv_offset GE lv_strlen .
EXIT . " -->> do
ENDIF .
ENDDO .

lv_y = lv_y + 1 + is_data-properties-tb_val_matr_r .

IF lv_y GT is_data-properties-tb_area_rows
OR lv_offset GE lv_strlen .
EXIT . " -->> do
ENDIF .
ENDDO .

ELSEIF is_data-properties-tb_area_textmark IS NOT INITIAL .


r_excelruntime->begin_field_textmark(
iv_value = lv_value
iv_textmark = is_data-properties-tb_area_textmark
iv_formula = is_data-properties-tb_val_formula
iv_rt_path_1 = cs_legacy-rt_path_1 " -->> runtime path
(for dataset subordination)
it_valvld_attr_table = <valvld_attr_table>
iv_valvld_for1_dataset_id = is_data-properties-
cb_valvld_for1_dataset_id
iv_valvld_for1_dataset_fld = is_data-properties-
cb_valvld_for1_dataset_fld
iv_valvld_for1_value = lv_valvld_for1_value
iv_valvld_for1_value_x = lv_valvld_for1_value_x
iv_valvld_for2_value = lv_valvld_for2_value
iv_valvld_for2_value_x = lv_valvld_for2_value_x ) .

ELSE .
r_excelruntime->begin_field(
iv_value = lv_value
iv_top = is_data-properties-tb_area_top
iv_left = is_data-properties-tb_area_left
iv_formula = is_data-properties-tb_val_formula
iv_rt_path_1 = cs_legacy-rt_path_1 " -->> runtime path
(for dataset subordination)
it_valvld_attr_table = <valvld_attr_table>
iv_valvld_for1_dataset_id = is_data-properties-
cb_valvld_for1_dataset_id
iv_valvld_for1_dataset_fld = is_data-properties-
cb_valvld_for1_dataset_fld
iv_valvld_for1_value = lv_valvld_for1_value
iv_valvld_for1_value_x = lv_valvld_for1_value_x
iv_valvld_for2_value = lv_valvld_for2_value
iv_valvld_for2_value_x = lv_valvld_for2_value_x ) .
ENDIF .
ENDMETHOD . "compose_process_field
METHOD compose_process_drawing .

DATA:
ls_drawings_tmp TYPE lcl_excel=>ty_s_drawings_tmp ,
lv_shift_relpath TYPE string ,
lv_fullpath TYPE string .

IF is_data-properties-tb_drwstat_flag IS INITIAL .
* dynamic Drawing (Rawdata from context's field)
CHECK is_data-properties-cb_val_relpath IS NOT INITIAL .

lv_fullpath = get_fullpath( iv_parent_fullpath = cs_legacy-cb_fullpath


iv_relpath = is_data-properties-
cb_val_relpath ) .

ls_drawings_tmp-media_rawdata = get_value(
is_parent_context_ref = is_parent_context_ref
iv_shift_val_relpath = is_data-shift_val_relpath
iv_val_relpath = is_data-properties-cb_val_relpath
iv_val_sub_req = is_data-properties-cb_val_sub_req
iv_val_sub_col = is_data-properties-cb_val_sub_col
iv_val_sub_row = is_data-properties-cb_val_sub_row
iv_val_offset = is_data-properties-cb_val_offset
iv_val_match = is_data-properties-cb_val_match
iv_val_convert = is_data-properties-cb_val_convert
iv_fullpath = lv_fullpath ) .
CHECK ls_drawings_tmp-media_rawdata IS NOT INITIAL .
ls_drawings_tmp-drawing_type = lcl_excel=>c_drawing_type-bitmap .

ELSE .
* static Drawing (Presence in the template)
CHECK is_data-properties-tb_drwstat_name IS NOT INITIAL .

ls_drawings_tmp =
r_exceltemplate->get_drawing_static(
iv_sheetname = cs_parent_legacy-tb_sheetname
iv_drwstat_name = is_data-properties-tb_drwstat_name ) .
CHECK ls_drawings_tmp IS NOT INITIAL .

ENDIF .

ls_drawings_tmp-top = is_data-properties-tb_area_top .
ls_drawings_tmp-left = is_data-properties-tb_area_left .
ls_drawings_tmp-rows = is_data-properties-tb_area_rows .
ls_drawings_tmp-columns = is_data-properties-tb_area_columns .

IF is_data-properties-drawing_size EQ c_drawing_size-from_context .
lv_fullpath = get_fullpath( iv_parent_fullpath = cs_legacy-cb_fullpath
iv_relpath = is_data-properties-
drawing_size_h_relpath ) .

lv_shift_relpath = is_data-properties-drawing_size_h_relpath .
shift_relpath( CHANGING cv_relpath = lv_shift_relpath ) .

ls_drawings_tmp-drawing_size_h = get_value(
is_parent_context_ref = is_parent_context_ref
iv_shift_val_relpath = lv_shift_relpath
iv_val_relpath = is_data-properties-drawing_size_h_relpath
iv_val_convert = space
iv_fullpath = lv_fullpath ) .

lv_fullpath = get_fullpath( iv_parent_fullpath = cs_legacy-cb_fullpath


iv_relpath = is_data-properties-
drawing_size_w_relpath ) .

lv_shift_relpath = is_data-properties-drawing_size_w_relpath .
shift_relpath( CHANGING cv_relpath = lv_shift_relpath ) .

ls_drawings_tmp-drawing_size_w = get_value(
is_parent_context_ref = is_parent_context_ref
iv_shift_val_relpath = lv_shift_relpath
iv_val_relpath = is_data-properties-drawing_size_w_relpath
iv_val_convert = space
iv_fullpath = lv_fullpath ) .

IF ls_drawings_tmp-drawing_size_h GT 0
AND ls_drawings_tmp-drawing_size_w GT 0 .
CLEAR ls_drawings_tmp-rows .
CLEAR ls_drawings_tmp-columns .
ELSE .
CLEAR ls_drawings_tmp-drawing_size_h .
CLEAR ls_drawings_tmp-drawing_size_w .
ENDIF .
ENDIF .

r_excelruntime->begin_drawing( is_drawings_tmp = ls_drawings_tmp ) .

ENDMETHOD . "compose_process_drawing
METHOD compose_process_chart .

DATA:
ls_drawings_tmp TYPE lcl_excel=>ty_s_drawings_tmp ,
lv_chart_title_fullpath TYPE string ,
lv_chart_title_relpath_shift TYPE string ,
lv_shift_relpath TYPE string ,
lv_fullpath TYPE string .
FIELD-SYMBOLS:
<context_ref> TYPE ANY .

ls_drawings_tmp =
r_exceltemplate->get_drawing_static(
iv_sheetname = cs_parent_legacy-tb_sheetname
iv_drwstat_name = is_data-properties-tb_drwstat_name ) .
CHECK ls_drawings_tmp IS NOT INITIAL .

* dataset
ls_drawings_tmp-chart_id = is_data-properties-id .
ls_drawings_tmp-dataset_id = is_data-properties-dataset_id .
ls_drawings_tmp-dataset_rt_path_1 = cs_legacy-rt_path_1 . " -->> runtime path
(for dataset subordination)
ls_drawings_tmp-dataset_series_tab[] = conv_dataset_series_st( is_data-
properties-dataset_series ) .

* title: chart
IF is_data-properties-chart_title IS NOT INITIAL .
ls_drawings_tmp-chart_title = is_data-properties-chart_title .

lv_chart_title_fullpath =
get_fullpath( iv_parent_fullpath = cs_legacy-cb_fullpath
iv_relpath = is_data-properties-chart_title_relpath ) .

lv_chart_title_relpath_shift = is_data-properties-chart_title_relpath .
shift_relpath( CHANGING cv_relpath = lv_chart_title_relpath_shift ) .

ls_drawings_tmp-chart_title_tx =
get_value( is_parent_context_ref = is_parent_context_ref
iv_shift_val_relpath = lv_chart_title_relpath_shift
iv_val_relpath = is_data-properties-chart_title_relpath
iv_val_convert = space
iv_fullpath = lv_chart_title_fullpath ) .
ENDIF .

* title: category axis


IF is_data-properties-chart_catax_title IS NOT INITIAL .
ls_drawings_tmp-chart_catax_title = is_data-properties-chart_catax_title .

lv_chart_title_fullpath =
get_fullpath( iv_parent_fullpath = cs_legacy-cb_fullpath
iv_relpath = is_data-properties-chart_catax_title_relpath ) .

lv_chart_title_relpath_shift = is_data-properties-chart_catax_title_relpath .
shift_relpath( CHANGING cv_relpath = lv_chart_title_relpath_shift ) .

ls_drawings_tmp-chart_catax_title_tx =
get_value( is_parent_context_ref = is_parent_context_ref
iv_shift_val_relpath = lv_chart_title_relpath_shift
iv_val_relpath = is_data-properties-
chart_catax_title_relpath
iv_val_convert = space
iv_fullpath = lv_chart_title_fullpath ) .
ENDIF .

* title: value axis


IF is_data-properties-chart_valax_title IS NOT INITIAL .
ls_drawings_tmp-chart_valax_title = is_data-properties-chart_valax_title .

lv_chart_title_fullpath =
get_fullpath( iv_parent_fullpath = cs_legacy-cb_fullpath
iv_relpath = is_data-properties-chart_valax_title_relpath ) .

lv_chart_title_relpath_shift = is_data-properties-chart_valax_title_relpath .
shift_relpath( CHANGING cv_relpath = lv_chart_title_relpath_shift ) .

ls_drawings_tmp-chart_valax_title_tx =
get_value( is_parent_context_ref = is_parent_context_ref
iv_shift_val_relpath = lv_chart_title_relpath_shift
iv_val_relpath = is_data-properties-
chart_valax_title_relpath
iv_val_convert = space
iv_fullpath = lv_chart_title_fullpath ) .
ENDIF .

* title: series
ls_drawings_tmp-chart_series_title = is_data-properties-chart_series_title .

* layout
ls_drawings_tmp-top = is_data-properties-tb_area_top .
ls_drawings_tmp-left = is_data-properties-tb_area_left .
ls_drawings_tmp-rows = is_data-properties-tb_area_rows .
ls_drawings_tmp-columns = is_data-properties-tb_area_columns .

IF is_data-properties-drawing_size EQ c_drawing_size-from_context .
lv_fullpath = get_fullpath( iv_parent_fullpath = cs_legacy-cb_fullpath
iv_relpath = is_data-properties-
drawing_size_h_relpath ) .

lv_shift_relpath = is_data-properties-drawing_size_h_relpath .
shift_relpath( CHANGING cv_relpath = lv_shift_relpath ) .

ls_drawings_tmp-drawing_size_h = get_value(
is_parent_context_ref = is_parent_context_ref
iv_shift_val_relpath = lv_shift_relpath
iv_val_relpath = is_data-properties-drawing_size_h_relpath
iv_val_convert = space
iv_fullpath = lv_fullpath ) .

lv_fullpath = get_fullpath( iv_parent_fullpath = cs_legacy-cb_fullpath


iv_relpath = is_data-properties-
drawing_size_w_relpath ) .

lv_shift_relpath = is_data-properties-drawing_size_w_relpath .
shift_relpath( CHANGING cv_relpath = lv_shift_relpath ) .

ls_drawings_tmp-drawing_size_w = get_value(
is_parent_context_ref = is_parent_context_ref
iv_shift_val_relpath = lv_shift_relpath
iv_val_relpath = is_data-properties-drawing_size_w_relpath
iv_val_convert = space
iv_fullpath = lv_fullpath ) .

IF ls_drawings_tmp-drawing_size_h GT 0
AND ls_drawings_tmp-drawing_size_w GT 0 .
CLEAR ls_drawings_tmp-rows .
CLEAR ls_drawings_tmp-columns .
ELSE .
CLEAR ls_drawings_tmp-drawing_size_h .
CLEAR ls_drawings_tmp-drawing_size_w .
ENDIF .
ENDIF .

* pass to excel
r_excelruntime->begin_chart( is_drawings_tmp = ls_drawings_tmp ) .

ENDMETHOD . "compose_process_chart
METHOD compose_process_tree .
DATA:
ls_patterns TYPE lcl_excel=>ty_s_patterns ,
ls_patterns_a TYPE lcl_excel=>ty_s_patterns ,
lt_patterns_a TYPE lcl_excel=>ty_t_patterns ,
ls_patterns_b TYPE lcl_excel=>ty_s_patterns ,
lt_patterns_b TYPE lcl_excel=>ty_t_patterns ,
ls_cells TYPE lcl_excel=>ty_s_cells ,
ls_colprop TYPE lcl_excel=>ty_s_colprop ,
ls_rowprop TYPE lcl_excel=>ty_s_rowprop ,
ls_mergecells TYPE ty_s_mergecells_rel ,
lv_x TYPE i ,
lv_y TYPE i ,
lv_i TYPE i ,
lv_times_row TYPE i ,
lv_index_row TYPE i ,
lv_times_col TYPE i ,
lv_index_col TYPE i ,
lv_index_rel TYPE i ,
lv_index_rel2 TYPE i ,
lv_index TYPE i ,
ls_tree_layout TYPE ty_s_tree_layout ,
lv_value(30000) TYPE c ,
lv_subrc TYPE sysubrc .
DATA:
lr_alvtree TYPE ty_r_tree ,
lt_fcat_lvc TYPE lvc_t_fcat ,
lr_outtab_table TYPE REF TO data ,
lr_outtab_line TYPE REF TO data ,
lt_subtotals TYPE ty_t_tree_subtotals ,
lv_top TYPE i ,
lv_left TYPE i ,
lv_value_top TYPE i ,
lv_value_left TYPE i ,
lt_expanded_nodes TYPE lvc_t_nkey ,
lv_hierarchy_column_width TYPE i ,
lv_firstrow TYPE flag VALUE abap_on .
DATA:
lv_fullpath TYPE string ,
ls_ctxt_prop TYPE lcl_context=>ty_s_properties .
FIELD-SYMBOLS:
<context_ref> TYPE ANY ,
<outtab_table> TYPE STANDARD TABLE ,
<outtab_line> TYPE ANY ,
<fcat_lvc> TYPE lvc_s_fcat .

*======================================================================
* redirect to CL_SALV_TREE processing (if required)
*======================================================================
lv_fullpath = get_fullpath( iv_parent_fullpath = cs_legacy-cb_fullpath
iv_relpath = is_data-properties-
cb_val_relpath ) .

ls_ctxt_prop = r_context->node_get_by_path( iv_comp_fullpath = lv_fullpath ) .

IF ls_ctxt_prop-comp_type EQ lcl_context=>c_comp_type-tree_s .
compose_process_tree_s(
EXPORTING
is_parent_data = is_parent_data
is_parent_context_ref = is_parent_context_ref
is_data = is_data
CHANGING
cs_legacy = cs_legacy
cs_parent_legacy = cs_parent_legacy ).

RETURN .
ENDIF .
*======================================================================
* binding with reference of context data
*======================================================================
IF is_data-shift_val_relpath IS INITIAL .
ASSIGN is_parent_context_ref TO <context_ref> .
ELSE .
ASSIGN COMPONENT is_data-shift_val_relpath
OF STRUCTURE is_parent_context_ref TO <context_ref> .
CHECK <context_ref> IS ASSIGNED .
ENDIF .

CHECK <context_ref> IS BOUND .

TRY .
lr_alvtree ?= <context_ref> .

CATCH cx_sy_move_cast_error
cx_sy_dyn_call_illegal_method .
EXIT .
ENDTRY .

conv_container_fs(
EXPORTING iv_field = is_data-properties-tree_layout
IMPORTING es_structure = ls_tree_layout ) .

*======================================================================
* prepare expanded nodes, fieldcatalog, subtotals and coordinates
*======================================================================
lr_outtab_table = lr_alvtree->get_outtab( ) .
lr_alvtree->get_expanded_nodes( CHANGING ct_expanded_nodes = lt_expanded_nodes
EXCEPTIONS OTHERS = 0 ) .
SORT lt_expanded_nodes .

lr_alvtree->get_frontend_fieldcatalog( IMPORTING et_fieldcatalog =


lt_fcat_lvc ) .
DELETE lt_fcat_lvc WHERE tech IS NOT INITIAL .
DELETE lt_fcat_lvc WHERE no_out IS NOT INITIAL .
SORT lt_fcat_lvc BY col_pos ASCENDING .

ASSIGN lr_outtab_table->* TO <outtab_table> .


CREATE DATA lr_outtab_line LIKE LINE OF <outtab_table> .
ASSIGN lr_outtab_line->* TO <outtab_line> .

compose_process_tree_recsub(
EXPORTING iv_parent_node_key = lr_alvtree->c_virtual_root_node
it_fcat_lvc = lt_fcat_lvc
CHANGING cr_alvtree = lr_alvtree
cs_outtab_line = <outtab_line>
ct_subtotals = lt_subtotals ) .

CASE is_data-properties-tb_direction .
WHEN c_tb_direction-up2down .
cs_legacy-tb_area_top = cs_parent_legacy-tb_area_prew_top +
cs_parent_legacy-tb_area_prew_rows .
cs_legacy-tb_area_left = cs_parent_legacy-tb_area_prew_left .
WHEN c_tb_direction-left2right .
cs_legacy-tb_area_left = cs_parent_legacy-tb_area_prew_left +
cs_parent_legacy-tb_area_prew_columns .
cs_legacy-tb_area_top = cs_parent_legacy-tb_area_prew_top .
ENDCASE .

cs_legacy-tb_area_rows = 0 .
cs_legacy-tb_area_columns = 0 .

*======================================================================
* prepare patterns (get a content of pattern area)
*======================================================================
ls_patterns =
r_exceltemplate->get_pattern( iv_sheetname = cs_parent_legacy-tb_sheetname
iv_id = is_data-properties-id ) .
* lr_alvtree->get_hierarchy_header_width( IMPORTING e_width =
lv_hierarchy_column_width ) .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .

CASE ls_tree_layout-rotate .
WHEN space .
* A-PATTERNS
lv_times_row = ls_patterns-rows .

DO lv_times_row TIMES . " -->> loop at ROWS


lv_index_row = sy-index .

CLEAR ls_patterns_a .
ls_patterns_a-id = lv_index_row - 1 .
ls_patterns_a-left = ls_patterns-left .
ls_patterns_a-top = ls_patterns-top + lv_index_row - 1 .
ls_patterns_a-rows = 1 .

lv_x = ls_patterns-left .
lv_y = ls_patterns-top + lv_index_row - 1 .

CLEAR ls_cells .
CLEAR ls_colprop .
CLEAR ls_rowprop .

READ TABLE ls_patterns-t_rowprop INTO ls_rowprop WITH TABLE KEY y =


lv_y .
IF sy-subrc EQ 0 .
INSERT ls_rowprop INTO TABLE ls_patterns_a-t_rowprop .
ENDIF .

CLEAR ls_mergecells .
READ TABLE ls_patterns-t_mergecells INTO ls_mergecells
WITH KEY top = lv_y left = lv_x .
IF sy-subrc EQ 0 .
INSERT ls_mergecells INTO TABLE ls_patterns_a-t_mergecells .
ELSE .
ls_mergecells-columns = 1 .
ENDIF .

DO ls_mergecells-columns TIMES .
IF sy-index GT 1 .
ADD 1 TO lv_x .
ENDIF .
READ TABLE ls_patterns-t_cells INTO ls_cells WITH KEY y = lv_y x =
lv_x BINARY SEARCH .
IF sy-subrc NE 0 .
ls_cells-y = lv_y .
ls_cells-x = lv_x .
ENDIF .
INSERT ls_cells INTO TABLE ls_patterns_a-t_cells .

CLEAR ls_colprop .
READ TABLE ls_patterns-t_colprop INTO ls_colprop WITH KEY x = lv_x
BINARY SEARCH .
ls_colprop-x = lv_x .

IF ls_tree_layout-col_othr_width EQ 0
OR lv_hierarchy_column_width EQ 0 .
IF sy-subrc EQ 0 .
INSERT ls_colprop INTO TABLE ls_patterns_a-t_colprop .
ENDIF .
ELSE .
ls_colprop-customwidth = '1' .
ls_colprop-width = lv_i = ls_tree_layout-col_othr_width *
lv_hierarchy_column_width .
CONDENSE ls_colprop-width NO-GAPS .
INSERT ls_colprop INTO TABLE ls_patterns_a-t_colprop .
ENDIF .
ENDDO .

ls_patterns_a-columns = ls_mergecells-columns .
APPEND ls_patterns_a TO lt_patterns_a .
ENDDO .

* B-PATTERNS
lv_times_row = ls_patterns-rows .
lv_times_col = LINES( lt_fcat_lvc ) .

DO lv_times_row TIMES . " -->> loop at ROWS


lv_index_row = sy-index .
lv_y = ls_patterns-top + lv_index_row - 1 .

CLEAR ls_patterns_b .
ls_patterns_b-id = lv_index_row - 1 .
ls_patterns_b-left = ls_patterns-left + ls_patterns_a-columns .
ls_patterns_b-top = ls_patterns-top + lv_index_row - 1 .
ls_patterns_b-rows = 1 .

CLEAR ls_cells .
CLEAR ls_colprop .
CLEAR ls_rowprop .

READ TABLE ls_patterns-t_rowprop INTO ls_rowprop WITH TABLE KEY y =


lv_y .
IF sy-subrc EQ 0 .
INSERT ls_rowprop INTO TABLE ls_patterns_b-t_rowprop .
ENDIF .

lv_index_col = 0 .
lv_index_rel = 0 .
lv_index_rel2 = ls_patterns_a-columns - 1 .
lv_x = ls_patterns-left + lv_index_rel2 .

DO lv_times_col TIMES . " -->> loop at COLUMNS


ADD 1 TO lv_index_col .
ADD 1 TO lv_index_rel .
ADD 1 TO lv_index_rel2 .
ADD 1 TO lv_x .

READ TABLE lt_fcat_lvc ASSIGNING <fcat_lvc> INDEX lv_index_col .


CHECK sy-subrc EQ 0 .
<fcat_lvc>-indx_field = lv_index_rel .

CLEAR ls_mergecells .
READ TABLE ls_patterns-t_mergecells INTO ls_mergecells
WITH KEY top = lv_y left = lv_x .
IF sy-subrc EQ 0 .
INSERT ls_mergecells INTO TABLE ls_patterns_b-t_mergecells .
ELSE .
ls_mergecells-columns = 1 .
ENDIF .

DO ls_mergecells-columns TIMES .
lv_index = sy-index .
IF lv_index GT 1 .
ADD 1 TO lv_index_rel .
ADD 1 TO lv_index_rel2 .
ADD 1 TO lv_x .
ENDIF .

IF lv_index_rel2 LT ls_patterns-columns .
CLEAR ls_cells .
READ TABLE ls_patterns-t_cells INTO ls_cells WITH KEY y = lv_y x =
lv_x BINARY SEARCH .
ENDIF .
ls_cells-y = lv_y .
ls_cells-x = lv_x .
INSERT ls_cells INTO TABLE ls_patterns_b-t_cells .

IF lv_index_rel2 LT ls_patterns-columns .
CLEAR ls_colprop .
READ TABLE ls_patterns-t_colprop INTO ls_colprop WITH KEY x = lv_x
BINARY SEARCH .
lv_subrc = sy-subrc .
ENDIF .
IF lv_index GT 1
OR ls_tree_layout-col_othr_width EQ 0
OR <fcat_lvc>-outputlen EQ 0 .
IF lv_subrc EQ 0 .
ls_colprop-x = lv_x .
INSERT ls_colprop INTO TABLE ls_patterns_b-t_colprop .
ENDIF .
ELSE .
ls_colprop-x = lv_x .
ls_colprop-customwidth = '1' .
ls_colprop-width = lv_i = ls_tree_layout-col_othr_width *
<fcat_lvc>-outputlen .
CONDENSE ls_colprop-width NO-GAPS .
INSERT ls_colprop INTO TABLE ls_patterns_b-t_colprop .
ENDIF .
ENDDO .

ADD ls_mergecells-columns TO ls_patterns_b-columns .


ENDDO .

APPEND ls_patterns_b TO lt_patterns_b .


ENDDO .

WHEN OTHERS . " == R O T A T E = T R E E


=====================================

* A-PATTERNS
lv_times_row = ls_patterns-columns .

DO lv_times_row TIMES . " -->> loop at ROWS


lv_index_row = sy-index .

CLEAR ls_patterns_a .
ls_patterns_a-id = lv_index_row - 1 .
ls_patterns_a-left = ls_patterns-left + lv_index_row - 1 .
ls_patterns_a-top = ls_patterns-top .
ls_patterns_a-columns = 1 .

lv_x = ls_patterns-left + lv_index_row - 1 .


lv_y = ls_patterns-top .

CLEAR ls_cells .
CLEAR ls_colprop .
CLEAR ls_rowprop .

READ TABLE ls_patterns-t_colprop INTO ls_colprop WITH KEY x = lv_x BINARY


SEARCH .
IF sy-subrc EQ 0 .
INSERT ls_colprop INTO TABLE ls_patterns_a-t_colprop .
ENDIF .

CLEAR ls_mergecells .
READ TABLE ls_patterns-t_mergecells INTO ls_mergecells
WITH KEY top = lv_y left = lv_x .
IF sy-subrc EQ 0 .
INSERT ls_mergecells INTO TABLE ls_patterns_a-t_mergecells .
ELSE .
ls_mergecells-rows = 1 .
ENDIF .

DO ls_mergecells-rows TIMES .
IF sy-index GT 1 .
ADD 1 TO lv_y .
ENDIF .

READ TABLE ls_patterns-t_cells INTO ls_cells WITH KEY y = lv_y x =


lv_x BINARY SEARCH .
IF sy-subrc NE 0 .
ls_cells-y = lv_y .
ls_cells-x = lv_x .
ENDIF .
INSERT ls_cells INTO TABLE ls_patterns_a-t_cells .

CLEAR ls_rowprop .
READ TABLE ls_patterns-t_rowprop INTO ls_rowprop WITH TABLE KEY y =
lv_y .
ls_rowprop-y = lv_y .

IF ls_tree_layout-col_othr_width EQ 0
OR lv_hierarchy_column_width EQ 0 .
IF sy-subrc EQ 0 .
INSERT ls_rowprop INTO TABLE ls_patterns_a-t_rowprop .
ENDIF .
ELSE .
ls_rowprop-customheight = '1' .
ls_rowprop-ht = lv_i = ls_tree_layout-col_othr_width *
lv_hierarchy_column_width .
CONDENSE ls_rowprop-ht NO-GAPS .
INSERT ls_rowprop INTO TABLE ls_patterns_a-t_rowprop .
ENDIF .
ENDDO .

ls_patterns_a-rows = ls_mergecells-rows .
APPEND ls_patterns_a TO lt_patterns_a .
ENDDO .

* B-PATTERNS
lv_times_row = ls_patterns-columns .
lv_times_col = LINES( lt_fcat_lvc ) .

DO lv_times_row TIMES . " -->> loop at ROWS


lv_index_row = sy-index .
lv_x = ls_patterns-left + lv_index_row - 1 .

CLEAR ls_patterns_b .
ls_patterns_b-id = lv_index_row - 1 .
ls_patterns_b-left = ls_patterns-left + lv_index_row - 1 .
ls_patterns_b-top = ls_patterns-top + ls_patterns_a-rows .
ls_patterns_b-columns = 1 .

CLEAR ls_cells .
CLEAR ls_colprop .
CLEAR ls_rowprop .

READ TABLE ls_patterns-t_colprop INTO ls_colprop WITH KEY x = lv_x BINARY


SEARCH .
IF sy-subrc EQ 0 .
INSERT ls_colprop INTO TABLE ls_patterns_b-t_colprop .
ENDIF .

lv_index_col = 0 .
lv_index_rel = 0 .
lv_index_rel2 = ls_patterns_a-rows - 1 .
lv_y = ls_patterns-top + lv_index_rel2 .

DO lv_times_col TIMES . " -->> loop at COLUMNS


ADD 1 TO lv_index_col .
ADD 1 TO lv_index_rel .
ADD 1 TO lv_index_rel2 .
ADD 1 TO lv_y .

READ TABLE lt_fcat_lvc ASSIGNING <fcat_lvc> INDEX lv_index_col .


CHECK sy-subrc EQ 0 .
<fcat_lvc>-indx_field = lv_index_rel .

CLEAR ls_mergecells .
READ TABLE ls_patterns-t_mergecells INTO ls_mergecells
WITH KEY top = lv_y left = lv_x .
IF sy-subrc EQ 0 .
INSERT ls_mergecells INTO TABLE ls_patterns_b-t_mergecells .
ELSE .
ls_mergecells-rows = 1 .
ENDIF .

DO ls_mergecells-rows TIMES .
lv_index = sy-index .
IF lv_index GT 1 .
ADD 1 TO lv_index_rel .
ADD 1 TO lv_index_rel2 .
ADD 1 TO lv_y .
ENDIF .

IF lv_index_rel2 LT ls_patterns-rows .
CLEAR ls_cells .
READ TABLE ls_patterns-t_cells INTO ls_cells WITH KEY y = lv_y x =
lv_x BINARY SEARCH .
ENDIF .
ls_cells-y = lv_y .
ls_cells-x = lv_x .
INSERT ls_cells INTO TABLE ls_patterns_b-t_cells .

IF lv_index_rel2 LT ls_patterns-rows .
CLEAR ls_rowprop .
READ TABLE ls_patterns-t_rowprop INTO ls_rowprop WITH TABLE KEY y =
lv_y .
lv_subrc = sy-subrc .
ENDIF .

IF lv_index GT 1
OR ls_tree_layout-col_othr_width EQ 0
OR <fcat_lvc>-outputlen EQ 0 .
IF lv_subrc EQ 0 .
ls_rowprop-y = lv_y .
INSERT ls_rowprop INTO TABLE ls_patterns_b-t_rowprop .
ENDIF .
ELSE .
ls_rowprop-y = lv_y .
ls_rowprop-customheight = '1' .
ls_rowprop-ht = lv_i = ls_tree_layout-col_othr_width * <fcat_lvc>-
outputlen .
CONDENSE ls_rowprop-ht NO-GAPS .
INSERT ls_rowprop INTO TABLE ls_patterns_b-t_rowprop .
ENDIF .
ENDDO .

ADD ls_mergecells-rows TO ls_patterns_b-rows .


ENDDO .

APPEND ls_patterns_b TO lt_patterns_b .


ENDDO .
ENDCASE .
*======================================================================
* header
*======================================================================
lv_top = cs_legacy-tb_area_top - 1 .
lv_left = cs_legacy-tb_area_left - 1 .

IF ls_tree_layout-head IS NOT INITIAL .


READ TABLE lt_patterns_a INTO ls_patterns_a WITH KEY id = 0 .
READ TABLE lt_patterns_b INTO ls_patterns_b WITH KEY id = 0 .

CASE ls_tree_layout-rotate .
WHEN space . ADD 1 TO lv_top .
WHEN OTHERS . ADD 1 TO lv_left .
ENDCASE .

* hierarchy column (BEFORE others)


IF ls_tree_layout-col_hier IS NOT INITIAL
AND ls_tree_layout-col_hier_after IS INITIAL .
r_excelruntime->begin_pattern( is_patterns = ls_patterns_a ) .

CASE ls_tree_layout-rotate .
WHEN space . ADD 1 TO lv_left .
WHEN OTHERS . ADD 1 TO lv_top .
ENDCASE .

* lv_value_top = ls_patterns_a-top .
* lv_value_left = ls_patterns_a-left .
*
* r_excelruntime->begin_field(
* EXPORTING iv_top = lv_value_top
* iv_left = lv_value_left
* iv_value = lv_value ) .

r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r = space


iv_printtitles_c = space
CHANGING cv_top = lv_top
cv_left = lv_left ) .
CASE ls_tree_layout-rotate .
WHEN space . lv_left = lv_left + ls_patterns_a-columns - 1 .
WHEN OTHERS . lv_top = lv_top + ls_patterns_a-rows - 1 .
ENDCASE .
ENDIF .

* other columns
IF ls_tree_layout-col_othr IS NOT INITIAL
AND lt_fcat_lvc[] IS NOT INITIAL .
r_excelruntime->begin_pattern( is_patterns = ls_patterns_b ) .

LOOP AT lt_fcat_lvc ASSIGNING <fcat_lvc> .


CASE ls_tree_layout-rotate .
WHEN space .
lv_value_top = ls_patterns_b-top .
lv_value_left = ls_patterns_b-left + <fcat_lvc>-indx_field - 1 .
WHEN OTHERS .
lv_value_left = ls_patterns_b-left .
lv_value_top = ls_patterns_b-top + <fcat_lvc>-indx_field - 1 .
ENDCASE .
IF <fcat_lvc>-scrtext_l IS NOT INITIAL .
lv_value = <fcat_lvc>-scrtext_l .
ELSEIF <fcat_lvc>-scrtext_m IS NOT INITIAL .
lv_value = <fcat_lvc>-scrtext_m .
ELSEIF <fcat_lvc>-scrtext_s IS NOT INITIAL .
lv_value = <fcat_lvc>-scrtext_s .
ELSEIF <fcat_lvc>-coltext IS NOT INITIAL .
lv_value = <fcat_lvc>-coltext .
ELSEIF <fcat_lvc>-seltext IS NOT INITIAL .
lv_value = <fcat_lvc>-seltext .
ELSE .
lv_value = <fcat_lvc>-fieldname .
ENDIF .
r_excelruntime->begin_field( EXPORTING iv_top = lv_value_top
iv_left = lv_value_left
iv_value = lv_value ) .
ENDLOOP .

CASE ls_tree_layout-rotate .
WHEN space . ADD 1 TO lv_left .
WHEN OTHERS . ADD 1 TO lv_top .
ENDCASE .
r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r = space
iv_printtitles_c = space
CHANGING cv_top = lv_top
cv_left = lv_left ) .
CASE ls_tree_layout-rotate .
WHEN space . lv_left = lv_left + ls_patterns_b-columns - 1 .
WHEN OTHERS . lv_top = lv_top + ls_patterns_b-rows - 1 .
ENDCASE .
ENDIF .

* hierarchy column (AFTER others)


IF ls_tree_layout-col_hier IS NOT INITIAL
AND ls_tree_layout-col_hier_after IS NOT INITIAL .
r_excelruntime->begin_pattern( is_patterns = ls_patterns_a ) .

CASE ls_tree_layout-rotate .
WHEN space . ADD 1 TO lv_left .
WHEN OTHERS . ADD 1 TO lv_top .
ENDCASE .
r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r = space
iv_printtitles_c = space
CHANGING cv_top = lv_top
cv_left = lv_left ) .
CASE ls_tree_layout-rotate .
WHEN space . lv_left = lv_left + ls_patterns_a-columns - 1 .
WHEN OTHERS . lv_top = lv_top + ls_patterns_a-rows - 1 .
ENDCASE .
ENDIF .
ENDIF .

*======================================================================
* positions
*======================================================================
compose_process_tree_recurs(
EXPORTING iv_parent_node_key = lr_alvtree->c_virtual_root_node
iv_parent_level = 0
is_parent_patterns_a = ls_patterns_a
is_parent_patterns_b = ls_patterns_b
it_patterns_a = lt_patterns_a
it_patterns_b = lt_patterns_b
it_fcat_lvc = lt_fcat_lvc
is_tree_layout = ls_tree_layout
it_expanded_nodes = lt_expanded_nodes
it_subtotals = lt_subtotals
CHANGING cr_alvtree = lr_alvtree
cs_outtab_line = <outtab_line>
cs_legacy = cs_legacy
cv_top = lv_top
cv_left = lv_left
cv_firstrow = lv_firstrow ) .

cs_legacy-tb_area_rows = lv_top - cs_legacy-tb_area_top + 1 .


cs_legacy-tb_area_columns = lv_left - cs_legacy-tb_area_left + 1 .

IF cs_legacy-tb_area_rows LT 0 .
cs_legacy-tb_area_rows = 0 .
ENDIF .
IF cs_legacy-tb_area_columns LT 0 .
cs_legacy-tb_area_columns = 0 .
ENDIF .

cs_parent_legacy-tb_area_prew_top = cs_legacy-tb_area_prew_top =
cs_legacy-tb_area_top .
cs_parent_legacy-tb_area_prew_rows = cs_legacy-tb_area_prew_rows =
cs_legacy-tb_area_rows .
cs_parent_legacy-tb_area_prew_left = cs_legacy-tb_area_prew_left =
cs_legacy-tb_area_left .
cs_parent_legacy-tb_area_prew_columns = cs_legacy-tb_area_prew_columns =
cs_legacy-tb_area_columns . .

ENDMETHOD . "compose_process_tree
METHOD compose_process_tree_recurs .

DATA:
lt_nodes TYPE lvc_t_nkey ,
lv_node_key TYPE lvc_nkey ,
lv_node_text TYPE lvc_value ,
ls_node_layout TYPE lvc_s_layn ,
lv_level TYPE i ,
lv_rows TYPE i ,
lv_columns TYPE i ,
lv_begin_top TYPE i ,
lv_begin_left TYPE i ,
lv_pattern_top TYPE i ,
lv_pattern_left TYPE i ,
lv_value_top TYPE i ,
lv_value_left TYPE i ,
lv_offset TYPE i ,
ls_patterns_a TYPE lcl_excel=>ty_s_patterns ,
ls_patterns_b TYPE lcl_excel=>ty_s_patterns ,
lv_rowgroup_level TYPE i ,
lv_colgroup_level TYPE i ,
lv_collapsed TYPE flag ,
lv_value(30000) TYPE c ,
lv_formula TYPE flag ,
ls_fcat_lvc TYPE lvc_s_fcat ,
lr_tdescr TYPE REF TO cl_abap_typedescr ,
ls_subtotals TYPE ty_s_tree_subtotals ,
ls_drawings TYPE lcl_excel=>ty_s_drawings_tmp .
FIELD-SYMBOLS:
<value> TYPE ANY .

lv_level = iv_parent_level + 1 .

* prepare patterns
READ TABLE it_patterns_a INTO ls_patterns_a WITH KEY id = lv_level .
IF sy-subrc NE 0 .
ls_patterns_a = is_parent_patterns_a .
ENDIF .
READ TABLE it_patterns_b INTO ls_patterns_b WITH KEY id = lv_level .
IF sy-subrc NE 0 .
ls_patterns_b = is_parent_patterns_b .
ENDIF .

IF cv_firstrow EQ abap_off .
CASE is_tree_layout-rotate .
WHEN space . CLEAR: ls_patterns_a-t_colprop[], ls_patterns_b-t_colprop[]
.
WHEN OTHERS . CLEAR: ls_patterns_a-t_rowprop[], ls_patterns_b-t_rowprop[]
.
ENDCASE .
ENDIF .

* get current level nodes


cr_alvtree->get_children(
EXPORTING i_node_key = iv_parent_node_key
IMPORTING et_children = lt_nodes ) .

* process nodes
LOOP AT lt_nodes INTO lv_node_key .

cr_alvtree->get_outtab_line(
EXPORTING i_node_key = lv_node_key
IMPORTING e_outtab_line = cs_outtab_line
e_node_text = lv_node_text
es_node_layout = ls_node_layout ) .

CONCATENATE v_text-t198 " -->> Building of tree, node:


lv_node_text
INTO lv_value SEPARATED BY space .

progressbar( iv_text = lv_value ) .

CHECK ls_node_layout-hidden IS INITIAL . " by PH-WID

CASE is_tree_layout-rotate .
WHEN space .
ADD 1 TO cv_top .
cv_left = cs_legacy-tb_area_left - 1 .
lv_begin_top = cv_top .
lv_begin_left = cs_legacy-tb_area_left .
WHEN OTHERS .
cv_top = cs_legacy-tb_area_top - 1 .
ADD 1 TO cv_left .
lv_begin_top = cs_legacy-tb_area_top .
lv_begin_left = cv_left .
ENDCASE .

* hierarchy column (BEFORE others)


IF is_tree_layout-col_hier IS NOT INITIAL
AND is_tree_layout-col_hier_after IS INITIAL .
r_excelruntime->begin_pattern( is_patterns = ls_patterns_a ) .

CLEAR lv_value .
IF lv_level GT 1 .
lv_offset = ( lv_level - 1 ) * is_tree_layout-col_hier_shift .
lv_value+lv_offset = lv_node_text .
ELSE .
lv_value = lv_node_text .
ENDIF .

lv_value_top = ls_patterns_a-top .
lv_value_left = ls_patterns_a-left .

r_excelruntime->begin_field(
EXPORTING iv_top = lv_value_top
iv_left = lv_value_left
iv_value = lv_value ) .

CASE is_tree_layout-rotate .
WHEN space . ADD 1 TO cv_left .
WHEN OTHERS . ADD 1 TO cv_top .
ENDCASE .
r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r = space
iv_printtitles_c = space
CHANGING cv_top = cv_top
cv_left = cv_left ) .
CASE is_tree_layout-rotate .
WHEN space . cv_left = cv_left + ls_patterns_a-columns - 1 .
WHEN OTHERS . cv_top = cv_top + ls_patterns_a-rows - 1 .
ENDCASE .
ENDIF .

* other columns
CLEAR lv_pattern_top .
CLEAR lv_pattern_left .
IF is_tree_layout-col_othr IS NOT INITIAL
AND it_fcat_lvc[] IS NOT INITIAL .
r_excelruntime->begin_pattern( is_patterns = ls_patterns_b ) .

LOOP AT it_fcat_lvc INTO ls_fcat_lvc .


CASE is_tree_layout-rotate .
WHEN space .
lv_value_top = ls_patterns_b-top .
lv_value_left = ls_patterns_b-left + ls_fcat_lvc-indx_field - 1 .
WHEN OTHERS .
lv_value_left = ls_patterns_b-left .
lv_value_top = ls_patterns_b-top + ls_fcat_lvc-indx_field - 1 .
ENDCASE .

ASSIGN COMPONENT ls_fcat_lvc-fieldname OF STRUCTURE cs_outtab_line TO


<value> .
CHECK <value> IS ASSIGNED .
IF ls_fcat_lvc-icon IS INITIAL .
READ TABLE it_subtotals INTO ls_subtotals
WITH TABLE KEY nodekey = lv_node_key
fieldname = ls_fcat_lvc-fieldname .
IF sy-subrc EQ 0 .
<value> = ls_subtotals-fieldvalue .
ENDIF .

lr_tdescr = cl_abap_datadescr=>describe_by_data( p_data = <value> ) .

CLEAR lv_value .
cl_gui_alv_grid=>cell_display(
EXPORTING is_data = cs_outtab_line
i_int_value = <value>
IMPORTING e_ext_value = lv_value
CHANGING cs_fieldcat = ls_fcat_lvc ) .

CASE lr_tdescr->type_kind .
WHEN cl_abap_datadescr=>typekind_packed
OR cl_abap_datadescr=>typekind_int .

CASE v_dcpfm .
WHEN space .TRANSLATE lv_value USING '. ,.'. "1.234.567,89
WHEN 'X' . TRANSLATE lv_value USING ', '. "1,234,567.89
WHEN 'Y' . TRANSLATE lv_value USING ',.'. "1 234 567,89
ENDCASE .

CONDENSE lv_value NO-GAPS .

IF <value> LT 0 .
REPLACE FIRST OCCURRENCE OF '-' IN lv_value WITH space .
CONCATENATE '-' lv_value INTO lv_value .
ENDIF .

WHEN OTHERS .
CHECK lv_value IS NOT INITIAL .
SHIFT lv_value LEFT DELETING LEADING space .
ENDCASE .

DO 1 TIMES .
CLEAR lv_formula .
CHECK is_tree_layout-allow_formulas IS NOT INITIAL .
CHECK lv_value IS NOT INITIAL .
CHECK lv_value(1) EQ '=' .

lv_formula = abap_on .
ENDDO .

r_excelruntime->begin_field(
EXPORTING iv_top = lv_value_top
iv_left = lv_value_left
iv_value = lv_value
iv_formula = lv_formula ) .

ELSEIF <value>(1) EQ '@'.


CLEAR ls_drawings .
ls_drawings-media_rawdata = get_icon_rawdata( <value> ) .
CHECK ls_drawings-media_rawdata IS NOT INITIAL .
ls_drawings-drawing_type = lcl_excel=>c_drawing_type-bitmap .
ls_drawings-top = lv_value_top .
ls_drawings-left = lv_value_left .
ls_drawings-rows = 1 .
ls_drawings-columns = 1 .
r_excelruntime->begin_drawing( is_drawings_tmp = ls_drawings ) .
ENDIF .

ENDLOOP .

CASE is_tree_layout-rotate .
WHEN space . ADD 1 TO cv_left .
WHEN OTHERS . ADD 1 TO cv_top .
ENDCASE .
r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r = space
iv_printtitles_c = space
CHANGING cv_top = cv_top
cv_left = cv_left ) .
CASE is_tree_layout-rotate .
WHEN space . cv_left = cv_left + ls_patterns_b-columns - 1 .
WHEN OTHERS . cv_top = cv_top + ls_patterns_b-rows - 1 .
ENDCASE .
ENDIF .

* hierarchy column (AFTER others)


IF is_tree_layout-col_hier IS NOT INITIAL
AND is_tree_layout-col_hier_after IS NOT INITIAL .
r_excelruntime->begin_pattern( is_patterns = ls_patterns_a ) .

CLEAR lv_value .
IF lv_level GT 1 .
lv_offset = ( lv_level - 1 ) * is_tree_layout-col_hier_shift .
lv_value+lv_offset = lv_node_text .
ELSE .
lv_value = lv_node_text .
ENDIF .

lv_value_top = ls_patterns_a-top .
lv_value_left = ls_patterns_a-left .

r_excelruntime->begin_field(
EXPORTING iv_top = lv_value_top
iv_left = lv_value_left
iv_value = lv_value ) .

CASE is_tree_layout-rotate .
WHEN space . ADD 1 TO cv_left .
WHEN OTHERS . ADD 1 TO cv_top .
ENDCASE .

r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r = space


iv_printtitles_c = space
CHANGING cv_top = cv_top
cv_left = cv_left ) .
CASE is_tree_layout-rotate .
WHEN space . cv_left = cv_left + ls_patterns_a-columns - 1 .
WHEN OTHERS . cv_top = cv_top + ls_patterns_a-rows - 1 .
ENDCASE .
ENDIF .
*----------------------------------------------
IF cv_firstrow EQ abap_on .
cv_firstrow = abap_off .
ENDIF .

CASE is_tree_layout-rotate .
WHEN space .
IF cv_left LT cs_legacy-tb_area_left .
cv_left = cs_legacy-tb_area_left .
ENDIF .
WHEN OTHERS .
IF cv_top LT cs_legacy-tb_area_top .
cv_top = cs_legacy-tb_area_top .
ENDIF .
ENDCASE .

*----------------------------------------------

* recursive process children nodes


compose_process_tree_recurs(
EXPORTING iv_parent_node_key = lv_node_key
iv_parent_level = lv_level
is_parent_patterns_a = ls_patterns_a
is_parent_patterns_b = ls_patterns_b
it_patterns_a = it_patterns_a
it_patterns_b = it_patterns_b
it_fcat_lvc = it_fcat_lvc
is_tree_layout = is_tree_layout
it_expanded_nodes = it_expanded_nodes
it_subtotals = it_subtotals
CHANGING cr_alvtree = cr_alvtree
cs_outtab_line = cs_outtab_line
cs_legacy = cs_legacy
cv_top = cv_top
cv_left = cv_left
cv_firstrow = cv_firstrow ) .

* make structure (group rows/columns)


DO 1 TIMES .
CHECK is_tree_layout-stru IS NOT INITIAL .
CHECK lv_level LT 8 . " -->> Max Number of Outline Levels Excel can display

lv_rows = cv_top - lv_begin_top .


lv_columns = cv_left - lv_begin_left .

CASE is_tree_layout-rotate .
WHEN space .
CHECK lv_rows GE 1 .
ADD 1 TO lv_begin_top .
lv_rowgroup_level = lv_level .
WHEN OTHERS .
CHECK lv_columns GE 1 .
ADD 1 TO lv_begin_left .
lv_colgroup_level = lv_level .
ENDCASE .

CASE is_tree_layout-stru_exp_coll .
WHEN c_stru_exp_coll-dynamic .
READ TABLE it_expanded_nodes TRANSPORTING NO FIELDS
WITH KEY table_line = lv_node_key BINARY SEARCH .
CASE sy-subrc .
WHEN 0 . lv_collapsed = abap_off .
WHEN OTHERS . lv_collapsed = abap_on .
ENDCASE .
WHEN c_stru_exp_coll-collapsed . lv_collapsed = abap_on .
WHEN c_stru_exp_coll-expanded . lv_collapsed = abap_off .
WHEN OTHERS . EXIT .
ENDCASE .

r_excelruntime->finalize_folder(
EXPORTING iv_left = lv_begin_left
iv_top = lv_begin_top
iv_rows = lv_rows
iv_columns = lv_columns
iv_rowgroup_level = lv_rowgroup_level
iv_colgroup_level = lv_colgroup_level
iv_rowgroup_clp = lv_collapsed
iv_colgroup_clp = lv_collapsed ) .
ENDDO .
ENDLOOP .

ENDMETHOD . "compose_process_tree_recurs
METHOD compose_process_tree_recsub .

DATA:
lv_node_key TYPE lvc_nkey ,
lt_nodes TYPE lvc_t_nkey ,
lv_count TYPE i ,
l_dref_calc_tab TYPE REF TO data ,
l_dref_calc_wa TYPE REF TO data ,
l_dref_wa TYPE REF TO data ,
ls_subtotals TYPE ty_s_tree_subtotals .
FIELD-SYMBOLS:
<outtab_line> TYPE ANY ,
<calc_line> TYPE ANY ,
<calc_tab> TYPE STANDARD TABLE ,
<fcat_lvc> TYPE lvc_s_fcat ,
<f1> TYPE ANY ,
<f2> TYPE ANY ,
<f3> TYPE ANY ,
<f4> TYPE ANY .

* assign local copy of initial <tab1> to <calc_tab>.


CREATE DATA l_dref_calc_tab LIKE TABLE OF cs_outtab_line .
ASSIGN l_dref_calc_tab->* TO <calc_tab> .
* assign local copy of initial line of <tab1> to <calc_wa>.
CREATE DATA l_dref_calc_wa LIKE cs_outtab_line .
ASSIGN l_dref_calc_wa->* TO <calc_line> .
* assign local copy of initial line of <tab1> to <wa>.
CREATE DATA l_dref_wa LIKE cs_outtab_line .
ASSIGN l_dref_wa->* TO <outtab_line> .

* get current level nodes


cr_alvtree->get_children(
EXPORTING i_node_key = iv_parent_node_key
IMPORTING et_children = lt_nodes ) .
IF lt_nodes IS INITIAL .
ev_leaf = abap_on .

cr_alvtree->get_outtab_line(
EXPORTING i_node_key = iv_parent_node_key
IMPORTING e_outtab_line = cs_outtab_line ) .
EXIT .

ELSE .
CLEAR ev_leaf .

* process nodes
LOOP AT lt_nodes INTO lv_node_key .

compose_process_tree_recsub(
EXPORTING iv_parent_node_key = lv_node_key
it_fcat_lvc = it_fcat_lvc
CHANGING cr_alvtree = cr_alvtree
cs_outtab_line = <calc_line>
ct_subtotals = ct_subtotals ) .
APPEND <calc_line> TO <calc_tab> .
ENDLOOP .
ENDIF .

* calculate level
CLEAR cs_outtab_line .

LOOP AT it_fcat_lvc ASSIGNING <fcat_lvc> WHERE do_sum IS NOT INITIAL.


CLEAR lv_count .

LOOP AT <calc_tab> ASSIGNING <calc_line> .


ASSIGN COMPONENT <fcat_lvc>-fieldname OF STRUCTURE <calc_line> TO
<f1> .
ASSIGN COMPONENT <fcat_lvc>-fieldname OF STRUCTURE cs_outtab_line TO
<f2> .

* calculate column
CATCH SYSTEM-EXCEPTIONS arithmetic_errors = 5
conversion_errors = 5 .
CASE <fcat_lvc>-h_ftype .
WHEN 'MIN' . " -->> minimum
IF sy-tabix EQ 1
OR <f1> LT <f2> .
<f2> = <f1> .
ENDIF .
WHEN 'MAX' . " -->> maximum
IF sy-tabix EQ 1
OR <f1> GT <f2> .
<f2> = <f1> .
ENDIF .
WHEN 'AVG' . " -->> average
ADD <f1> TO <f2> .
ADD 1 TO lv_count .
WHEN 'SUM' " -->> total
OR space .
ADD <f1> TO <f2> .
ENDCASE .
ENDCATCH .
IF sy-subrc EQ 5 .
CLEAR <f2> .
EXIT .
ENDIF .

* get currency
IF <fcat_lvc>-cfieldname IS NOT INITIAL .
ASSIGN COMPONENT <fcat_lvc>-cfieldname OF STRUCTURE <calc_line> TO
<f3> .
ASSIGN COMPONENT <fcat_lvc>-cfieldname OF STRUCTURE cs_outtab_line TO
<f4> .
IF <f4> IS INITIAL .
MOVE <f3> TO <f4> .
ELSE .
IF <f4> NE <f3>
AND <f3> IS NOT INITIAL .
MOVE '***' TO <f4> .
ENDIF .
ENDIF .
ENDIF .

* get quantity
IF <fcat_lvc>-qfieldname IS NOT INITIAL .
ASSIGN COMPONENT <fcat_lvc>-qfieldname OF STRUCTURE <calc_line> TO
<f3> .
ASSIGN COMPONENT <fcat_lvc>-qfieldname OF STRUCTURE cs_outtab_line TO
<f4> .
IF <f4> IS INITIAL .
MOVE <f3> TO <f4> .
ELSE .
IF <f4> NE <f3>
AND <f3> IS NOT INITIAL .
MOVE '***' TO <f4> .
ENDIF .
ENDIF .
ENDIF .
ENDLOOP .

* calcualte avg
IF <fcat_lvc>-h_ftype EQ 'AVG' .
CATCH SYSTEM-EXCEPTIONS arithmetic_errors = 5
conversion_errors = 5 .
<f2> = <f2> / lv_count .
ENDCATCH .
ENDIF .

* subtotals
DO 1 TIMES .
ASSIGN COMPONENT <fcat_lvc>-fieldname OF STRUCTURE cs_outtab_line TO <f2> .
CHECK <f2> IS ASSIGNED .
CLEAR ls_subtotals .
ls_subtotals-nodekey = iv_parent_node_key .
ls_subtotals-fieldname = <fcat_lvc>-fieldname .
ls_subtotals-fieldvalue = <f2> .
INSERT ls_subtotals INTO TABLE ct_subtotals .
ENDDO .
DO 1 TIMES .
CHECK <fcat_lvc>-cfieldname IS NOT INITIAL .
ASSIGN COMPONENT <fcat_lvc>-cfieldname OF STRUCTURE cs_outtab_line TO
<f2> .
CHECK <f2> IS ASSIGNED .
CLEAR ls_subtotals .
ls_subtotals-nodekey = iv_parent_node_key .
ls_subtotals-fieldname = <fcat_lvc>-cfieldname .
ls_subtotals-fieldvalue = <f2> .
INSERT ls_subtotals INTO TABLE ct_subtotals .
ENDDO .
DO 1 TIMES .
CHECK <fcat_lvc>-qfieldname IS NOT INITIAL .
ASSIGN COMPONENT <fcat_lvc>-qfieldname OF STRUCTURE cs_outtab_line TO
<f2> .
CHECK <f2> IS ASSIGNED .
CLEAR ls_subtotals .
ls_subtotals-nodekey = iv_parent_node_key .
ls_subtotals-fieldname = <fcat_lvc>-qfieldname .
ls_subtotals-fieldvalue = <f2> .
INSERT ls_subtotals INTO TABLE ct_subtotals .
ENDDO .
ENDLOOP .
ENDMETHOD . "compose_process_tree_recsub
METHOD compose_process_tree_s .
DATA:
ls_patterns TYPE lcl_excel=>ty_s_patterns ,
ls_patterns_a TYPE lcl_excel=>ty_s_patterns ,
lt_patterns_a TYPE lcl_excel=>ty_t_patterns ,
ls_patterns_b TYPE lcl_excel=>ty_s_patterns ,
lt_patterns_b TYPE lcl_excel=>ty_t_patterns ,
ls_cells TYPE lcl_excel=>ty_s_cells ,
ls_colprop TYPE lcl_excel=>ty_s_colprop ,
ls_rowprop TYPE lcl_excel=>ty_s_rowprop ,
ls_mergecells TYPE ty_s_mergecells_rel ,
lv_x TYPE i ,
lv_y TYPE i ,
lv_i TYPE i ,
lv_times_row TYPE i ,
lv_index_row TYPE i ,
lv_times_col TYPE i ,
lv_index_col TYPE i ,
lv_index_rel TYPE i ,
lv_index_rel2 TYPE i ,
lv_index TYPE i ,
ls_tree_layout TYPE ty_s_tree_layout ,
lv_value(30000) TYPE c ,
lv_subrc TYPE sysubrc .
DATA:
lr_outtab_line TYPE REF TO data ,
lr_salvtree TYPE REF TO cl_salv_tree ,
lr_salv_nodes_all TYPE REF TO cl_salv_nodes ,
lr_salv_node_root TYPE REF TO cl_salv_node ,
lr_salv_columns_tree TYPE REF TO cl_salv_columns_tree ,
lr_salv_aggregations TYPE REF TO cl_salv_aggregations ,
lt_column_ref TYPE salv_t_column_ref ,
lt_nodes TYPE salv_t_nodes ,
lt_aggregation TYPE salv_t_aggregation ,
lt_fcat_lvc TYPE lvc_t_fcat ,
lt_subtotals TYPE ty_t_tree_subtotals ,
lv_top TYPE i ,
lv_left TYPE i ,
lv_value_top TYPE i ,
lv_value_left TYPE i ,
lt_expanded_nodes TYPE lvc_t_nkey ,
lv_hierarchy_column_width TYPE i ,
lv_firstrow TYPE flag VALUE abap_on .
DATA:
lv_fullpath TYPE string ,
ls_ctxt_prop TYPE lcl_context=>ty_s_properties .
FIELD-SYMBOLS:
<context_ref> TYPE ANY ,
<fcat_lvc> TYPE lvc_s_fcat ,
<outtab_line> TYPE ANY ,
<aggregation> TYPE salv_s_aggregation ,
<column_ref> TYPE salv_s_column_ref .

*======================================================================
* binding with reference of context data
*======================================================================
IF is_data-shift_val_relpath IS INITIAL .
ASSIGN is_parent_context_ref TO <context_ref> .
ELSE .
ASSIGN COMPONENT is_data-shift_val_relpath
OF STRUCTURE is_parent_context_ref TO <context_ref> .
CHECK <context_ref> IS ASSIGNED .
ENDIF .

CHECK <context_ref> IS BOUND .

TRY .
lr_salvtree ?= <context_ref> .

CATCH cx_sy_move_cast_error
cx_sy_dyn_call_illegal_method .
EXIT .
ENDTRY .

conv_container_fs(
EXPORTING iv_field = is_data-properties-tree_layout
IMPORTING es_structure = ls_tree_layout ) .

*======================================================================
* prepare expanded nodes, fieldcatalog, subtotals and coordinates
*======================================================================

* -->> root node object


lr_salv_nodes_all = lr_salvtree->get_nodes( ) .
lr_salv_node_root = lr_salv_nodes_all->get_node( node_key =
cl_alv_tree_base=>c_virtual_root_node ) .

* -->> fieldcatalog
IF is_gui_available( ) IS NOT INITIAL .
lr_salvtree->get_metadata( ) .
ENDIF .
lr_salv_columns_tree = lr_salvtree->get_columns( ) .
lr_salv_aggregations = lr_salvtree->get_aggregations( ) .

lt_fcat_lvc = cl_salv_controller_metadata=>get_tree_fieldcatalog(
r_columns = lr_salv_columns_tree
r_aggregations = lr_salv_aggregations ) .
lt_column_ref = lr_salv_columns_tree->get( ) .

LOOP AT lt_column_ref ASSIGNING <column_ref> .


READ TABLE lt_fcat_lvc ASSIGNING <fcat_lvc> WITH KEY fieldname =
<column_ref>-columnname .
CHECK sy-subrc EQ 0 .

IF <column_ref>-r_column->is_visible( ) IS INITIAL .
<fcat_lvc>-no_out = abap_on .
ELSE .
<fcat_lvc>-no_out = abap_off .
ENDIF .
<fcat_lvc>-outputlen = <column_ref>-r_column->get_output_length( ) .
<fcat_lvc>-tech = <column_ref>-r_column->is_technical( ) .
<fcat_lvc>-col_pos = lr_salv_columns_tree->get_column_position( columnname
= <column_ref>-columnname ) .
ENDLOOP .
DELETE lt_fcat_lvc WHERE tech IS NOT INITIAL .
DELETE lt_fcat_lvc WHERE no_out IS NOT INITIAL .

lt_aggregation[] = lr_salv_aggregations->get( ) .
LOOP AT lt_aggregation ASSIGNING <aggregation> .
READ TABLE lt_fcat_lvc ASSIGNING <fcat_lvc> WITH KEY fieldname =
<column_ref>-columnname .
CHECK sy-subrc EQ 0 .

CASE <aggregation>-r_aggregation->get( ) .
WHEN if_salv_c_aggregation=>total . <fcat_lvc>-h_ftype = 'SUM' .
<fcat_lvc>-do_sum = abap_on .
WHEN if_salv_c_aggregation=>minimum . <fcat_lvc>-h_ftype = 'MIN' .
<fcat_lvc>-do_sum = abap_on .
WHEN if_salv_c_aggregation=>maximum . <fcat_lvc>-h_ftype = 'MAX' .
<fcat_lvc>-do_sum = abap_on .
WHEN if_salv_c_aggregation=>average . <fcat_lvc>-h_ftype = 'AVG' .
<fcat_lvc>-do_sum = abap_on .
WHEN if_salv_c_aggregation=>none . <fcat_lvc>-h_ftype = '' .
<fcat_lvc>-do_sum = abap_off .
ENDCASE .
ENDLOOP .

* -->> subtotals
lr_outtab_line = lr_salv_node_root->get_data_row( ) .
ASSIGN lr_outtab_line->* TO <outtab_line> .

compose_process_tree_s_recsub(
EXPORTING ir_salv_node_parent = lr_salv_node_root
it_fcat_lvc = lt_fcat_lvc
CHANGING cs_outtab_line = <outtab_line>
cr_salvtree = lr_salvtree
ct_subtotals = lt_subtotals ) .

* -->> expanded nodes list


* lr_alvtree->get_expanded_nodes( CHANGING ct_expanded_nodes = lt_expanded_nodes
* EXCEPTIONS OTHERS = 0 ) .
* SORT lt_expanded_nodes .

* -->> coordinates
CASE is_data-properties-tb_direction .
WHEN c_tb_direction-up2down .
cs_legacy-tb_area_top = cs_parent_legacy-tb_area_prew_top +
cs_parent_legacy-tb_area_prew_rows .
cs_legacy-tb_area_left = cs_parent_legacy-tb_area_prew_left .

WHEN c_tb_direction-left2right .
cs_legacy-tb_area_left = cs_parent_legacy-tb_area_prew_left +
cs_parent_legacy-tb_area_prew_columns .
cs_legacy-tb_area_top = cs_parent_legacy-tb_area_prew_top .
ENDCASE .

cs_legacy-tb_area_rows = 0 .
cs_legacy-tb_area_columns = 0 .

*======================================================================
* prepare patterns (get a content of pattern area)
*======================================================================
ls_patterns =
r_exceltemplate->get_pattern( iv_sheetname = cs_parent_legacy-tb_sheetname
iv_id = is_data-properties-id ) .
* lr_alvtree->get_hierarchy_header_width( IMPORTING e_width =
lv_hierarchy_column_width ) .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .

CASE ls_tree_layout-rotate .
WHEN space .
* A-PATTERNS
lv_times_row = ls_patterns-rows .

DO lv_times_row TIMES . " -->> loop at ROWS


lv_index_row = sy-index .

CLEAR ls_patterns_a .
ls_patterns_a-id = lv_index_row - 1 .
ls_patterns_a-left = ls_patterns-left .
ls_patterns_a-top = ls_patterns-top + lv_index_row - 1 .
ls_patterns_a-rows = 1 .

lv_x = ls_patterns-left .
lv_y = ls_patterns-top + lv_index_row - 1 .

CLEAR ls_cells .
CLEAR ls_colprop .
CLEAR ls_rowprop .

READ TABLE ls_patterns-t_rowprop INTO ls_rowprop WITH TABLE KEY y =


lv_y .
IF sy-subrc EQ 0 .
INSERT ls_rowprop INTO TABLE ls_patterns_a-t_rowprop .
ENDIF .

CLEAR ls_mergecells .
READ TABLE ls_patterns-t_mergecells INTO ls_mergecells
WITH KEY top = lv_y left = lv_x .
IF sy-subrc EQ 0 .
INSERT ls_mergecells INTO TABLE ls_patterns_a-t_mergecells .
ELSE .
ls_mergecells-columns = 1 .
ENDIF .
DO ls_mergecells-columns TIMES .
IF sy-index GT 1 .
ADD 1 TO lv_x .
ENDIF .

READ TABLE ls_patterns-t_cells INTO ls_cells WITH KEY y = lv_y x =


lv_x BINARY SEARCH .
IF sy-subrc NE 0 .
ls_cells-y = lv_y .
ls_cells-x = lv_x .
ENDIF .
INSERT ls_cells INTO TABLE ls_patterns_a-t_cells .

CLEAR ls_colprop .
READ TABLE ls_patterns-t_colprop INTO ls_colprop WITH KEY x = lv_x
BINARY SEARCH .
ls_colprop-x = lv_x .

IF ls_tree_layout-col_othr_width EQ 0
OR lv_hierarchy_column_width EQ 0 .
IF sy-subrc EQ 0 .
INSERT ls_colprop INTO TABLE ls_patterns_a-t_colprop .
ENDIF .
ELSE .
ls_colprop-customwidth = '1' .
ls_colprop-width = lv_i = ls_tree_layout-col_othr_width *
lv_hierarchy_column_width .
CONDENSE ls_colprop-width NO-GAPS .
INSERT ls_colprop INTO TABLE ls_patterns_a-t_colprop .
ENDIF .
ENDDO .

ls_patterns_a-columns = ls_mergecells-columns .
APPEND ls_patterns_a TO lt_patterns_a .
ENDDO .

* B-PATTERNS
lv_times_row = ls_patterns-rows .
lv_times_col = LINES( lt_fcat_lvc ) .

DO lv_times_row TIMES . " -->> loop at ROWS


lv_index_row = sy-index .
lv_y = ls_patterns-top + lv_index_row - 1 .

CLEAR ls_patterns_b .
ls_patterns_b-id = lv_index_row - 1 .
ls_patterns_b-left = ls_patterns-left + ls_patterns_a-columns .
ls_patterns_b-top = ls_patterns-top + lv_index_row - 1 .
ls_patterns_b-rows = 1 .

CLEAR ls_cells .
CLEAR ls_colprop .
CLEAR ls_rowprop .

READ TABLE ls_patterns-t_rowprop INTO ls_rowprop WITH TABLE KEY y =


lv_y .
IF sy-subrc EQ 0 .
INSERT ls_rowprop INTO TABLE ls_patterns_b-t_rowprop .
ENDIF .

lv_index_col = 0 .
lv_index_rel = 0 .
lv_index_rel2 = ls_patterns_a-columns - 1 .
lv_x = ls_patterns-left + lv_index_rel2 .

DO lv_times_col TIMES . " -->> loop at COLUMNS


ADD 1 TO lv_index_col .
ADD 1 TO lv_index_rel .
ADD 1 TO lv_index_rel2 .
ADD 1 TO lv_x .

READ TABLE lt_fcat_lvc ASSIGNING <fcat_lvc> INDEX lv_index_col .


CHECK sy-subrc EQ 0 .
<fcat_lvc>-indx_field = lv_index_rel .

CLEAR ls_mergecells .
READ TABLE ls_patterns-t_mergecells INTO ls_mergecells
WITH KEY top = lv_y left = lv_x .
IF sy-subrc EQ 0 .
INSERT ls_mergecells INTO TABLE ls_patterns_b-t_mergecells .
ELSE .
ls_mergecells-columns = 1 .
ENDIF .

DO ls_mergecells-columns TIMES .
lv_index = sy-index .
IF lv_index GT 1 .
ADD 1 TO lv_index_rel .
ADD 1 TO lv_index_rel2 .
ADD 1 TO lv_x .
ENDIF .

IF lv_index_rel2 LT ls_patterns-columns .
CLEAR ls_cells .
READ TABLE ls_patterns-t_cells INTO ls_cells WITH KEY y = lv_y x =
lv_x BINARY SEARCH .
ENDIF .
ls_cells-y = lv_y .
ls_cells-x = lv_x .
INSERT ls_cells INTO TABLE ls_patterns_b-t_cells .

IF lv_index_rel2 LT ls_patterns-columns .
CLEAR ls_colprop .
READ TABLE ls_patterns-t_colprop INTO ls_colprop WITH KEY x = lv_x
BINARY SEARCH .
lv_subrc = sy-subrc .
ENDIF .
IF lv_index GT 1
OR ls_tree_layout-col_othr_width EQ 0
OR <fcat_lvc>-outputlen EQ 0 .
IF lv_subrc EQ 0 .
ls_colprop-x = lv_x .
INSERT ls_colprop INTO TABLE ls_patterns_b-t_colprop .
ENDIF .
ELSE .
ls_colprop-x = lv_x .
ls_colprop-customwidth = '1' .
ls_colprop-width = lv_i = ls_tree_layout-col_othr_width *
<fcat_lvc>-outputlen .
CONDENSE ls_colprop-width NO-GAPS .
INSERT ls_colprop INTO TABLE ls_patterns_b-t_colprop .
ENDIF .
ENDDO .

ADD ls_mergecells-columns TO ls_patterns_b-columns .


ENDDO .

APPEND ls_patterns_b TO lt_patterns_b .


ENDDO .

WHEN OTHERS . " == R O T A T E = T R E E


=====================================

* A-PATTERNS
lv_times_row = ls_patterns-columns .

DO lv_times_row TIMES . " -->> loop at ROWS


lv_index_row = sy-index .

CLEAR ls_patterns_a .
ls_patterns_a-id = lv_index_row - 1 .
ls_patterns_a-left = ls_patterns-left + lv_index_row - 1 .
ls_patterns_a-top = ls_patterns-top .
ls_patterns_a-columns = 1 .

lv_x = ls_patterns-left + lv_index_row - 1 .


lv_y = ls_patterns-top .

CLEAR ls_cells .
CLEAR ls_colprop .
CLEAR ls_rowprop .

READ TABLE ls_patterns-t_colprop INTO ls_colprop WITH KEY x = lv_x BINARY


SEARCH .
IF sy-subrc EQ 0 .
INSERT ls_colprop INTO TABLE ls_patterns_a-t_colprop .
ENDIF .

CLEAR ls_mergecells .
READ TABLE ls_patterns-t_mergecells INTO ls_mergecells
WITH KEY top = lv_y left = lv_x .
IF sy-subrc EQ 0 .
INSERT ls_mergecells INTO TABLE ls_patterns_a-t_mergecells .
ELSE .
ls_mergecells-rows = 1 .
ENDIF .

DO ls_mergecells-rows TIMES .
IF sy-index GT 1 .
ADD 1 TO lv_y .
ENDIF .

READ TABLE ls_patterns-t_cells INTO ls_cells WITH KEY y = lv_y x =


lv_x BINARY SEARCH .
IF sy-subrc NE 0 .
ls_cells-y = lv_y .
ls_cells-x = lv_x .
ENDIF .
INSERT ls_cells INTO TABLE ls_patterns_a-t_cells .

CLEAR ls_rowprop .
READ TABLE ls_patterns-t_rowprop INTO ls_rowprop WITH TABLE KEY y =
lv_y .
ls_rowprop-y = lv_y .

IF ls_tree_layout-col_othr_width EQ 0
OR lv_hierarchy_column_width EQ 0 .
IF sy-subrc EQ 0 .
INSERT ls_rowprop INTO TABLE ls_patterns_a-t_rowprop .
ENDIF .
ELSE .
ls_rowprop-customheight = '1' .
ls_rowprop-ht = lv_i = ls_tree_layout-col_othr_width *
lv_hierarchy_column_width .
CONDENSE ls_rowprop-ht NO-GAPS .
INSERT ls_rowprop INTO TABLE ls_patterns_a-t_rowprop .
ENDIF .
ENDDO .

ls_patterns_a-rows = ls_mergecells-rows .
APPEND ls_patterns_a TO lt_patterns_a .
ENDDO .

* B-PATTERNS
lv_times_row = ls_patterns-columns .
lv_times_col = LINES( lt_fcat_lvc ) .

DO lv_times_row TIMES . " -->> loop at ROWS


lv_index_row = sy-index .
lv_x = ls_patterns-left + lv_index_row - 1 .

CLEAR ls_patterns_b .
ls_patterns_b-id = lv_index_row - 1 .
ls_patterns_b-left = ls_patterns-left + lv_index_row - 1 .
ls_patterns_b-top = ls_patterns-top + ls_patterns_a-rows .
ls_patterns_b-columns = 1 .

CLEAR ls_cells .
CLEAR ls_colprop .
CLEAR ls_rowprop .

READ TABLE ls_patterns-t_colprop INTO ls_colprop WITH KEY x = lv_x BINARY


SEARCH .
IF sy-subrc EQ 0 .
INSERT ls_colprop INTO TABLE ls_patterns_b-t_colprop .
ENDIF .

lv_index_col = 0 .
lv_index_rel = 0 .
lv_index_rel2 = ls_patterns_a-rows - 1 .
lv_y = ls_patterns-top + lv_index_rel2 .

DO lv_times_col TIMES . " -->> loop at COLUMNS


ADD 1 TO lv_index_col .
ADD 1 TO lv_index_rel .
ADD 1 TO lv_index_rel2 .
ADD 1 TO lv_y .

READ TABLE lt_fcat_lvc ASSIGNING <fcat_lvc> INDEX lv_index_col .


CHECK sy-subrc EQ 0 .
<fcat_lvc>-indx_field = lv_index_rel .

CLEAR ls_mergecells .
READ TABLE ls_patterns-t_mergecells INTO ls_mergecells
WITH KEY top = lv_y left = lv_x .
IF sy-subrc EQ 0 .
INSERT ls_mergecells INTO TABLE ls_patterns_b-t_mergecells .
ELSE .
ls_mergecells-rows = 1 .
ENDIF .

DO ls_mergecells-rows TIMES .
lv_index = sy-index .
IF lv_index GT 1 .
ADD 1 TO lv_index_rel .
ADD 1 TO lv_index_rel2 .
ADD 1 TO lv_y .
ENDIF .

IF lv_index_rel2 LT ls_patterns-rows .
CLEAR ls_cells .
READ TABLE ls_patterns-t_cells INTO ls_cells WITH KEY y = lv_y x =
lv_x BINARY SEARCH .
ENDIF .
ls_cells-y = lv_y .
ls_cells-x = lv_x .
INSERT ls_cells INTO TABLE ls_patterns_b-t_cells .

IF lv_index_rel2 LT ls_patterns-rows .
CLEAR ls_rowprop .
READ TABLE ls_patterns-t_rowprop INTO ls_rowprop WITH TABLE KEY y =
lv_y .
lv_subrc = sy-subrc .
ENDIF .

IF lv_index GT 1
OR ls_tree_layout-col_othr_width EQ 0
OR <fcat_lvc>-outputlen EQ 0 .
IF lv_subrc EQ 0 .
ls_rowprop-y = lv_y .
INSERT ls_rowprop INTO TABLE ls_patterns_b-t_rowprop .
ENDIF .
ELSE .
ls_rowprop-y = lv_y .
ls_rowprop-customheight = '1' .
ls_rowprop-ht = lv_i = ls_tree_layout-col_othr_width * <fcat_lvc>-
outputlen .
CONDENSE ls_rowprop-ht NO-GAPS .
INSERT ls_rowprop INTO TABLE ls_patterns_b-t_rowprop .
ENDIF .
ENDDO .

ADD ls_mergecells-rows TO ls_patterns_b-rows .


ENDDO .
APPEND ls_patterns_b TO lt_patterns_b .
ENDDO .
ENDCASE .

*======================================================================
* header
*======================================================================
lv_top = cs_legacy-tb_area_top - 1 .
lv_left = cs_legacy-tb_area_left - 1 .

IF ls_tree_layout-head IS NOT INITIAL .


READ TABLE lt_patterns_a INTO ls_patterns_a WITH KEY id = 0 .
READ TABLE lt_patterns_b INTO ls_patterns_b WITH KEY id = 0 .

CASE ls_tree_layout-rotate .
WHEN space . ADD 1 TO lv_top .
WHEN OTHERS . ADD 1 TO lv_left .
ENDCASE .

* hierarchy column (BEFORE others)


IF ls_tree_layout-col_hier IS NOT INITIAL
AND ls_tree_layout-col_hier_after IS INITIAL .
r_excelruntime->begin_pattern( is_patterns = ls_patterns_a ) .

CASE ls_tree_layout-rotate .
WHEN space . ADD 1 TO lv_left .
WHEN OTHERS . ADD 1 TO lv_top .
ENDCASE .

* lv_value_top = ls_patterns_a-top .
* lv_value_left = ls_patterns_a-left .
*
* r_excelruntime->begin_field(
* EXPORTING iv_top = lv_value_top
* iv_left = lv_value_left
* iv_value = lv_value ) .

r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r = space


iv_printtitles_c = space
CHANGING cv_top = lv_top
cv_left = lv_left ) .
CASE ls_tree_layout-rotate .
WHEN space . lv_left = lv_left + ls_patterns_a-columns - 1 .
WHEN OTHERS . lv_top = lv_top + ls_patterns_a-rows - 1 .
ENDCASE .
ENDIF .

* other columns
IF ls_tree_layout-col_othr IS NOT INITIAL
AND lt_fcat_lvc[] IS NOT INITIAL .
r_excelruntime->begin_pattern( is_patterns = ls_patterns_b ) .

LOOP AT lt_fcat_lvc ASSIGNING <fcat_lvc> .


CASE ls_tree_layout-rotate .
WHEN space .
lv_value_top = ls_patterns_b-top .
lv_value_left = ls_patterns_b-left + <fcat_lvc>-indx_field - 1 .
WHEN OTHERS .
lv_value_left = ls_patterns_b-left .
lv_value_top = ls_patterns_b-top + <fcat_lvc>-indx_field - 1 .
ENDCASE .

IF <fcat_lvc>-scrtext_l IS NOT INITIAL .


lv_value = <fcat_lvc>-scrtext_l .
ELSEIF <fcat_lvc>-scrtext_m IS NOT INITIAL .
lv_value = <fcat_lvc>-scrtext_m .
ELSEIF <fcat_lvc>-scrtext_s IS NOT INITIAL .
lv_value = <fcat_lvc>-scrtext_s .
ELSEIF <fcat_lvc>-coltext IS NOT INITIAL .
lv_value = <fcat_lvc>-coltext .
ELSEIF <fcat_lvc>-seltext IS NOT INITIAL .
lv_value = <fcat_lvc>-seltext .
ELSE .
lv_value = <fcat_lvc>-fieldname .
ENDIF .
r_excelruntime->begin_field( EXPORTING iv_top = lv_value_top
iv_left = lv_value_left
iv_value = lv_value ) .
ENDLOOP .

CASE ls_tree_layout-rotate .
WHEN space . ADD 1 TO lv_left .
WHEN OTHERS . ADD 1 TO lv_top .
ENDCASE .
r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r = space
iv_printtitles_c = space
CHANGING cv_top = lv_top
cv_left = lv_left ) .
CASE ls_tree_layout-rotate .
WHEN space . lv_left = lv_left + ls_patterns_b-columns - 1 .
WHEN OTHERS . lv_top = lv_top + ls_patterns_b-rows - 1 .
ENDCASE .
ENDIF .

* hierarchy column (AFTER others)


IF ls_tree_layout-col_hier IS NOT INITIAL
AND ls_tree_layout-col_hier_after IS NOT INITIAL .
r_excelruntime->begin_pattern( is_patterns = ls_patterns_a ) .

CASE ls_tree_layout-rotate .
WHEN space . ADD 1 TO lv_left .
WHEN OTHERS . ADD 1 TO lv_top .
ENDCASE .
r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r = space
iv_printtitles_c = space
CHANGING cv_top = lv_top
cv_left = lv_left ) .
CASE ls_tree_layout-rotate .
WHEN space . lv_left = lv_left + ls_patterns_a-columns - 1 .
WHEN OTHERS . lv_top = lv_top + ls_patterns_a-rows - 1 .
ENDCASE .
ENDIF .
ENDIF .

*======================================================================
* positions
*======================================================================
compose_process_tree_s_recurs(
EXPORTING ir_salv_node_parent = lr_salv_node_root
iv_parent_level = 0
is_parent_patterns_a = ls_patterns_a
is_parent_patterns_b = ls_patterns_b
it_patterns_a = lt_patterns_a
it_patterns_b = lt_patterns_b
it_fcat_lvc = lt_fcat_lvc
is_tree_layout = ls_tree_layout
it_expanded_nodes = lt_expanded_nodes
it_subtotals = lt_subtotals
CHANGING cr_salvtree = lr_salvtree
cs_legacy = cs_legacy
cv_top = lv_top
cv_left = lv_left
cv_firstrow = lv_firstrow ) .

cs_legacy-tb_area_rows = lv_top - cs_legacy-tb_area_top + 1 .


cs_legacy-tb_area_columns = lv_left - cs_legacy-tb_area_left + 1 .

IF cs_legacy-tb_area_rows LT 0 .
cs_legacy-tb_area_rows = 0 .
ENDIF .
IF cs_legacy-tb_area_columns LT 0 .
cs_legacy-tb_area_columns = 0 .
ENDIF .

cs_parent_legacy-tb_area_prew_top = cs_legacy-tb_area_prew_top =
cs_legacy-tb_area_top .
cs_parent_legacy-tb_area_prew_rows = cs_legacy-tb_area_prew_rows =
cs_legacy-tb_area_rows .
cs_parent_legacy-tb_area_prew_left = cs_legacy-tb_area_prew_left =
cs_legacy-tb_area_left .
cs_parent_legacy-tb_area_prew_columns = cs_legacy-tb_area_prew_columns =
cs_legacy-tb_area_columns . .

ENDMETHOD . "compose_process_tree_s
METHOD compose_process_tree_s_recurs .

DATA:
ls_nodes TYPE salv_s_nodes ,
lt_nodes TYPE salv_t_nodes ,
lr_outtab_line TYPE REF TO data ,
lv_node_text TYPE lvc_value ,
lv_level TYPE i ,
lv_rows TYPE i ,
lv_columns TYPE i ,
lv_begin_top TYPE i ,
lv_begin_left TYPE i ,
lv_pattern_top TYPE i ,
lv_pattern_left TYPE i ,
lv_value_top TYPE i ,
lv_value_left TYPE i ,
lv_offset TYPE i ,
ls_patterns_a TYPE lcl_excel=>ty_s_patterns ,
ls_patterns_b TYPE lcl_excel=>ty_s_patterns ,
lv_rowgroup_level TYPE i ,
lv_colgroup_level TYPE i ,
lv_collapsed TYPE flag ,
lv_value(30000) TYPE c ,
lv_formula TYPE flag ,
ls_fcat_lvc TYPE lvc_s_fcat ,
lr_tdescr TYPE REF TO cl_abap_typedescr ,
ls_subtotals TYPE ty_s_tree_subtotals ,
ls_drawings TYPE lcl_excel=>ty_s_drawings_tmp .
FIELD-SYMBOLS:
<value> TYPE ANY ,
<outtab_line> TYPE ANY .

lv_level = iv_parent_level + 1 .

* prepare patterns
READ TABLE it_patterns_a INTO ls_patterns_a WITH KEY id = lv_level .
IF sy-subrc NE 0 .
ls_patterns_a = is_parent_patterns_a .
ENDIF .
READ TABLE it_patterns_b INTO ls_patterns_b WITH KEY id = lv_level .
IF sy-subrc NE 0 .
ls_patterns_b = is_parent_patterns_b .
ENDIF .

IF cv_firstrow EQ abap_off .
CASE is_tree_layout-rotate .
WHEN space . CLEAR: ls_patterns_a-t_colprop[], ls_patterns_b-t_colprop[]
.
WHEN OTHERS . CLEAR: ls_patterns_a-t_rowprop[], ls_patterns_b-t_rowprop[]
.
ENDCASE .
ENDIF .

* get current level nodes


TRY.
lt_nodes = ir_salv_node_parent->get_children( ).
CATCH cx_salv_msg .
ENDTRY.

* process nodes
LOOP AT lt_nodes INTO ls_nodes .

lv_node_text = ls_nodes-node->get_text( ) .
lr_outtab_line = ls_nodes-node->get_data_row( ) .
ASSIGN lr_outtab_line->* TO <outtab_line> .

CONCATENATE v_text-t198 " -->> Building of tree, node:


lv_node_text
INTO lv_value SEPARATED BY space .

progressbar( iv_text = lv_value ) .

CHECK ls_nodes-node->is_visible( ) IS NOT INITIAL . " by PH-WID

CASE is_tree_layout-rotate .
WHEN space .
ADD 1 TO cv_top .
cv_left = cs_legacy-tb_area_left - 1 .
lv_begin_top = cv_top .
lv_begin_left = cs_legacy-tb_area_left .
WHEN OTHERS .
cv_top = cs_legacy-tb_area_top - 1 .
ADD 1 TO cv_left .
lv_begin_top = cs_legacy-tb_area_top .
lv_begin_left = cv_left .
ENDCASE .

* hierarchy column (BEFORE others)


IF is_tree_layout-col_hier IS NOT INITIAL
AND is_tree_layout-col_hier_after IS INITIAL .
r_excelruntime->begin_pattern( is_patterns = ls_patterns_a ) .

CLEAR lv_value .
IF lv_level GT 1 .
lv_offset = ( lv_level - 1 ) * is_tree_layout-col_hier_shift .
lv_value+lv_offset = lv_node_text .
ELSE .
lv_value = lv_node_text .
ENDIF .

lv_value_top = ls_patterns_a-top .
lv_value_left = ls_patterns_a-left .

r_excelruntime->begin_field(
EXPORTING iv_top = lv_value_top
iv_left = lv_value_left
iv_value = lv_value ) .

CASE is_tree_layout-rotate .
WHEN space . ADD 1 TO cv_left .
WHEN OTHERS . ADD 1 TO cv_top .
ENDCASE .
r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r = space
iv_printtitles_c = space
CHANGING cv_top = cv_top
cv_left = cv_left ) .
CASE is_tree_layout-rotate .
WHEN space . cv_left = cv_left + ls_patterns_a-columns - 1 .
WHEN OTHERS . cv_top = cv_top + ls_patterns_a-rows - 1 .
ENDCASE .
ENDIF .

* other columns
CLEAR lv_pattern_top .
CLEAR lv_pattern_left .
IF is_tree_layout-col_othr IS NOT INITIAL
AND it_fcat_lvc[] IS NOT INITIAL .
r_excelruntime->begin_pattern( is_patterns = ls_patterns_b ) .

LOOP AT it_fcat_lvc INTO ls_fcat_lvc .


CASE is_tree_layout-rotate .
WHEN space .
lv_value_top = ls_patterns_b-top .
lv_value_left = ls_patterns_b-left + ls_fcat_lvc-indx_field - 1 .
WHEN OTHERS .
lv_value_left = ls_patterns_b-left .
lv_value_top = ls_patterns_b-top + ls_fcat_lvc-indx_field - 1 .
ENDCASE .
ASSIGN COMPONENT ls_fcat_lvc-fieldname OF STRUCTURE <outtab_line> TO
<value> .
CHECK <value> IS ASSIGNED .

IF ls_fcat_lvc-icon IS INITIAL .
READ TABLE it_subtotals INTO ls_subtotals
WITH TABLE KEY nodekey = ls_nodes-key
fieldname = ls_fcat_lvc-fieldname .
IF sy-subrc EQ 0 .
<value> = ls_subtotals-fieldvalue .
ENDIF .

lr_tdescr = cl_abap_datadescr=>describe_by_data( p_data = <value> ) .

CLEAR lv_value .
cl_gui_alv_grid=>cell_display(
EXPORTING is_data = <outtab_line>
i_int_value = <value>
IMPORTING e_ext_value = lv_value
CHANGING cs_fieldcat = ls_fcat_lvc ) .

CASE lr_tdescr->type_kind .
WHEN cl_abap_datadescr=>typekind_packed
OR cl_abap_datadescr=>typekind_int .

CASE v_dcpfm .
WHEN space .TRANSLATE lv_value USING '. ,.'. "1.234.567,89
WHEN 'X' . TRANSLATE lv_value USING ', '. "1,234,567.89
WHEN 'Y' . TRANSLATE lv_value USING ',.'. "1 234 567,89
ENDCASE .

CONDENSE lv_value NO-GAPS .

IF <value> LT 0 .
REPLACE FIRST OCCURRENCE OF '-' IN lv_value WITH space .
CONCATENATE '-' lv_value INTO lv_value .
ENDIF .

WHEN OTHERS .
CHECK lv_value IS NOT INITIAL .
SHIFT lv_value LEFT DELETING LEADING space .
ENDCASE .

DO 1 TIMES .
CLEAR lv_formula .
CHECK is_tree_layout-allow_formulas IS NOT INITIAL .
CHECK lv_value IS NOT INITIAL .
CHECK lv_value(1) EQ '=' .

lv_formula = abap_on .
ENDDO .

r_excelruntime->begin_field(
EXPORTING iv_top = lv_value_top
iv_left = lv_value_left
iv_value = lv_value
iv_formula = lv_formula ) .
ELSEIF <value>(1) EQ '@' .
CLEAR ls_drawings .
ls_drawings-media_rawdata = get_icon_rawdata( <value> ) .
CHECK ls_drawings-media_rawdata IS NOT INITIAL .
ls_drawings-drawing_type = lcl_excel=>c_drawing_type-bitmap .

ls_drawings-top = lv_value_top .
ls_drawings-left = lv_value_left .
ls_drawings-rows = 1 .
ls_drawings-columns = 1 .
r_excelruntime->begin_drawing( is_drawings_tmp = ls_drawings ) .
ENDIF .

ENDLOOP .

CASE is_tree_layout-rotate .
WHEN space . ADD 1 TO cv_left .
WHEN OTHERS . ADD 1 TO cv_top .
ENDCASE .
r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r = space
iv_printtitles_c = space
CHANGING cv_top = cv_top
cv_left = cv_left ) .
CASE is_tree_layout-rotate .
WHEN space . cv_left = cv_left + ls_patterns_b-columns - 1 .
WHEN OTHERS . cv_top = cv_top + ls_patterns_b-rows - 1 .
ENDCASE .
ENDIF .

* hierarchy column (AFTER others)


IF is_tree_layout-col_hier IS NOT INITIAL
AND is_tree_layout-col_hier_after IS NOT INITIAL .
r_excelruntime->begin_pattern( is_patterns = ls_patterns_a ) .

CLEAR lv_value .
IF lv_level GT 1 .
lv_offset = ( lv_level - 1 ) * is_tree_layout-col_hier_shift .
lv_value+lv_offset = lv_node_text .
ELSE .
lv_value = lv_node_text .
ENDIF .

lv_value_top = ls_patterns_a-top .
lv_value_left = ls_patterns_a-left .

r_excelruntime->begin_field(
EXPORTING iv_top = lv_value_top
iv_left = lv_value_left
iv_value = lv_value ) .

CASE is_tree_layout-rotate .
WHEN space . ADD 1 TO cv_left .
WHEN OTHERS . ADD 1 TO cv_top .
ENDCASE .

r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r = space


iv_printtitles_c = space
CHANGING cv_top = cv_top
cv_left = cv_left ) .
CASE is_tree_layout-rotate .
WHEN space . cv_left = cv_left + ls_patterns_a-columns - 1 .
WHEN OTHERS . cv_top = cv_top + ls_patterns_a-rows - 1 .
ENDCASE .
ENDIF .

*----------------------------------------------
IF cv_firstrow EQ abap_on .
cv_firstrow = abap_off .
ENDIF .

CASE is_tree_layout-rotate .
WHEN space .
IF cv_left LT cs_legacy-tb_area_left .
cv_left = cs_legacy-tb_area_left .
ENDIF .
WHEN OTHERS .
IF cv_top LT cs_legacy-tb_area_top .
cv_top = cs_legacy-tb_area_top .
ENDIF .
ENDCASE .

*----------------------------------------------

* recursive process children nodes


compose_process_tree_s_recurs(
EXPORTING ir_salv_node_parent = ls_nodes-node
iv_parent_level = lv_level
is_parent_patterns_a = ls_patterns_a
is_parent_patterns_b = ls_patterns_b
it_patterns_a = it_patterns_a
it_patterns_b = it_patterns_b
it_fcat_lvc = it_fcat_lvc
is_tree_layout = is_tree_layout
it_expanded_nodes = it_expanded_nodes
it_subtotals = it_subtotals
CHANGING cr_salvtree = cr_salvtree
cs_legacy = cs_legacy
cv_top = cv_top
cv_left = cv_left
cv_firstrow = cv_firstrow ) .

* make structure (group rows/columns)


DO 1 TIMES .
CHECK is_tree_layout-stru IS NOT INITIAL .
CHECK lv_level LT 8 . " -->> Max Number of Outline Levels Excel can display

lv_rows = cv_top - lv_begin_top .


lv_columns = cv_left - lv_begin_left .

CASE is_tree_layout-rotate .
WHEN space .
CHECK lv_rows GE 1 .
ADD 1 TO lv_begin_top .
lv_rowgroup_level = lv_level .
WHEN OTHERS .
CHECK lv_columns GE 1 .
ADD 1 TO lv_begin_left .
lv_colgroup_level = lv_level .
ENDCASE .

CASE is_tree_layout-stru_exp_coll .
WHEN c_stru_exp_coll-dynamic .
READ TABLE it_expanded_nodes TRANSPORTING NO FIELDS
WITH KEY table_line = ls_nodes-key BINARY SEARCH .
CASE sy-subrc .
WHEN 0 . lv_collapsed = abap_off .
WHEN OTHERS . lv_collapsed = abap_on .
ENDCASE .
WHEN c_stru_exp_coll-collapsed . lv_collapsed = abap_on .
WHEN c_stru_exp_coll-expanded . lv_collapsed = abap_off .
WHEN OTHERS . EXIT .
ENDCASE .

r_excelruntime->finalize_folder(
EXPORTING iv_left = lv_begin_left
iv_top = lv_begin_top
iv_rows = lv_rows
iv_columns = lv_columns
iv_rowgroup_level = lv_rowgroup_level
iv_colgroup_level = lv_colgroup_level
iv_rowgroup_clp = lv_collapsed
iv_colgroup_clp = lv_collapsed ) .
ENDDO .
ENDLOOP .

ENDMETHOD . "compose_process_tree_s_recurs
METHOD compose_process_tree_s_recsub .

DATA:
ls_nodes TYPE salv_s_nodes ,
lt_nodes TYPE salv_t_nodes ,
lv_count TYPE i ,
l_dref_calc_tab TYPE REF TO data ,
l_dref_calc_wa TYPE REF TO data ,
l_dref_wa TYPE REF TO data ,
ls_subtotals TYPE ty_s_tree_subtotals ,
lr_outtab_line TYPE REF TO data .
FIELD-SYMBOLS:
<outtab_line> TYPE ANY ,
<calc_line> TYPE ANY ,
<calc_tab> TYPE STANDARD TABLE ,
<fcat_lvc> TYPE lvc_s_fcat ,
<f1> TYPE ANY ,
<f2> TYPE ANY ,
<f3> TYPE ANY ,
<f4> TYPE ANY .

* assign local copy of initial <tab1> to <calc_tab>.


CREATE DATA l_dref_calc_tab LIKE TABLE OF cs_outtab_line .
ASSIGN l_dref_calc_tab->* TO <calc_tab> .
* assign local copy of initial line of <tab1> to <calc_wa>.
CREATE DATA l_dref_calc_wa LIKE cs_outtab_line .
ASSIGN l_dref_calc_wa->* TO <calc_line> .
* assign local copy of initial line of <tab1> to <wa>.
CREATE DATA l_dref_wa LIKE cs_outtab_line .
ASSIGN l_dref_wa->* TO <outtab_line> .
* get current level nodes
lt_nodes[] = salv_node_get_children( ir_salv_node_parent ) .

IF lt_nodes IS INITIAL .
ev_leaf = abap_on .

lr_outtab_line = ir_salv_node_parent->get_data_row( ) .
ASSIGN lr_outtab_line->* TO <outtab_line> .
cs_outtab_line = <outtab_line> .

EXIT .

ELSE .
CLEAR ev_leaf .

* process nodes
LOOP AT lt_nodes INTO ls_nodes .

compose_process_tree_s_recsub(
EXPORTING ir_salv_node_parent = ls_nodes-node
it_fcat_lvc = it_fcat_lvc
CHANGING cr_salvtree = cr_salvtree
cs_outtab_line = <calc_line>
ct_subtotals = ct_subtotals ) .
APPEND <calc_line> TO <calc_tab> .
ENDLOOP .
ENDIF .

* calculate level
CLEAR cs_outtab_line .

LOOP AT it_fcat_lvc ASSIGNING <fcat_lvc> WHERE do_sum IS NOT INITIAL.


CLEAR lv_count .

LOOP AT <calc_tab> ASSIGNING <calc_line> .


ASSIGN COMPONENT <fcat_lvc>-fieldname OF STRUCTURE <calc_line> TO
<f1> .
ASSIGN COMPONENT <fcat_lvc>-fieldname OF STRUCTURE cs_outtab_line TO
<f2> .

* calculate column
CATCH SYSTEM-EXCEPTIONS arithmetic_errors = 5
conversion_errors = 5 .
CASE <fcat_lvc>-h_ftype .
WHEN 'MIN' . " -->> minimum
IF sy-tabix EQ 1
OR <f1> LT <f2> .
<f2> = <f1> .
ENDIF .
WHEN 'MAX' . " -->> maximum
IF sy-tabix EQ 1
OR <f1> GT <f2> .
<f2> = <f1> .
ENDIF .
WHEN 'AVG' . " -->> average
ADD <f1> TO <f2> .
ADD 1 TO lv_count .
WHEN 'SUM' " -->> total
OR space .
ADD <f1> TO <f2> .
ENDCASE .
ENDCATCH .
IF sy-subrc EQ 5 .
CLEAR <f2> .
EXIT .
ENDIF .

* get currency
IF <fcat_lvc>-cfieldname IS NOT INITIAL .
ASSIGN COMPONENT <fcat_lvc>-cfieldname OF STRUCTURE <calc_line> TO
<f3> .
ASSIGN COMPONENT <fcat_lvc>-cfieldname OF STRUCTURE cs_outtab_line TO
<f4> .
IF <f4> IS INITIAL .
MOVE <f3> TO <f4> .
ELSE .
IF <f4> NE <f3>
AND <f3> IS NOT INITIAL .
MOVE '***' TO <f4> .
ENDIF .
ENDIF .
ENDIF .

* get quantity
IF <fcat_lvc>-qfieldname IS NOT INITIAL .
ASSIGN COMPONENT <fcat_lvc>-qfieldname OF STRUCTURE <calc_line> TO
<f3> .
ASSIGN COMPONENT <fcat_lvc>-qfieldname OF STRUCTURE cs_outtab_line TO
<f4> .
IF <f4> IS INITIAL .
MOVE <f3> TO <f4> .
ELSE .
IF <f4> NE <f3>
AND <f3> IS NOT INITIAL .
MOVE '***' TO <f4> .
ENDIF .
ENDIF .
ENDIF .
ENDLOOP .

* calcualte avg
IF <fcat_lvc>-h_ftype EQ 'AVG' .
CATCH SYSTEM-EXCEPTIONS arithmetic_errors = 5
conversion_errors = 5 .
<f2> = <f2> / lv_count .
ENDCATCH .
ENDIF .

* subtotals
DO 1 TIMES .
ASSIGN COMPONENT <fcat_lvc>-fieldname OF STRUCTURE cs_outtab_line TO <f2> .
CHECK <f2> IS ASSIGNED .
CLEAR ls_subtotals .
ls_subtotals-nodekey = ir_salv_node_parent->get_key( ) .
ls_subtotals-fieldname = <fcat_lvc>-fieldname .
ls_subtotals-fieldvalue = <f2> .
INSERT ls_subtotals INTO TABLE ct_subtotals .
ENDDO .
DO 1 TIMES .
CHECK <fcat_lvc>-cfieldname IS NOT INITIAL .
ASSIGN COMPONENT <fcat_lvc>-cfieldname OF STRUCTURE cs_outtab_line TO
<f2> .
CHECK <f2> IS ASSIGNED .
CLEAR ls_subtotals .
ls_subtotals-nodekey = ir_salv_node_parent->get_key( ) .
ls_subtotals-fieldname = <fcat_lvc>-cfieldname .
ls_subtotals-fieldvalue = <f2> .
INSERT ls_subtotals INTO TABLE ct_subtotals .
ENDDO .
DO 1 TIMES .
CHECK <fcat_lvc>-qfieldname IS NOT INITIAL .
ASSIGN COMPONENT <fcat_lvc>-qfieldname OF STRUCTURE cs_outtab_line TO
<f2> .
CHECK <f2> IS ASSIGNED .
CLEAR ls_subtotals .
ls_subtotals-nodekey = ir_salv_node_parent->get_key( ) .
ls_subtotals-fieldname = <fcat_lvc>-qfieldname .
ls_subtotals-fieldvalue = <f2> .
INSERT ls_subtotals INTO TABLE ct_subtotals .
ENDDO .
ENDLOOP .
ENDMETHOD . "compose_process_tree_s_recsub
METHOD compose_process_grid .
DATA:
ls_grid_layout TYPE ty_s_grid_layout ,
ls_rowvalues TYPE ty_s_grid_rowvalues ,
ls_patterns TYPE lcl_excel=>ty_s_patterns ,
ls_patterns_m TYPE lcl_excel=>ty_s_patterns ,
ls_patterns_p TYPE lcl_excel=>ty_s_patterns ,
lt_patterns_p TYPE lcl_excel=>ty_t_patterns ,
ls_cells TYPE lcl_excel=>ty_s_cells ,
ls_colprop TYPE lcl_excel=>ty_s_colprop ,
ls_rowprop TYPE lcl_excel=>ty_s_rowprop ,
ls_mergecells_rel TYPE ty_s_mergecells_rel ,
lv_x TYPE i ,
lv_y TYPE i ,
lv_x_from TYPE i ,
lv_x_to TYPE i ,
lv_y_from TYPE i ,
lv_y_to TYPE i ,
lv_top TYPE i ,
lv_left TYPE i ,
lv_value_top TYPE i ,
lv_value_left TYPE i ,
lv_value TYPE string ,
lv_pattern_top TYPE i ,
lv_pattern_left TYPE i ,
lv_comp_fullpath TYPE string ,
lv_index TYPE i ,
lv_index_delta TYPE i ,
lv_index_previous TYPE i ,
lv_subrc TYPE sysubrc ,
lv_offset TYPE i ,
lv_subpattern TYPE i ,
lv_firstcall TYPE flag VALUE abap_on .
DATA:
ls_ctxt_hier TYPE lcl_context=>ty_s_hierarchy ,
lt_ctxt_hier TYPE lcl_context=>ty_t_hierarchy ,
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
lt_ctxt_prop TYPE lcl_context=>ty_t_properties ,
ls_fldseq TYPE ty_s_grid_fldseq ,
lt_fldseq TYPE ty_t_grid_fldseq ,
ls_fldprop TYPE ty_s_grid_fldprop ,
lt_fldprop TYPE ty_t_grid_fldprop ,
ls_buffer_rs TYPE ty_s_grid_rowstructure_buf .
FIELD-SYMBOLS:
<context_tab> TYPE ANY TABLE ,
<rowvalues> TYPE ty_s_grid_rowvalues ,
<rowpattrens> TYPE ty_s_grid_rowpattrens ,
<rowstructure> TYPE ty_s_grid_rowstructure .

* binding with reference of context data (it only can have a type of nested
table)
IF is_data-shift_val_relpath IS INITIAL .
ASSIGN is_parent_context_ref TO <context_tab> .
ELSE .
ASSIGN COMPONENT is_data-shift_val_relpath
OF STRUCTURE is_parent_context_ref TO <context_tab> .
CHECK <context_tab> IS ASSIGNED .
ENDIF .

conv_container_fs(
EXPORTING iv_field = is_data-properties-grid_layout
IMPORTING es_structure = ls_grid_layout ) .

*======================================================================
*======================================================================
* Prepare coordinates and fields
*======================================================================
*======================================================================

CASE is_data-properties-tb_direction .
WHEN c_tb_direction-up2down .
cs_legacy-tb_area_top = cs_parent_legacy-tb_area_prew_top +
cs_parent_legacy-tb_area_prew_rows .
cs_legacy-tb_area_left = cs_parent_legacy-tb_area_prew_left .

WHEN c_tb_direction-left2right .
cs_legacy-tb_area_left = cs_parent_legacy-tb_area_prew_left +
cs_parent_legacy-tb_area_prew_columns .
cs_legacy-tb_area_top = cs_parent_legacy-tb_area_prew_top .
ENDCASE .

cs_legacy-tb_area_rows = 0 .
cs_legacy-tb_area_columns = 0 .

*======================================================================
*======================================================================
* Try to read 'rowstructure' from the buffer.
* If not occurred, calculate it and insert into buffer
*======================================================================
*======================================================================

CLEAR ls_buffer_rs .
READ TABLE t_buffer_rs INTO ls_buffer_rs WITH TABLE KEY form_id = is_data-
properties-id .
IF sy-subrc NE 0 .
*======================================================================
* get field sequence
*======================================================================
get_grid_fldseqprop(
EXPORTING iv_id = is_data-properties-id
IMPORTING et_ctxt_hier = lt_ctxt_hier[]
et_ctxt_prop = lt_ctxt_prop[]
et_fldseq = lt_fldseq[]
et_fldprop = lt_fldprop[] ) .

*======================================================================
* prepare patterns (get a content of pattern area)
*======================================================================
ls_patterns_m =
r_exceltemplate->get_pattern( iv_sheetname = cs_parent_legacy-tb_sheetname
iv_id = is_data-properties-id ) .
CASE ls_grid_layout-rotate .
WHEN space .
DO ls_patterns_m-rows TIMES . " -->> loop at ROWS
lv_index = sy-index .
lv_y = ls_patterns_m-top + lv_index - 1 .

CLEAR ls_patterns .
CLEAR ls_cells .
CLEAR ls_colprop .
CLEAR ls_rowprop .

ls_patterns-id = lv_index - 1 .
ls_patterns-left = ls_patterns_m-left .
ls_patterns-top = ls_patterns_m-top + lv_index - 1 .
ls_patterns-rows = 1 .

READ TABLE ls_patterns_m-t_rowprop INTO ls_rowprop WITH TABLE KEY y =


lv_y .
IF sy-subrc EQ 0 .
INSERT ls_rowprop INTO TABLE ls_patterns-t_rowprop .
ENDIF .

CLEAR ls_buffer_rs-rowvalues[] .
CLEAR ls_rowvalues .
ls_rowvalues-position = ls_patterns_m-left - 1 .
ls_rowvalues-position_rel = 0 .

LOOP AT lt_fldseq INTO ls_fldseq . " -->> loop at COLUMNS


CLEAR ls_fldprop .
READ TABLE lt_fldprop INTO ls_fldprop WITH KEY field = ls_fldseq-
field .

ADD 1 TO ls_rowvalues-position .
ADD 1 TO ls_rowvalues-position_rel .
lv_x = ls_rowvalues-position .

ls_rowvalues-index = sy-tabix .
ls_rowvalues-value_fullpath = ls_fldseq-field .
ls_rowvalues-autofitmerged_r = ls_fldprop-autofitmerged_r .
ls_rowvalues-autofitmerged_c = ls_fldprop-autofitmerged_c .
APPEND ls_rowvalues TO ls_buffer_rs-rowvalues[] .
CLEAR ls_mergecells_rel .
READ TABLE ls_patterns_m-t_mergecells INTO ls_mergecells_rel
WITH KEY top = lv_y
left = lv_x .
IF sy-subrc EQ 0 .
ls_mergecells_rel-autofit_rows = ls_fldprop-autofitmerged_r .
ls_mergecells_rel-autofit_cols = ls_fldprop-autofitmerged_c .
INSERT ls_mergecells_rel INTO TABLE ls_patterns-t_mergecells .
ELSE .
ls_mergecells_rel-columns = 1 .
ENDIF .

DO ls_mergecells_rel-columns TIMES .
IF sy-index GT 1 .
ADD 1 TO ls_rowvalues-position .
ADD 1 TO ls_rowvalues-position_rel .
lv_x = ls_rowvalues-position .
ENDIF .

IF ls_rowvalues-position_rel LE ls_patterns_m-columns .
CLEAR ls_cells .
READ TABLE ls_patterns_m-t_cells INTO ls_cells WITH KEY y = lv_y
x = lv_x BINARY SEARCH .
ENDIF .
ls_cells-y = lv_y .
ls_cells-x = lv_x .
INSERT ls_cells INTO TABLE ls_patterns-t_cells .

IF ls_rowvalues-position_rel LE ls_patterns_m-columns .
CLEAR ls_colprop .
READ TABLE ls_patterns_m-t_colprop INTO ls_colprop WITH KEY x =
lv_x BINARY SEARCH .
lv_subrc = sy-subrc .
ENDIF .
IF lv_subrc EQ 0 .
ls_colprop-x = lv_x .
INSERT ls_colprop INTO TABLE ls_patterns-t_colprop .
ENDIF .
ENDDO .
ENDLOOP .

ls_patterns-columns = lv_x - ls_patterns-left + 1 .


ls_buffer_rs-maxposition = lv_x .
CASE lv_index .
WHEN 1 . MOVE ls_patterns TO ls_buffer_rs-patterns_h .
WHEN OTHERS . APPEND ls_patterns TO lt_patterns_p .
ENDCASE .
ENDDO .

WHEN OTHERS . " == R O T A T E = G R I D


=====================================
DO ls_patterns_m-columns TIMES . " -->> loop at ROWS
lv_index = sy-index .
lv_x = ls_patterns_m-left + lv_index - 1 .

CLEAR ls_patterns .
CLEAR ls_cells .
CLEAR ls_colprop .
CLEAR ls_rowprop .

ls_patterns-id = lv_index - 1 .
ls_patterns-left = ls_patterns_m-left + lv_index - 1 .
ls_patterns-top = ls_patterns_m-top .
ls_patterns-columns = 1 .

READ TABLE ls_patterns_m-t_colprop INTO ls_colprop WITH KEY x = lv_x


BINARY SEARCH .
IF sy-subrc EQ 0 .
INSERT ls_colprop INTO TABLE ls_patterns-t_colprop .
ENDIF .

CLEAR ls_buffer_rs-rowvalues[] .
CLEAR ls_rowvalues .
ls_rowvalues-position = ls_patterns_m-top - 1 .
ls_rowvalues-position_rel = 0 .

LOOP AT lt_fldseq INTO ls_fldseq . " -->> loop at COLUMNS


CLEAR ls_fldprop .
READ TABLE lt_fldprop INTO ls_fldprop WITH KEY field = ls_fldseq-
field .

ADD 1 TO ls_rowvalues-position .
ADD 1 TO ls_rowvalues-position_rel .
lv_y = ls_rowvalues-position .

ls_rowvalues-index = sy-tabix .
ls_rowvalues-value_fullpath = ls_fldseq-field .
ls_rowvalues-autofitmerged_r = ls_fldprop-autofitmerged_r .
ls_rowvalues-autofitmerged_c = ls_fldprop-autofitmerged_c .
APPEND ls_rowvalues TO ls_buffer_rs-rowvalues[] .

CLEAR ls_mergecells_rel .
READ TABLE ls_patterns_m-t_mergecells INTO ls_mergecells_rel
WITH KEY top = lv_y
left = lv_x .
IF sy-subrc EQ 0 .
ls_mergecells_rel-autofit_rows = ls_fldprop-autofitmerged_r .
ls_mergecells_rel-autofit_cols = ls_fldprop-autofitmerged_c .
INSERT ls_mergecells_rel INTO TABLE ls_patterns-t_mergecells .
ELSE .
ls_mergecells_rel-rows = 1 .
ENDIF .

DO ls_mergecells_rel-rows TIMES .
IF sy-index GT 1 .
ADD 1 TO ls_rowvalues-position .
ADD 1 TO ls_rowvalues-position_rel .
lv_y = ls_rowvalues-position .
ENDIF .

IF ls_rowvalues-position_rel LE ls_patterns_m-rows .
CLEAR ls_cells .
READ TABLE ls_patterns_m-t_cells INTO ls_cells WITH KEY y = lv_y
x = lv_x BINARY SEARCH .
ENDIF .
ls_cells-y = lv_y .
ls_cells-x = lv_x .
INSERT ls_cells INTO TABLE ls_patterns-t_cells .

IF ls_rowvalues-position_rel LE ls_patterns_m-rows .
CLEAR ls_rowprop .
READ TABLE ls_patterns_m-t_rowprop INTO ls_rowprop WITH TABLE KEY
y = lv_y .
lv_subrc = sy-subrc .
ENDIF .
IF lv_subrc EQ 0 .
ls_rowprop-y = lv_y .
INSERT ls_rowprop INTO TABLE ls_patterns-t_rowprop .
ENDIF .
ENDDO .
ENDLOOP .

ls_patterns-rows = lv_y - ls_patterns-top + 1 .


ls_buffer_rs-maxposition = lv_y .
CASE lv_index .
WHEN 1 . MOVE ls_patterns TO ls_buffer_rs-patterns_h .
WHEN OTHERS . APPEND ls_patterns TO lt_patterns_p .
ENDCASE .
ENDDO .
ENDCASE .

IF lt_patterns_p IS INITIAL
AND ls_buffer_rs-patterns_h IS NOT INITIAL .
ls_buffer_rs-patterns_h-id = 1 .
APPEND ls_buffer_rs-patterns_h TO lt_patterns_p .
ENDIF .

*======================================================================
* prepare row structure
*======================================================================
APPEND INITIAL LINE TO ls_buffer_rs-rowstructure ASSIGNING <rowstructure> .
<rowstructure>-level = sy-tabix .
node_get_legacy_info(
EXPORTING iv_id = is_data-properties-id
IMPORTING ev_cb_fullpath = <rowstructure>-loop_fullpath ) .

<rowstructure>-loop_fullpath =
get_fullpath( iv_parent_fullpath = <rowstructure>-loop_fullpath
iv_relpath = is_data-properties-cb_val_relpath ) .

SORT lt_ctxt_hier BY tlevel .


LOOP AT lt_ctxt_hier INTO ls_ctxt_hier .
READ TABLE lt_ctxt_prop INTO ls_ctxt_prop WITH KEY id = ls_ctxt_hier-hide .
CHECK sy-subrc EQ 0
AND ls_ctxt_prop-comp_type EQ lcl_context=>c_comp_type-table .

APPEND INITIAL LINE TO ls_buffer_rs-rowstructure ASSIGNING <rowstructure> .


<rowstructure>-level = sy-tabix .
<rowstructure>-loop_fullpath = ls_ctxt_prop-comp_fullpath .
ENDLOOP .

SORT ls_buffer_rs-rowstructure BY level DESCENDING .


LOOP AT ls_buffer_rs-rowvalues ASSIGNING <rowvalues> .
READ TABLE lt_ctxt_prop INTO ls_ctxt_prop WITH KEY comp_fullpath =
<rowvalues>-value_fullpath .
CHECK sy-subrc EQ 0 .
<rowvalues>-ctxt_prop = ls_ctxt_prop .

LOOP AT ls_buffer_rs-rowstructure ASSIGNING <rowstructure> .


CONCATENATE <rowstructure>-loop_fullpath '*' INTO lv_comp_fullpath .
CHECK <rowvalues>-value_fullpath CP lv_comp_fullpath .

APPEND <rowvalues> TO <rowstructure>-rowvalues .


EXIT .
ENDLOOP .
ENDLOOP .

SORT ls_buffer_rs-rowstructure BY level .


LOOP AT ls_buffer_rs-rowstructure ASSIGNING <rowstructure> .
CLEAR lv_index_delta .
CLEAR lv_index_previous .
UNASSIGN <rowpattrens> .

LOOP AT <rowstructure>-rowvalues ASSIGNING <rowvalues> .


lv_index_delta = <rowvalues>-index - lv_index_previous .
lv_index_previous = <rowvalues>-index .

IF <rowpattrens> IS NOT ASSIGNED


OR lv_index_delta NE 1 .
APPEND INITIAL LINE TO <rowstructure>-rowpattrens ASSIGNING
<rowpattrens> .
<rowpattrens>-position = <rowvalues>-position .
<rowpattrens>-position_rel = <rowvalues>-position_rel .
ENDIF .

lv_index = <rowvalues>-index + 1 .
READ TABLE ls_buffer_rs-rowvalues INTO ls_rowvalues WITH KEY INDEX =
lv_index . " read the next field position
IF sy-subrc EQ 0 .
<rowpattrens>-columns = ls_rowvalues-position - <rowpattrens>-
position .
ELSE .
<rowpattrens>-columns = ls_buffer_rs-maxposition - <rowpattrens>-
position + 1 .
ENDIF .

IF <rowvalues>-autofitmerged_r IS NOT INITIAL .


INSERT <rowvalues>-position_rel INTO TABLE <rowpattrens>-
t_autofitmerged_r[] .
ENDIF .
IF <rowvalues>-autofitmerged_c IS NOT INITIAL .
INSERT <rowvalues>-position_rel INTO TABLE <rowpattrens>-
t_autofitmerged_c[] .
ENDIF .

APPEND <rowvalues> TO <rowpattrens>-rowvalues .


ENDLOOP .
ENDLOOP .

LOOP AT ls_buffer_rs-rowstructure ASSIGNING <rowstructure> .


LOOP AT lt_patterns_p INTO ls_patterns_p .
LOOP AT <rowstructure>-rowpattrens ASSIGNING <rowpattrens> .
CLEAR ls_patterns .

CASE ls_grid_layout-rotate .
WHEN space .
lv_x_from = <rowpattrens>-position .
lv_x_to = <rowpattrens>-position + <rowpattrens>-columns - 1 .

ls_patterns-t_cells[] = ls_patterns_p-t_cells[] .
DELETE ls_patterns-t_cells WHERE NOT x BETWEEN lv_x_from AND
lv_x_to .

ls_patterns-t_mergecells[] = ls_patterns_p-t_mergecells[] .
DELETE ls_patterns-t_mergecells WHERE NOT left BETWEEN lv_x_from
AND lv_x_to .

ls_patterns-t_rowprop[] = ls_patterns_p-t_rowprop[] .
ls_patterns-t_colprop[] = ls_patterns_p-t_colprop[] .
DELETE ls_patterns-t_colprop WHERE NOT x BETWEEN lv_x_from AND
lv_x_to .

ls_patterns-id = ls_patterns_p-id .
ls_patterns-left = <rowpattrens>-position .
ls_patterns-top = ls_patterns_p-top .
ls_patterns-columns = <rowpattrens>-columns .
ls_patterns-rows = ls_patterns_p-rows .
APPEND ls_patterns TO <rowpattrens>-patterns .

WHEN OTHERS .
lv_y_from = <rowpattrens>-position .
lv_y_to = <rowpattrens>-position + <rowpattrens>-columns - 1 .

ls_patterns-t_cells[] = ls_patterns_p-t_cells[] .
DELETE ls_patterns-t_cells WHERE NOT y BETWEEN lv_y_from AND
lv_y_to .

ls_patterns-t_mergecells[] = ls_patterns_p-t_mergecells[] .
DELETE ls_patterns-t_mergecells WHERE NOT top BETWEEN lv_y_from AND
lv_y_to .

ls_patterns-t_rowprop[] = ls_patterns_p-t_rowprop[] .
ls_patterns-t_colprop[] = ls_patterns_p-t_colprop[] .
DELETE ls_patterns-t_rowprop WHERE NOT y BETWEEN lv_y_from AND
lv_y_to .

ls_patterns-id = ls_patterns_p-id .
ls_patterns-left = ls_patterns_p-left .
ls_patterns-top = <rowpattrens>-position .
ls_patterns-columns = ls_patterns_p-columns .
ls_patterns-rows = <rowpattrens>-columns .
APPEND ls_patterns TO <rowpattrens>-patterns .
ENDCASE .
ENDLOOP .
ENDLOOP .
ENDLOOP .

LOOP AT ls_buffer_rs-rowstructure ASSIGNING <rowstructure> .


IF sy-tabix GT 1 .
CONCATENATE lv_comp_fullpath '-LINE-' INTO lv_comp_fullpath .
lv_offset = STRLEN( lv_comp_fullpath ) .
<rowstructure>-loop_relpath = <rowstructure>-loop_fullpath+lv_offset .
ENDIF .

CONCATENATE <rowstructure>-loop_fullpath '-LINE-' INTO lv_comp_fullpath .


lv_offset = STRLEN( lv_comp_fullpath ) .

LOOP AT <rowstructure>-rowvalues ASSIGNING <rowvalues> .


<rowvalues>-value_relpath = <rowvalues>-value_fullpath+lv_offset .
ENDLOOP .

LOOP AT <rowstructure>-rowpattrens ASSIGNING <rowpattrens> .


LOOP AT <rowpattrens>-rowvalues ASSIGNING <rowvalues> .
<rowvalues>-value_relpath = <rowvalues>-value_fullpath+lv_offset .
ENDLOOP .
ENDLOOP .

lv_comp_fullpath = <rowstructure>-loop_fullpath .
ENDLOOP .

*======================================================================
* insert 'rowstructure' into buffer
*======================================================================
ls_buffer_rs-form_id = is_data-properties-id .
ls_buffer_rs-maxlevel = LINES( ls_buffer_rs-rowstructure ) .
ls_buffer_rs-maxsubpattern = LINES( lt_patterns_p ) .
INSERT ls_buffer_rs INTO TABLE t_buffer_rs .
ENDIF .

*======================================================================
*======================================================================
* Paste header
*======================================================================
*======================================================================
CASE ls_grid_layout-rotate .
WHEN space .
lv_top = cs_legacy-tb_area_top .
lv_left = cs_legacy-tb_area_left - 1 .
WHEN OTHERS .
lv_top = cs_legacy-tb_area_top - 1 .
lv_left = cs_legacy-tb_area_left .
ENDCASE .

IF ls_grid_layout-head IS NOT INITIAL .


r_excelruntime->begin_pattern( is_patterns = ls_buffer_rs-patterns_h ) .

LOOP AT ls_buffer_rs-rowvalues ASSIGNING <rowvalues> .


CASE ls_grid_layout-rotate .
WHEN space .
ADD 1 TO lv_left .
lv_value_top = ls_buffer_rs-patterns_h-top .
lv_value_left = ls_buffer_rs-patterns_h-left + <rowvalues>-position_rel
- 1 .
WHEN OTHERS .
ADD 1 TO lv_top .
lv_value_left = ls_buffer_rs-patterns_h-left .
lv_value_top = ls_buffer_rs-patterns_h-top + <rowvalues>-position_rel
- 1 .
ENDCASE .
IF sy-tabix EQ 1 .
lv_pattern_left = lv_left .
lv_pattern_top = lv_top .
ENDIF .

CASE ls_grid_layout-head_titles .
WHEN c_head_titles-tech . lv_value = <rowvalues>-ctxt_prop-comp_name .
WHEN c_head_titles-descr . lv_value = <rowvalues>-ctxt_prop-
comp_shortdescr .
WHEN OTHERS .
CONCATENATE <rowvalues>-ctxt_prop-comp_name '-' <rowvalues>-ctxt_prop-
comp_shortdescr
INTO lv_value SEPARATED BY space .
ENDCASE .

r_excelruntime->begin_field( EXPORTING iv_top = lv_value_top


iv_left = lv_value_left
iv_value = lv_value ) .
ENDLOOP .

r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r = space


iv_printtitles_c = space
CHANGING cv_top = lv_pattern_top
cv_left = lv_pattern_left ) .
CASE ls_grid_layout-rotate .
WHEN space . ADD 1 TO lv_top .
WHEN OTHERS . ADD 1 TO lv_left .
ENDCASE .
ENDIF .

*======================================================================
*======================================================================
* Positions
*======================================================================
*======================================================================
IF <context_tab> IS NOT INITIAL .
lv_subpattern = 0 .

compose_process_grid_r( EXPORTING iv_parent_level = 0


ir_parent_context = <context_tab>
iv_maxlevel = ls_buffer_rs-maxlevel
iv_maxsubpattern = ls_buffer_rs-
maxsubpattern
is_grid_layout = ls_grid_layout
CHANGING ct_rowstructure = ls_buffer_rs-
rowstructure
cs_legacy = cs_legacy
cv_top = lv_top
cv_left = lv_left
cv_subpattern = lv_subpattern
cv_firstcall = lv_firstcall ) .
ENDIF .

CASE ls_grid_layout-rotate .
WHEN space .
cs_legacy-tb_area_rows = lv_top - cs_legacy-tb_area_top .
cs_legacy-tb_area_columns = ls_buffer_rs-patterns_h-columns .
WHEN OTHERS .
cs_legacy-tb_area_rows = ls_buffer_rs-patterns_h-rows .
cs_legacy-tb_area_columns = lv_left - cs_legacy-tb_area_left .
ENDCASE .

IF cs_legacy-tb_area_rows LT 0 .
cs_legacy-tb_area_rows = 0 .
ENDIF .
IF cs_legacy-tb_area_columns LT 0 .
cs_legacy-tb_area_columns = 0 .
ENDIF .

cs_parent_legacy-tb_area_prew_top = cs_legacy-tb_area_prew_top =
cs_legacy-tb_area_top .
cs_parent_legacy-tb_area_prew_rows = cs_legacy-tb_area_prew_rows =
cs_legacy-tb_area_rows .
cs_parent_legacy-tb_area_prew_left = cs_legacy-tb_area_prew_left =
cs_legacy-tb_area_left .
cs_parent_legacy-tb_area_prew_columns = cs_legacy-tb_area_prew_columns =
cs_legacy-tb_area_columns .

*======================================================================
*======================================================================
* Dataset Series information for Chart
*======================================================================
*======================================================================
DO 1 TIMES .
* is this Grid dataset for a Chart or CellDataValidation ?
LOOP AT t_properties TRANSPORTING NO FIELDS
WHERE dataset_id EQ is_data-properties-id
OR cb_valvld_for1_dataset_id EQ is_data-properties-id .
EXIT .
ENDLOOP .
CHECK sy-subrc EQ 0 . " -->> yes, it's dataset

DATA:
ls_ref_fields TYPE lcl_excelruntime=>ty_s_dataset_ref_fields ,
lt_ref_fields TYPE lcl_excelruntime=>ty_t_dataset_ref_fields .

LOOP AT ls_buffer_rs-rowvalues ASSIGNING <rowvalues> . " -->> loop at


COLUMNS
ls_ref_fields-field = <rowvalues>-value_fullpath .
CASE ls_grid_layout-rotate .
WHEN space .
ls_ref_fields-beg_x =
ls_ref_fields-end_x = cs_legacy-tb_area_left + <rowvalues>-position_rel
.
ls_ref_fields-beg_y = cs_legacy-tb_area_top + 1 .
ls_ref_fields-end_y = cs_legacy-tb_area_top + cs_legacy-tb_area_rows .
IF ls_grid_layout-head IS NOT INITIAL .
ADD 1 TO ls_ref_fields-beg_y .
ENDIF .
ls_ref_fields-caption_x = ls_ref_fields-beg_x .
ls_ref_fields-caption_y = ls_ref_fields-beg_y - 1 .
WHEN OTHERS .
ls_ref_fields-beg_x = cs_legacy-tb_area_left + 1 .
ls_ref_fields-end_x = cs_legacy-tb_area_left + cs_legacy-
tb_area_columns .
ls_ref_fields-beg_y =
ls_ref_fields-end_y = cs_legacy-tb_area_top + <rowvalues>-
position_rel .
IF ls_grid_layout-head IS NOT INITIAL .
ADD 1 TO ls_ref_fields-beg_x .
ENDIF .
ls_ref_fields-caption_x = ls_ref_fields-beg_x - 1 .
ls_ref_fields-caption_y = ls_ref_fields-beg_y .
ENDCASE .
APPEND ls_ref_fields TO lt_ref_fields .
ENDLOOP .
ENDDO .

*======================================================================
*======================================================================
* Finalize
*======================================================================
*======================================================================

r_excelruntime->finalize_grid( iv_form_id = is_data-properties-id


it_ref_fields = lt_ref_fields[]
iv_rt_path_1 = cs_legacy-rt_path_1 ) .

ENDMETHOD . "compose_process_grid
METHOD compose_process_grid_r .
DATA:
lv_level TYPE i ,
lv_value TYPE string ,
lv_val_convert TYPE flag ,
lv_formula TYPE flag ,
lv_begin_top TYPE i ,
lv_begin_left TYPE i ,
lv_value_top TYPE i ,
lv_value_left TYPE i ,
lv_pattern_top TYPE i ,
lv_pattern_left TYPE i ,
lv_span TYPE i ,
ls_drawings TYPE lcl_excel=>ty_s_drawings_tmp ,
lr_context_line TYPE REF TO data ,
lr_context_tab TYPE REF TO data .
FIELD-SYMBOLS:
<context_tab1> TYPE STANDARD TABLE ,
<context_line1> TYPE ANY ,
<context_tab> TYPE ANY TABLE ,
<context_line> TYPE ANY ,
<rowvalues> TYPE ty_s_grid_rowvalues ,
<rowpattrens> TYPE ty_s_grid_rowpattrens ,
<rowstructure> TYPE ty_s_grid_rowstructure ,
<rowstructure2> TYPE ty_s_grid_rowstructure ,
<patterns> TYPE lcl_excel=>ty_s_patterns .

lv_level = iv_parent_level + 1 .

READ TABLE ct_rowstructure ASSIGNING <rowstructure> WITH KEY level = lv_level


BINARY SEARCH .
CHECK sy-subrc EQ 0 .

IF <rowstructure>-loop_relpath IS INITIAL .
ASSIGN ir_parent_context TO <context_tab> .
ELSE .
ASSIGN COMPONENT <rowstructure>-loop_relpath
OF STRUCTURE ir_parent_context
TO <context_tab> .
ENDIF .
CHECK <context_tab> IS ASSIGNED .

IF <context_tab> IS INITIAL .
CREATE DATA lr_context_line LIKE LINE OF <context_tab> .
ASSIGN lr_context_line->* TO <context_line1> .
CREATE DATA lr_context_tab LIKE STANDARD TABLE OF <context_line1> .
ASSIGN lr_context_tab->* TO <context_tab1> .
APPEND INITIAL LINE TO <context_tab1> .
ASSIGN lr_context_tab->* TO <context_tab> .
ENDIF .

IF lv_level EQ 1 .
progressbar_loop_init(
EXPORTING it_tab = <context_tab>
iv_step = 777
iv_percent_start = 1
iv_percent_end = 99
iv_text = v_text-t225 ) .
ENDIF .

LOOP AT <context_tab> ASSIGNING <context_line> .

*================================================================================
* current level processing
*================================================================================

IF lv_level EQ 1 .
progressbar_loop_actualize( ) .

CASE iv_maxsubpattern .
WHEN 1 .
cv_subpattern = 1 .
WHEN OTHERS .
IF cv_subpattern LT iv_maxsubpattern .
ADD 1 TO cv_subpattern .
ELSE .
cv_subpattern = 1 .
ENDIF .
ENDCASE .
ENDIF .

lv_begin_top = cv_top .
lv_begin_left = cv_left .

LOOP AT <rowstructure>-rowpattrens ASSIGNING <rowpattrens> .

READ TABLE <rowpattrens>-patterns ASSIGNING <patterns> WITH TABLE KEY id =


cv_subpattern .
CHECK <patterns> IS ASSIGNED .

r_excelruntime->begin_pattern( is_patterns = <patterns> ) .

CASE is_grid_layout-rotate .
WHEN space . cv_left = cs_legacy-tb_area_left + <rowpattrens>-
position_rel - 1 .
WHEN OTHERS . cv_top = cs_legacy-tb_area_top + <rowpattrens>-
position_rel - 1 .
ENDCASE .

lv_pattern_top = cv_top .
lv_pattern_left = cv_left .

LOOP AT <rowpattrens>-rowvalues ASSIGNING <rowvalues> .

CASE is_grid_layout-rotate .
WHEN space .
lv_value_top = <patterns>-top .
lv_value_left = <rowvalues>-position .
WHEN OTHERS .
lv_value_left = <patterns>-left .
lv_value_top = <rowvalues>-position .
ENDCASE .

lv_val_convert = is_val_convert_relevant( <rowvalues>-ctxt_prop ) .

lv_value = get_value( is_parent_context_ref = <context_line>


iv_shift_val_relpath = <rowvalues>-value_relpath
iv_val_relpath = <rowvalues>-value_relpath
iv_val_convert = lv_val_convert
iv_fullpath = <rowvalues>-value_fullpath
is_ctxt_prop = <rowvalues>-ctxt_prop ) .
DO 1 TIMES .
CLEAR lv_formula .
CHECK is_grid_layout-allow_formulas IS NOT INITIAL .
CHECK lv_value IS NOT INITIAL .
CHECK lv_value(1) EQ '=' .

lv_formula = abap_on .
ENDDO .

IF <rowvalues>-ctxt_prop-type_kind EQ cl_abap_datadescr=>typekind_xstring
.
CLEAR ls_drawings .
ls_drawings-drawing_type = lcl_excel=>c_drawing_type-bitmap .
ls_drawings-media_rawdata = lv_value .
ELSE .
DO 1 TIMES .
CLEAR ls_drawings .
CHECK lv_value IS NOT INITIAL .
CHECK lv_value+0(1) EQ '@' .
CHECK STRLEN( lv_value ) EQ 4 .
CHECK lv_value+3(1) EQ '@' .
ls_drawings-drawing_type = lcl_excel=>c_drawing_type-bitmap .
ls_drawings-media_rawdata = get_icon_rawdata( lv_value ) .
ENDDO .
ENDIF .

IF ls_drawings-media_rawdata IS INITIAL .
r_excelruntime->begin_field( EXPORTING iv_top = lv_value_top
iv_left = lv_value_left
iv_value = lv_value
iv_formula = lv_formula ) .
ELSE .
ls_drawings-top = lv_value_top .
ls_drawings-left = lv_value_left .
ls_drawings-rows = 1 .
ls_drawings-columns = 1 .
r_excelruntime->begin_drawing( EXPORTING is_drawings_tmp =
ls_drawings ) .
ENDIF .
ENDLOOP .

r_excelruntime->finalize_pattern( EXPORTING iv_printtitles_r = space


iv_printtitles_c = space
CHANGING cv_top = lv_pattern_top
cv_left = lv_pattern_left ) .
ENDLOOP .

*================================================================================
* recursive processing of the children levels
*================================================================================
IF lv_level LT iv_maxlevel .
compose_process_grid_r( EXPORTING iv_parent_level = lv_level
ir_parent_context = <context_line>
iv_maxlevel = iv_maxlevel
iv_maxsubpattern = iv_maxsubpattern
is_grid_layout = is_grid_layout
CHANGING ct_rowstructure = ct_rowstructure
cs_legacy = cs_legacy
cv_top = cv_top
cv_left = cv_left
cv_subpattern = cv_subpattern
cv_firstcall = cv_firstcall ) .
ENDIF .

*================================================================================
* merge Rows/Columns in the Spanned pattern
*================================================================================
DO 1 TIMES .
CASE is_grid_layout-rotate .
WHEN space . CHECK cv_top GT lv_begin_top .
WHEN OTHERS . CHECK cv_left GT lv_begin_left .
ENDCASE .

LOOP AT <rowstructure>-rowpattrens ASSIGNING <rowpattrens> .


CASE is_grid_layout-rotate .
WHEN space .
lv_span = cv_top - lv_begin_top .
CHECK lv_span GT 1 .
lv_pattern_top = lv_begin_top .
lv_pattern_left = cs_legacy-tb_area_left + <rowpattrens>-position_rel
- 1 .

r_excelruntime->finalize_respattern(
EXPORTING iv_rowspan = abap_on
iv_top = lv_pattern_top
iv_left = lv_pattern_left
iv_rows = lv_span
iv_columns = <rowpattrens>-columns
it_autofitmerged_r = <rowpattrens>-t_autofitmerged_r
it_autofitmerged_c = <rowpattrens>-
t_autofitmerged_c ) .
WHEN OTHERS .
lv_span = cv_left - lv_begin_left .
CHECK lv_span GT 1 .
lv_pattern_top = cs_legacy-tb_area_top + <rowpattrens>-position_rel
- 1 .
lv_pattern_left = lv_begin_left .

r_excelruntime->finalize_respattern(
EXPORTING iv_colspan = abap_on
iv_top = lv_pattern_top
iv_left = lv_pattern_left
iv_rows = <rowpattrens>-columns
iv_columns = lv_span
it_autofitmerged_r = <rowpattrens>-t_autofitmerged_r
it_autofitmerged_c = <rowpattrens>-
t_autofitmerged_c ) .
ENDCASE .
ENDLOOP .
ENDDO .

*================================================================================
* optimize row/column properties
*================================================================================
DO 1 TIMES .
CHECK cv_firstcall IS NOT INITIAL .
CHECK lv_level EQ 1 .
CLEAR cv_firstcall .

LOOP AT ct_rowstructure ASSIGNING <rowstructure2> .


LOOP AT <rowstructure2>-rowpattrens ASSIGNING <rowpattrens> .
LOOP AT <rowpattrens>-patterns ASSIGNING <patterns> .
CASE is_grid_layout-rotate .
WHEN space . CLEAR <patterns>-t_colprop[] .
WHEN OTHERS . CLEAR <patterns>-t_rowprop[] .
ENDCASE .
ENDLOOP .
ENDLOOP .
ENDLOOP .
ENDDO .

*================================================================================
* next row/column
*================================================================================
IF lv_level EQ iv_maxlevel .
CASE is_grid_layout-rotate .
WHEN space . ADD 1 TO cv_top .
WHEN OTHERS . ADD 1 TO cv_left .
ENDCASE .
ENDIF .

ENDLOOP . " AT <context_tab>

ENDMETHOD . "compose_process_grid_r
METHOD get_appearance_req .
FIELD-SYMBOLS:
<component> TYPE ANY .

IF iv_apr_relpath IS INITIAL.
rv_required = abap_on.
EXIT.
ELSE.
rv_required = abap_off.
ENDIF.

ASSIGN COMPONENT iv_apr_relpath


OF STRUCTURE is_parent_context_ref TO <component> .
CHECK <component> IS ASSIGNED .

IF iv_apr_offset IS INITIAL
AND iv_apr_match IS INITIAL.
CHECK <component> IS NOT INITIAL .

ELSEIF iv_apr_offset IS NOT INITIAL


AND iv_apr_match IS NOT INITIAL.
CHECK <component>+iv_apr_offset(iv_apr_match) IS NOT INITIAL .

ELSEIF iv_apr_offset IS NOT INITIAL.


CHECK <component>+iv_apr_offset IS NOT INITIAL .

ELSEIF iv_apr_match IS NOT INITIAL.


CHECK <component>(iv_apr_match) IS NOT INITIAL .
ENDIF.

rv_required = abap_on .
ENDMETHOD . "get_appearance_req
METHOD get_value_simple .
DATA:
lv_part TYPE string .
FIELD-SYMBOLS:
<component> TYPE ANY .

CLEAR ev_value .

CHECK iv_relpath IS NOT INITIAL .

ASSIGN COMPONENT iv_relpath


OF STRUCTURE is_parent_context_ref TO <component> .
CHECK <component> IS ASSIGNED .

lv_part = <component> .
CHECK lv_part IS NOT INITIAL .

TRY .
IF iv_offset IS INITIAL
AND iv_match IS INITIAL .

ELSEIF iv_offset IS NOT INITIAL


AND iv_match IS NOT INITIAL .
lv_part = lv_part+iv_offset(iv_match) .

ELSEIF iv_offset IS NOT INITIAL.


lv_part = lv_part+iv_offset .

ELSEIF iv_match IS NOT INITIAL.


lv_part = lv_part(iv_match) .
ENDIF .
CATCH cx_sy_range_out_of_bounds .
RETURN .
ENDTRY .
ev_value = lv_part .
ENDMETHOD . "get_value_simple
METHOD get_value .
TYPE-POOLS:
sydes .
DATA:
ls_tabfield TYPE tabfield ,
lv_value(60000) TYPE c ,
lv_val_offset TYPE i ,
lv_val_match TYPE i ,
lv_val_strlen TYPE i ,
lv_min_strlen TYPE i ,
lv_tabkind TYPE ty_char1 ,
lv_relpath_sub TYPE ty_comp_path ,
lr_table_line TYPE REF TO data ,
lr_table_std TYPE REF TO data .
FIELD-SYMBOLS:
<component> TYPE ANY ,
<table_std> TYPE STANDARD TABLE ,
<table_any> TYPE ANY TABLE ,
<table_line> TYPE ANY .

CLEAR rv_value.
CHECK iv_val_relpath IS NOT INITIAL .

*======================================================================
* get reference
*======================================================================
CASE iv_val_sub_req .
WHEN space .
IF is_ctxt_prop IS INITIAL .
is_ctxt_prop = r_context->node_get_by_path( iv_comp_fullpath =
iv_fullpath ) .
ENDIF .
CHECK is_ctxt_prop-type_kind NE cl_abap_datadescr=>typekind_table .

IF iv_shift_val_relpath IS INITIAL .
ASSIGN is_parent_context_ref TO <component> .
ELSE .
ASSIGN COMPONENT iv_shift_val_relpath
OF STRUCTURE is_parent_context_ref TO <component> .
ENDIF .
CHECK <component> IS ASSIGNED .

WHEN OTHERS .
CHECK iv_val_sub_row IS NOT INITIAL .
CHECK iv_val_sub_col IS NOT INITIAL .

IF is_ctxt_prop IS INITIAL .
is_ctxt_prop = r_context->node_get_by_path( iv_comp_fullpath =
iv_fullpath ) .
ENDIF .
CHECK is_ctxt_prop-type_kind EQ cl_abap_datadescr=>typekind_table .

IF iv_shift_val_relpath IS INITIAL .
ASSIGN is_parent_context_ref TO <table_any> .
ELSE .
ASSIGN COMPONENT iv_shift_val_relpath
OF STRUCTURE is_parent_context_ref TO <table_any> .
ENDIF .
CHECK <table_any> IS NOT INITIAL .

DESCRIBE TABLE <table_any> KIND lv_tabkind .


CASE lv_tabkind .
WHEN sydes_kind-hashed
OR sydes_kind-sorted .
CHECK LINES( <table_any> ) GE iv_val_sub_row .

CREATE DATA lr_table_line LIKE LINE OF <table_any> .


ASSIGN lr_table_line->* TO <table_line> .
CREATE DATA lr_table_std LIKE STANDARD TABLE OF <table_line> .
ASSIGN lr_table_std->* TO <table_std> .
CHECK <table_std> IS ASSIGNED .
<table_std>[] = <table_any>[] .

WHEN OTHERS .
ASSIGN <table_any> TO <table_std> .
ENDCASE .
CHECK <table_std> IS ASSIGNED .
READ TABLE <table_std> ASSIGNING <table_line> INDEX iv_val_sub_row .
CHECK <table_line> IS ASSIGNED .

ASSIGN COMPONENT iv_val_sub_col


OF STRUCTURE <table_line> TO <component> .
CHECK <component> IS ASSIGNED .

CONCATENATE 'LINE-' iv_val_sub_col INTO lv_relpath_sub .

is_ctxt_prop =
r_context->node_get_by_path( iv_relpath = lv_relpath_sub
iv_fullpath_parent = iv_fullpath ) .
CHECK is_ctxt_prop-type_kind NE cl_abap_datadescr=>typekind_table .
ENDCASE .

*======================================================================
* conversion
*======================================================================
IF is_ctxt_prop-type_kind EQ cl_abap_datadescr=>typekind_packed
OR is_ctxt_prop-type_kind EQ cl_abap_datadescr=>typekind_int .
rv_value = <component> .
IF <component> LT 0 .
REPLACE FIRST OCCURRENCE OF '-' IN rv_value WITH space .
CONCATENATE '-' rv_value INTO rv_value .
ENDIF .
CONDENSE rv_value NO-GAPS .

ELSEIF is_ctxt_prop-type_kind EQ cl_abap_datadescr=>typekind_xstring .


rv_value = <component> .

ELSEIF iv_val_convert IS INITIAL .


rv_value = <component> .

ELSEIF is_ctxt_prop IS NOT INITIAL .


* ls_tabfield-tabname = is_ctxt_prop-type_refname_tab .
* ls_tabfield-fieldname = is_ctxt_prop-type_refname_fld .
* lv_value = <component> .
* CALL FUNCTION 'RS_DS_CONV_IN_2_EX'
* EXPORTING
* input = lv_value
* table_field = ls_tabfield
* IMPORTING
* output = lv_value
* EXCEPTIONS
* conversion_error = 1
* OTHERS = 2.
* IF sy-subrc EQ 0 .
* rv_value = lv_value .
* ELSE .
* rv_value = <component> .
* ENDIF .

DATA lr_input_util TYPE REF TO cl_fobu_input_util.

CREATE OBJECT lr_input_util


EXPORTING
tabname = is_ctxt_prop-type_refname_tab
fieldname = is_ctxt_prop-type_refname_fld.

lr_input_util->output_convert(
EXPORTING field_value_int = <component>
IMPORTING field_value_ext = lv_value
EXCEPTIONS OTHERS = 2 ) .
IF sy-subrc EQ 0 .
rv_value = lv_value .
ELSE .
rv_value = <component> .
ENDIF .

ENDIF .

CHECK rv_value IS NOT INITIAL AND


( iv_val_offset IS NOT INITIAL OR iv_val_match IS NOT INITIAL ) .

lv_val_offset = iv_val_offset .
lv_val_match = iv_val_match .
lv_val_strlen = STRLEN( rv_value ) .
lv_min_strlen = lv_val_offset + lv_val_match .

IF lv_val_strlen LE lv_val_offset .
CLEAR rv_value .
EXIT .
ELSEIF lv_val_strlen LT lv_min_strlen .
lv_val_match = lv_val_strlen - lv_val_offset .
ENDIF .

TRY .
IF lv_val_offset IS NOT INITIAL
AND lv_val_match IS NOT INITIAL .
rv_value = rv_value+lv_val_offset(lv_val_match) .

ELSEIF lv_val_offset IS NOT INITIAL .


rv_value = rv_value+lv_val_offset .

ELSEIF lv_val_match IS NOT INITIAL .


rv_value = rv_value(lv_val_match) .
ENDIF .
CATCH cx_sy_range_out_of_bounds .
RETURN .
ENDTRY .

ENDMETHOD . " get_value


METHOD get_icon_rawdata .
DATA:
lr_bds_document TYPE REF TO cl_bds_document_set ,
lv_objkey TYPE bapibds01-objkey ,
lv_content_size TYPE i ,
lt_content TYPE sbdst_content ,
lt_components TYPE sbdst_components ,
ls_buffer_icon TYPE ty_s_buffer_icon .
FIELD-SYMBOLS:
<components> TYPE bapicompon ,
<buffer_icon> TYPE ty_s_buffer_icon .
CLEAR rv_rawdata .

READ TABLE t_buffer_icon ASSIGNING <buffer_icon>


WITH TABLE KEY id = iv_icon .
IF sy-subrc NE 0 .
ls_buffer_icon-id = iv_icon .

DO 1 TIMES .
SELECT SINGLE id name
INTO (ls_buffer_icon-id, ls_buffer_icon-name)
FROM icon
WHERE id EQ iv_icon .
CHECK sy-subrc EQ 0 .

lv_objkey = ls_buffer_icon-name .
CREATE OBJECT lr_bds_document .

lr_bds_document->get_with_table(
EXPORTING classname = 'SAP_ICONS'
classtype = 'OT'
object_key = lv_objkey
CHANGING content = lt_content
components = lt_components
EXCEPTIONS OTHERS = 1 ) .

READ TABLE lt_components ASSIGNING <components> INDEX 1 .


CHECK sy-subrc EQ 0 .

lv_content_size = <components>-comp_size .
CHECK lv_content_size GT 0 .

CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'


EXPORTING
input_length = lv_content_size
IMPORTING
buffer = ls_buffer_icon-rawdata
TABLES
binary_tab = lt_content.
ENDDO .
INSERT ls_buffer_icon INTO TABLE t_buffer_icon ASSIGNING <buffer_icon> .
ENDIF.
rv_rawdata = <buffer_icon>-rawdata .
ENDMETHOD . "get_icon_rawdata
METHOD shift_relpath .
DATA:
lv_i TYPE i ,
lv_tmp_relpath1 TYPE c LENGTH 30000 .

DEFINE mk_shift_left .
if &2 is not initial .
lv_tmp_relpath1 = &1 .
lv_i = strlen( &2 ) .
if lv_tmp_relpath1(lv_i) eq &2 .
shift lv_tmp_relpath1 left by lv_i places .
endif .
&1 = lv_tmp_relpath1 .
endif .
END-OF-DEFINITION .

mk_shift_left cv_relpath: r_context->v_contextname , '-' , 'LINE-' .


ENDMETHOD . "shift_relpath
METHOD salv_node_get_children .
TRY .
rt_nodes[] = ir_salv_node->get_children( ) .
CATCH cx_salv_msg .
CLEAR rt_nodes[] .
ENDTRY .
ENDMETHOD . " salv_node_get_children
ENDCLASS . "lcl_formruntime IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_formtemplate DEFINITION
*----------------------------------------------------------------------*
* form editor
*----------------------------------------------------------------------*
CLASS lcl_formtemplate DEFINITION INHERITING FROM lcl_form .
PUBLIC SECTION .

METHODS:
save
IMPORTING iv_deactivate TYPE flag DEFAULT abap_on
iv_devclass TYPE any OPTIONAL ,
activate ,
deactivate ,
node_add
IMPORTING iv_comp_type TYPE any
iv_comp_name TYPE any
iv_comp_descr TYPE any OPTIONAL
iv_parent_id TYPE any
iv_sibling_id TYPE any OPTIONAL
iv_default_values TYPE any DEFAULT abap_on
RETURNING value(rv_new_id) TYPE ty_s_hierarchy-id ,
node_del
IMPORTING iv_id TYPE any ,
node_clone
IMPORTING iv_id_sample TYPE any
iv_id_target_parent TYPE any OPTIONAL
iv_rename_prefix TYPE any OPTIONAL
iv_rename_postfix TYPE any OPTIONAL
iv_rename_find TYPE any OPTIONAL
iv_rename_replacement TYPE any OPTIONAL
RETURNING value(rv_id_clone) TYPE ty_s_hierarchy-id ,
node_move
IMPORTING iv_id_source TYPE any
iv_id_target TYPE any ,
node_move_sibling_up
IMPORTING iv_id TYPE any ,
node_move_sibling_down
IMPORTING iv_id TYPE any ,
node_set_properties
CHANGING cs_properties TYPE ty_s_properties ,
get_retmess_icon
IMPORTING iv_id TYPE any
RETURNING value(rv_retmess_icon) TYPE icon_d ,
set_formname_new
IMPORTING iv_formname TYPE any ,
set_formdescr_new
IMPORTING iv_formdescr TYPE any ,
autostructure_create ,
autostructure_recurs
IMPORTING is_altern_form_prop TYPE lcl_form=>ty_s_properties
is_parent_form_prop TYPE lcl_form=>ty_s_properties
is_parent_ctxt_prop TYPE lcl_context=>ty_s_properties
iv_parent_level TYPE i
iv_parent_cb_fullpath TYPE any ,
is_component_subnode_of
IMPORTING iv_form_id TYPE ty_s_hierarchy-id
iv_form_id_checked TYPE ty_s_hierarchy-id
RETURNING value(rv_yes) TYPE flag .

PRIVATE SECTION .
METHODS:
node_clone_recurs
IMPORTING is_hier_sample_parent TYPE ty_s_hierarchy
iv_id_clone_parent TYPE ty_s_hierarchy-id
iv_rename_prefix TYPE any OPTIONAL
iv_rename_postfix TYPE any OPTIONAL
iv_rename_find TYPE any OPTIONAL
iv_rename_replacement TYPE any OPTIONAL .

ENDCLASS . "lcl_formtemplate DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_formtemplate IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_formtemplate IMPLEMENTATION .
METHOD save .
msg_init( ) .

DATA:
ls_head TYPE ty_s_head ,
lv_objid TYPE wwwdatatab-objid ,
lt_html_table TYPE STANDARD TABLE OF w3html ,
lt_document_table TYPE tsfmime ,
lv_document_size TYPE i ,
lv_devclass TYPE tadir-devclass .

IF iv_deactivate IS NOT INITIAL .


deactivate( ) .
ENDIF .
ls_head-formname = v_formname .
ls_head-formdescr = v_formdescr .
ls_head-contextname = r_context->v_contextname .
ls_head-active = v_active .
ls_head-root_id = v_root_id .

v_changed_uname = sy-uname .
v_changed_datum = sy-datum .
IF v_created_uname IS INITIAL .
v_created_uname = v_changed_uname .
ENDIF .
IF v_created_datum IS INITIAL .
v_created_datum = v_changed_datum .
ENDIF .
ls_head-created_uname = v_created_uname .
ls_head-created_datum = v_created_datum .
ls_head-changed_uname = v_changed_uname .
ls_head-changed_datum = v_changed_datum .

FIELD-SYMBOLS <properties> TYPE ty_s_properties .


READ TABLE t_properties ASSIGNING <properties> WITH KEY id = v_root_id .
IF sy-subrc EQ 0 .
<properties>-comp_name = v_formname .
<properties>-comp_descr = v_formdescr .
ENDIF .

r_exceltemplate->formparameters_struc_set(
iv_path = r_exceltemplate->c_path-formhead
is_struc = ls_head ) .
r_exceltemplate->formparameters_table_set(
iv_path = r_exceltemplate->c_path-formproperties
it_tab = t_properties ) .
r_exceltemplate->formparameters_table_set(
iv_path = r_exceltemplate->c_path-formhierarchy
it_tab = t_hierarchy ) .

lv_objid = conv_formname_ei( v_formname ) .

r_exceltemplate->rawdata_get_as_table(
IMPORTING et_document_table = lt_document_table
ev_document_size = lv_document_size ) .

IF v_devclass IS INITIAL .
lv_devclass = iv_devclass .
ELSE .
lv_devclass = v_devclass .
ENDIF .
IF lv_devclass IS INITIAL .
MESSAGE e000(lp) WITH v_text-t037 INTO v_dummy . " text: Development class
is not specified
msg_syst_catch( ) .
EXIT .
ENDIF .

CALL FUNCTION 'EXPORT_WEB_OBJECT'


EXPORTING
object_id = lv_objid
mimetype = c_mimetype
text = v_formdescr
size = lv_document_size
devclass = lv_devclass
TABLES
html = lt_html_table
mime = lt_document_table
EXCEPTIONS
size_not_specified = 1
object_locked = 2
OTHERS = 3.
IF sy-subrc NE 0 .
msg_syst_catch( ) .
EXIT .
ENDIF .

v_devclass = lv_devclass .

ENDMETHOD . "save
METHOD activate .
msg_init( ) .

DATA:
ls_properties TYPE ty_s_properties ,
lv_active TYPE flag .
FIELD-SYMBOLS:
<exceptions> TYPE ty_s_exceptions ,
<retmess> TYPE bapiret2 .

IF v_devclass IS INITIAL .
MESSAGE e000(lp) WITH v_text-t038 INTO v_dummy . " text: Firstly, save the
form
msg_syst_catch( ) .
EXIT .
ENDIF .

check_subtree( ) .
v_msg_init = abap_off .
lv_active = abap_on .

LOOP AT t_exceptions ASSIGNING <exceptions> .


READ TABLE t_properties INTO ls_properties WITH KEY id = <exceptions>-id .
IF sy-subrc NE 0 .
DELETE t_exceptions .
CONTINUE .
ENDIF .

CHECK ls_properties-draft_subtree EQ c_draft_subtree-no .

CHECK node_get_retcode_severity( <exceptions>-id ) EQ c_retcode-error .


v_retcode = c_retcode-error .
lv_active = abap_off .

LOOP AT <exceptions>-t_retmess ASSIGNING <retmess> .


IF ls_properties-comp_descr IS INITIAL .
<retmess>-parameter = ls_properties-comp_name .
ELSE .
CONCATENATE ls_properties-comp_name '-' ls_properties-comp_descr
INTO <retmess>-parameter SEPARATED BY space .
ENDIF .

APPEND <retmess> TO t_retmess .


ENDLOOP .
ENDLOOP .

v_active = lv_active .
save( iv_deactivate = space ) .
v_msg_init = abap_on .

ENDMETHOD . "activate
METHOD deactivate .
v_active = abap_off .
ENDMETHOD . "deactivate
METHOD node_add .
msg_init( ) .

DATA:
ls_properties TYPE ty_s_properties ,
ls_tree_layout TYPE ty_s_tree_layout ,
ls_grid_layout TYPE ty_s_grid_layout .

*------------ preliminary checks


IF iv_comp_name IS INITIAL
OR iv_comp_name CA '-' .
MESSAGE e000(lp) WITH v_text-t039 " text: Component name is incorrect
'(' iv_comp_name ')' INTO v_dummy .
msg_syst_catch( ) .
ENDIF .
CHECK v_retcode NE c_retcode-error .

READ TABLE t_properties TRANSPORTING NO FIELDS WITH KEY comp_name =


iv_comp_name .
IF sy-subrc EQ 0 .
MESSAGE w000(lp) WITH v_text-t040 " text: Component with same name already
exists
'(' iv_comp_name ')' INTO v_dummy .
msg_syst_catch( ) .
ENDIF .

is_comptype_allowed( iv_id = iv_parent_id


iv_child_type = iv_comp_type ) .
CHECK v_retcode NE c_retcode-error .

*------------ add node into hierarchy


CALL FUNCTION 'RS_TREE_SET_CURRENT_TREE'
TABLES
nodeinfo = t_hierarchy.

IF iv_sibling_id IS INITIAL .
CALL FUNCTION 'RS_TREE_ADD_NODE'
EXPORTING
new_name = space
insert_id = iv_parent_id
relationship = stree_reltype_baby
IMPORTING
new_id = rv_new_id
EXCEPTIONS
OTHERS = 0.
ELSE .
CALL FUNCTION 'RS_TREE_ADD_NODE'
EXPORTING
new_name = space
insert_id = iv_sibling_id
relationship = stree_reltype_next
IMPORTING
new_id = rv_new_id
EXCEPTIONS
OTHERS = 0.
ENDIF .

CALL FUNCTION 'RS_TREE_GET_CURRENT_TREE'


TABLES
nodeinfo = t_hierarchy.

*------------ add node properties


ls_properties-comp_type = iv_comp_type .
ls_properties-comp_name = iv_comp_name .
ls_properties-comp_descr = iv_comp_descr .

IF iv_default_values IS NOT INITIAL . " set default values


CASE ls_properties-comp_type .
WHEN c_comp_type-sheet .
WHEN c_comp_type-loopstep .
WHEN c_comp_type-pattern
OR c_comp_type-respattern .
ls_properties-tb_colprop = abap_on .
ls_properties-tb_rowprop = abap_on .
WHEN c_comp_type-field .
WHEN c_comp_type-folder .
WHEN c_comp_type-drawing .
WHEN c_comp_type-tree .
conv_container_fs(
EXPORTING iv_field = ls_properties-tree_layout
IMPORTING es_structure = ls_tree_layout ) .
ls_tree_layout-stru = abap_on .
ls_tree_layout-stru_exp_coll = c_stru_exp_coll-expanded .
ls_tree_layout-head = abap_on .
ls_tree_layout-col_hier = abap_on .
ls_tree_layout-col_hier_shift = 5 .
ls_tree_layout-col_othr = abap_on .
ls_tree_layout-allow_formulas = abap_on .
conv_container_sf(
EXPORTING is_structure = ls_tree_layout
IMPORTING ev_field = ls_properties-tree_layout ) .
WHEN c_comp_type-grid .
conv_container_fs(
EXPORTING iv_field = ls_properties-grid_layout
IMPORTING es_structure = ls_grid_layout ) .
ls_grid_layout-head = abap_on .
ls_grid_layout-head_titles = c_head_titles-tech_descr .
ls_grid_layout-allow_formulas = abap_on .
conv_container_sf(
EXPORTING is_structure = ls_grid_layout
IMPORTING ev_field = ls_properties-grid_layout ) .
ENDCASE .
ENDIF .

ls_properties-id = rv_new_id .
APPEND ls_properties TO t_properties .
*------------ check subtree
check_subtree( rv_new_id ) .
deactivate( ) .

ENDMETHOD . "node_add
METHOD node_del .
msg_init( ) .

DATA:
lv_id TYPE snode-id ,
ls_hier_subtree TYPE ty_s_hierarchy ,
lt_hier_subtree TYPE ty_t_hierarchy .

IF iv_id EQ v_root_id .
MESSAGE e000(lp) WITH v_text-t342 " text: Root node cannot be removed
INTO v_dummy .
msg_syst_catch( ) .
RETURN .
ENDIF .

lv_id = iv_id .

CALL FUNCTION 'RS_TREE_SET_CURRENT_TREE'


TABLES
nodeinfo = t_hierarchy.

CALL FUNCTION 'RS_TREE_LIST'


EXPORTING
node_id = lv_id
all = abap_on
TABLES
list = lt_hier_subtree
EXCEPTIONS
cycle_detected = 1
OTHERS = 0.
CHECK sy-subrc EQ 0 .

LOOP AT lt_hier_subtree INTO ls_hier_subtree .


DELETE t_properties WHERE id EQ ls_hier_subtree-id .
ENDLOOP .

CALL FUNCTION 'RS_TREE_DELETE_NODE'


EXPORTING
node_id = lv_id
EXCEPTIONS
OTHERS = 0.

CALL FUNCTION 'RS_TREE_GET_CURRENT_TREE'


TABLES
nodeinfo = t_hierarchy.

DELETE t_patternarea WHERE areaid = lv_id .

check_subtree( ) .
deactivate( ) .
ENDMETHOD . "node_del
METHOD node_move .
msg_init( ) .

DATA:
lv_id_parent_old TYPE snode-id ,
lv_id_source TYPE snode-id ,
lv_id_target TYPE snode-id ,
ls_form_prop_source TYPE ty_s_properties .

*------ prepare
lv_id_source = iv_id_source .
lv_id_target = iv_id_target .
lv_id_parent_old = node_get_parent( lv_id_source ) .
CHECK lv_id_parent_old NE lv_id_target .

*------ check the new location via component type


ls_form_prop_source = node_get_properties( lv_id_source ) .

is_comptype_allowed( iv_id = lv_id_target


iv_child_type = ls_form_prop_source-comp_type ) .
CHECK v_retcode NE c_retcode-error .

*------ the move process


CALL FUNCTION 'RS_TREE_SET_CURRENT_TREE'
TABLES
nodeinfo = t_hierarchy.

CALL FUNCTION 'RS_TREE_MOVE'


EXPORTING
destination = lv_id_target
move_id = lv_id_source
relationship = stree_reltype_baby "stree_reltype_child
EXCEPTIONS
destination_not_found = 1
source_not_found = 2
OTHERS = 3.
IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t005 INTO v_dummy . " text: Requested node was
not found in the structure
msg_syst_catch( ) .
ENDIF .
CHECK v_retcode NE c_retcode-error .

CALL FUNCTION 'RS_TREE_GET_CURRENT_TREE'


TABLES
nodeinfo = t_hierarchy.

*------ checks
check_subtree( lv_id_target ) .
deactivate( ) .
ENDMETHOD . "node_move
METHOD node_move_sibling_up .
msg_init( ) .

DATA:
lv_id_parent TYPE snode-id ,
ls_hierarchy TYPE ty_s_hierarchy ,
ls_hier_prec TYPE ty_s_hierarchy .

*------ prepare
lv_id_parent = node_get_parent( iv_id ) .

READ TABLE t_hierarchy INTO ls_hierarchy WITH KEY id = iv_id .


IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t041 INTO v_dummy . " text: Moving of the
component is impossible
msg_syst_catch( ) .
ENDIF .
CHECK v_retcode NE c_retcode-error .

READ TABLE t_hierarchy INTO ls_hier_prec


WITH KEY next = ls_hierarchy-id
tlevel = ls_hierarchy-tlevel .
IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t041 INTO v_dummy . " text: Moving of the
component is impossible
msg_syst_catch( ) .
ENDIF .
CHECK v_retcode NE c_retcode-error .

*------ the move process


CALL FUNCTION 'RS_TREE_SET_CURRENT_TREE'
TABLES
nodeinfo = t_hierarchy.

CALL FUNCTION 'RS_TREE_MOVE'


EXPORTING
destination = ls_hierarchy-id
move_id = ls_hier_prec-id
relationship = stree_reltype_next
EXCEPTIONS
destination_not_found = 1
source_not_found = 2
OTHERS = 3.
IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t041 INTO v_dummy . " text: Moving of the
component is impossible
msg_syst_catch( ) .
ENDIF .
CHECK v_retcode NE c_retcode-error .

CALL FUNCTION 'RS_TREE_GET_CURRENT_TREE'


TABLES
nodeinfo = t_hierarchy.

*------ checks
check_subtree( lv_id_parent ) .
deactivate( ) .
ENDMETHOD . "node_move_sibling_up
METHOD node_move_sibling_down .
msg_init( ) .

DATA:
lv_id_parent TYPE snode-id ,
ls_hierarchy TYPE ty_s_hierarchy .

*------ prepare
lv_id_parent = node_get_parent( iv_id ) .
READ TABLE t_hierarchy INTO ls_hierarchy WITH KEY id = iv_id .
IF sy-subrc NE 0
OR ls_hierarchy-next IS INITIAL .
MESSAGE e000(lp) WITH v_text-t041 INTO v_dummy . " text: Moving of the
component is impossible
msg_syst_catch( ) .
ENDIF .
CHECK v_retcode NE c_retcode-error .

*------ the move process


CALL FUNCTION 'RS_TREE_SET_CURRENT_TREE'
TABLES
nodeinfo = t_hierarchy.

CALL FUNCTION 'RS_TREE_MOVE'


EXPORTING
destination = ls_hierarchy-next
move_id = ls_hierarchy-id
relationship = stree_reltype_next
EXCEPTIONS
destination_not_found = 1
source_not_found = 2
OTHERS = 3.
IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t041 INTO v_dummy . " text: Moving of the
component is impossible
msg_syst_catch( ) .
ENDIF .
CHECK v_retcode NE c_retcode-error .

CALL FUNCTION 'RS_TREE_GET_CURRENT_TREE'


TABLES
nodeinfo = t_hierarchy.

*------ checks
check_subtree( lv_id_parent ) .
deactivate( ) .
ENDMETHOD . "node_move_sibling_down
METHOD node_set_properties .
msg_init( ) .

FIELD-SYMBOLS <properties> TYPE ty_s_properties .

READ TABLE t_properties ASSIGNING <properties>


WITH KEY id = cs_properties-id .
IF sy-subrc NE 0 .
MESSAGE e000(lp) WITH v_text-t005 INTO v_dummy . " text: Requested node was
not found in the structure
msg_syst_catch( ) .
ENDIF .
CHECK v_retcode NE c_retcode-error .

<properties> = cs_properties .

check_subtree( cs_properties-id ) .
deactivate( ) .
READ TABLE t_properties INTO cs_properties
WITH KEY id = cs_properties-id .
ENDMETHOD . "node_set_properties
METHOD get_retmess_icon .
msg_init( ) .

IF iv_id EQ v_root_id .
IF v_active IS INITIAL .
rv_retmess_icon = icon_space .
ELSE .
rv_retmess_icon = icon_activate .
ENDIF .
EXIT .
ENDIF .

CASE node_get_retcode_severity( iv_id ) .


WHEN c_retcode-okey. rv_retmess_icon = icon_led_green .
WHEN c_retcode-warning. rv_retmess_icon = icon_led_yellow .
WHEN c_retcode-legacy. rv_retmess_icon = icon_negative .
WHEN c_retcode-error. rv_retmess_icon = icon_led_red .
ENDCASE .
ENDMETHOD . "get_retmess_icon
METHOD set_formname_new .
IF abap_on EQ enq_check( iv_formname ) .
msg_syst_catch( ) .
EXIT .
ENDIF .

enq_lock( iv_formname ) .
v_formname = iv_formname .
v_devclass = get_devclass( iv_formname = iv_formname ) .

v_created_uname = sy-uname .
v_created_datum = sy-datum .
CLEAR: v_changed_uname ,
v_changed_datum .
ENDMETHOD . "set_formname_new
METHOD set_formdescr_new .
msg_init( ) .

v_formdescr = iv_formdescr .

FIELD-SYMBOLS <properties> TYPE ty_s_properties .


READ TABLE t_properties ASSIGNING <properties> WITH KEY id = v_root_id .
IF sy-subrc EQ 0 .
<properties>-comp_descr = iv_formdescr .
ENDIF .

check_subtree( ) .

ENDMETHOD . "set_formdescr_new
METHOD node_clone .
msg_init( ) .

DATA:
ls_prop_sample TYPE ty_s_properties ,
ls_hier_sample TYPE ty_s_hierarchy ,
ls_prop_clone TYPE ty_s_properties ,
lv_id_target_sibling TYPE ty_s_properties-id ,
lv_id_target_parent TYPE ty_s_properties-id .

ls_prop_sample = node_get_properties( iv_id_sample ) .


CHECK v_retcode NE c_retcode-error .

IF ls_prop_sample-comp_type EQ c_comp_type-root .
MESSAGE e000(lp) WITH v_text-t104 INTO v_dummy . " text: Function has not
been processed
msg_syst_catch( ) .
ENDIF .
CHECK v_retcode NE c_retcode-error .

READ TABLE t_hierarchy INTO ls_hier_sample WITH KEY id = iv_id_sample .


IF sy-subrc NE 0 .
EXIT .
ENDIF .

lv_id_target_parent = iv_id_target_parent .
IF iv_id_target_parent EQ node_get_parent( iv_id_sample ) .
lv_id_target_sibling = iv_id_sample .
ENDIF .

* add node
ls_prop_clone = ls_prop_sample .

IF iv_rename_find IS NOT INITIAL .


REPLACE ALL OCCURRENCES OF iv_rename_find IN ls_prop_clone-comp_name WITH
iv_rename_replacement .
ENDIF .
IF iv_rename_prefix IS NOT INITIAL .
CONCATENATE iv_rename_prefix ls_prop_clone-comp_name INTO ls_prop_clone-
comp_name .
ENDIF .
IF iv_rename_postfix IS NOT INITIAL .
CONCATENATE ls_prop_clone-comp_name iv_rename_postfix INTO ls_prop_clone-
comp_name .
ENDIF .

node_add( EXPORTING iv_comp_type = ls_prop_clone-comp_type


iv_comp_name = ls_prop_clone-comp_name
iv_comp_descr = ls_prop_clone-comp_descr
iv_parent_id = lv_id_target_parent
iv_sibling_id = lv_id_target_sibling
RECEIVING rv_new_id = ls_prop_clone-id ) .
CHECK v_retcode NE c_retcode-error .

rv_id_clone = ls_prop_clone-id .

node_set_properties( CHANGING cs_properties = ls_prop_clone ) .

* recursive process of subnodes


node_clone_recurs( EXPORTING is_hier_sample_parent = ls_hier_sample
iv_id_clone_parent = rv_id_clone
iv_rename_prefix = iv_rename_prefix
iv_rename_postfix = iv_rename_postfix
iv_rename_find = iv_rename_find
iv_rename_replacement = iv_rename_replacement ) .

check_subtree( lv_id_target_parent ) .
ENDMETHOD . "node_clone
METHOD node_clone_recurs .

DATA:
ls_hier_sample TYPE ty_s_hierarchy ,
ls_prop_sample TYPE ty_s_properties ,
ls_prop_clone TYPE ty_s_properties ,
lv_id_sample TYPE snode-id .

lv_id_sample = is_hier_sample_parent-child .

DO .
CLEAR ls_hier_sample .
CLEAR ls_prop_sample .
CLEAR ls_prop_clone .

* read a next node


READ TABLE t_hierarchy INTO ls_hier_sample
WITH KEY parent = is_hier_sample_parent-id
id = lv_id_sample .
IF sy-subrc NE 0 .
EXIT .
ENDIF .

READ TABLE t_properties INTO ls_prop_sample


WITH KEY id = lv_id_sample .
CHECK sy-subrc EQ 0 .

* copy node
ls_prop_clone = ls_prop_sample .

IF iv_rename_find IS NOT INITIAL .


REPLACE ALL OCCURRENCES OF iv_rename_find IN ls_prop_clone-comp_name WITH
iv_rename_replacement .
ENDIF .
IF iv_rename_prefix IS NOT INITIAL .
CONCATENATE iv_rename_prefix ls_prop_clone-comp_name INTO ls_prop_clone-
comp_name .
ENDIF .
IF iv_rename_postfix IS NOT INITIAL .
CONCATENATE ls_prop_clone-comp_name iv_rename_postfix INTO ls_prop_clone-
comp_name .
ENDIF .

node_add( EXPORTING iv_comp_type = ls_prop_clone-comp_type


iv_comp_name = ls_prop_clone-comp_name
iv_comp_descr = ls_prop_clone-comp_descr
iv_parent_id = iv_id_clone_parent
RECEIVING rv_new_id = ls_prop_clone-id ) .
CHECK v_retcode NE c_retcode-error .

node_set_properties( CHANGING cs_properties = ls_prop_clone ) .

IF ls_hier_sample-child IS NOT INITIAL .


* recursive process
node_clone_recurs( EXPORTING is_hier_sample_parent = ls_hier_sample
iv_id_clone_parent = ls_prop_clone-id ) .
ENDIF .
IF ls_hier_sample-next IS INITIAL .
EXIT .
ELSE .
lv_id_sample = ls_hier_sample-next .
ENDIF .
ENDDO .

ENDMETHOD . "node_clone_recurs
METHOD is_component_subnode_of .
DATA lv_form_id_current TYPE ty_s_hierarchy-id .
DATA ls_hierarchy TYPE ty_s_hierarchy .

rv_yes = abap_off .
lv_form_id_current = iv_form_id_checked .
DO .
IF lv_form_id_current EQ iv_form_id .
rv_yes = abap_on .
RETURN .
ENDIF .
CLEAR ls_hierarchy .
READ TABLE t_hierarchy INTO ls_hierarchy
WITH KEY id = lv_form_id_current .
IF ls_hierarchy-parent IS INITIAL .
RETURN .
ENDIF .
lv_form_id_current = ls_hierarchy-parent .
ENDDO .
ENDMETHOD . "is_component_subnode_of
METHOD autostructure_create .

DATA:
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
ls_form_hier TYPE lcl_form=>ty_s_hierarchy ,
ls_form_prop TYPE lcl_form=>ty_s_properties ,
ls_sheets TYPE lcl_exceltemplate=>ty_s_sheets .

*------------ try to find a worksheet node


READ TABLE t_properties INTO ls_form_prop
WITH KEY comp_type = lcl_form=>c_comp_type-sheet .
IF sy-subrc NE 0 . " worksheet is not found

*------------ add worksheet node into the form buffer


ls_form_prop-comp_type = lcl_form=>c_comp_type-sheet .
ls_form_prop-comp_name = 'SHEET' .

ls_form_prop-id = node_add( iv_comp_type = ls_form_prop-comp_type


iv_comp_name = ls_form_prop-comp_name
iv_comp_descr = ls_form_prop-comp_descr
iv_parent_id = v_root_id ) .
CHECK v_retcode NE c_retcode-error .

READ TABLE r_exceltemplate->s_model-t_sheets INTO ls_sheets INDEX 1 .


IF sy-subrc EQ 0 .
ls_form_prop-tb_sheetname = ls_sheets-name .

node_set_properties( CHANGING cs_properties = ls_form_prop ) .


CHECK v_retcode NE c_retcode-error .
ENDIF .
ENDIF .
*------------ recursive add child nodes
ls_ctxt_prop-id = r_context->v_root_id .

autostructure_recurs( EXPORTING is_altern_form_prop = ls_form_prop


is_parent_form_prop = ls_form_prop
is_parent_ctxt_prop = ls_ctxt_prop
iv_parent_level = 1
iv_parent_cb_fullpath = space ) .

*------------ delete patterns without sub-values


LOOP AT t_properties INTO ls_form_prop WHERE comp_type = lcl_form=>c_comp_type-
pattern .
READ TABLE t_hierarchy INTO ls_form_hier WITH KEY id = ls_form_prop-id .
CHECK sy-subrc EQ 0 .
CHECK ls_form_hier-child IS INITIAL .
node_del( ls_form_prop-id ) .
ENDLOOP .

ENDMETHOD . "autostructure_create
METHOD autostructure_recurs .
DATA:
ls_ctxt_hier TYPE lcl_context=>ty_s_hierarchy ,
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
ls_form_prop TYPE lcl_form=>ty_s_properties ,
ls_form_prop_altern TYPE lcl_form=>ty_s_properties ,
lv_offset TYPE i ,
lv_level TYPE i ,
lv_cb_fullpath TYPE ty_comp_path .

lv_level = iv_parent_level + 1 .

LOOP AT r_context->t_hierarchy INTO ls_ctxt_hier


WHERE parent EQ is_parent_ctxt_prop-id .

ls_ctxt_prop = r_context->node_get( ls_ctxt_hier-id ) .


CHECK r_context->v_retcode NE c_retcode-error .

CLEAR ls_form_prop .
ls_form_prop-comp_name = ls_ctxt_prop-comp_name .
ls_form_prop-comp_descr = ls_ctxt_prop-comp_shortdescr .

CASE ls_ctxt_prop-comp_type .
WHEN lcl_context=>c_comp_type-table .
ls_form_prop-comp_type = lcl_form=>c_comp_type-loopstep .
ls_form_prop-id =
node_add( iv_comp_type = ls_form_prop-comp_type
iv_comp_name = ls_form_prop-comp_name
iv_comp_descr = ls_form_prop-comp_descr
iv_parent_id = is_altern_form_prop-id ) .
CHECK v_retcode NE c_retcode-error .

ls_form_prop = node_get_properties( iv_id = ls_form_prop-id ) .


CHECK v_retcode NE c_retcode-error .

lv_offset = STRLEN( iv_parent_cb_fullpath ) .


ls_form_prop-cb_relpath = ls_ctxt_prop-comp_fullpath+lv_offset .
SHIFT ls_form_prop-cb_relpath LEFT DELETING LEADING '-' .
node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK v_retcode NE c_retcode-error .

lv_cb_fullpath = ls_ctxt_prop-comp_fullpath .
ls_form_prop_altern = ls_form_prop .

WHEN lcl_context=>c_comp_type-struct .
ls_form_prop-comp_type = lcl_form=>c_comp_type-pattern .
ls_form_prop-id =
node_add( iv_comp_type = ls_form_prop-comp_type
iv_comp_name = ls_form_prop-comp_name
iv_comp_descr = ls_form_prop-comp_descr
iv_parent_id = is_altern_form_prop-id ) .
CHECK v_retcode NE c_retcode-error .

lv_cb_fullpath = iv_parent_cb_fullpath .
ls_form_prop_altern = is_altern_form_prop .

WHEN lcl_context=>c_comp_type-element .
CASE ls_ctxt_prop-type_kind .
WHEN cl_abap_datadescr=>typekind_xstring .
ls_form_prop-comp_type = lcl_form=>c_comp_type-drawing .
WHEN OTHERS .
ls_form_prop-comp_type = lcl_form=>c_comp_type-field .
ENDCASE .
ls_form_prop-id =
node_add( iv_comp_type = ls_form_prop-comp_type
iv_comp_name = ls_form_prop-comp_name
iv_comp_descr = ls_form_prop-comp_descr
iv_parent_id = is_parent_form_prop-id ) .
CHECK v_retcode NE c_retcode-error .

ls_form_prop = node_get_properties( iv_id = ls_form_prop-id ) .


CHECK v_retcode NE c_retcode-error .

lv_offset = STRLEN( iv_parent_cb_fullpath ) .


ls_form_prop-cb_val_relpath = ls_ctxt_prop-comp_fullpath+lv_offset .
SHIFT ls_form_prop-cb_val_relpath LEFT DELETING LEADING '-' .

node_set_properties( CHANGING cs_properties = ls_form_prop ) .


CHECK v_retcode NE c_retcode-error .

lv_cb_fullpath = ls_ctxt_prop-comp_fullpath .
ls_form_prop_altern = is_altern_form_prop .

WHEN lcl_context=>c_comp_type-tree
OR lcl_context=>c_comp_type-tree_s .
ls_form_prop-comp_type = lcl_form=>c_comp_type-tree .
ls_form_prop-id =
node_add( iv_comp_type = ls_form_prop-comp_type
iv_comp_name = ls_form_prop-comp_name
iv_comp_descr = ls_form_prop-comp_descr
iv_parent_id = is_altern_form_prop-id ) .
CHECK v_retcode NE c_retcode-error .

ls_form_prop = node_get_properties( iv_id = ls_form_prop-id ) .


CHECK v_retcode NE c_retcode-error .

lv_offset = STRLEN( iv_parent_cb_fullpath ) .


ls_form_prop-cb_val_relpath = ls_ctxt_prop-comp_fullpath+lv_offset .
SHIFT ls_form_prop-cb_val_relpath LEFT DELETING LEADING '-' .

node_set_properties( CHANGING cs_properties = ls_form_prop ) .


CHECK v_retcode NE c_retcode-error .

lv_cb_fullpath = ls_ctxt_prop-comp_fullpath .
ls_form_prop_altern = is_altern_form_prop .

WHEN OTHERS . CONTINUE .


ENDCASE .

autostructure_recurs( EXPORTING is_altern_form_prop = ls_form_prop_altern


is_parent_form_prop = ls_form_prop
is_parent_ctxt_prop = ls_ctxt_prop
iv_parent_level = lv_level
iv_parent_cb_fullpath = lv_cb_fullpath ) .
ENDLOOP .
ENDMETHOD . "autostructure_recurs
ENDCLASS . "lcl_formtemplate IMPLEMENTATION

*----------------------------------------------------------------------*
* CLASS lcl_wb_formtree_drgdrpdata DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_wb_formtree_drgdrpdata DEFINITION .
PUBLIC SECTION.
DATA:
v_source_alvtree_nkey TYPE tv_nodekey ,
v_source_form_id TYPE snode-id ,
v_target_alvtree_nkey TYPE tv_nodekey ,
v_target_form_id TYPE snode-id ,
v_terminated TYPE flag ,
r_formtemplate TYPE REF TO lcl_formtemplate .

ENDCLASS . "lcl_wb_formtree_drgdrpdata DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_wb_appltoolbar DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_wb_appltoolbar DEFINITION INHERITING FROM lcl_root .
PUBLIC SECTION .
DATA:
r_container TYPE REF TO cl_gui_gos_container ,
r_toolbar TYPE REF TO cl_gui_toolbar .
CONSTANTS:
BEGIN OF c_fcode ,
appl_help TYPE ui_func VALUE 'APPL_HELP' ,
appl_presets_designtime TYPE ui_func VALUE 'APPL_PRESETS_DT' ,
appl_presets_runtime TYPE ui_func VALUE 'APPL_PRESETS_RT' ,
appl_save TYPE ui_func VALUE 'APPL_SAVE' ,
appl_save_as TYPE ui_func VALUE 'APPL_SAVE_AS' ,
appl_activate TYPE ui_func VALUE 'APPL_ACTIVATE' ,
appl_actualize TYPE ui_func VALUE 'APPL_ACTUALIZE' ,
appl_viewmode TYPE ui_func VALUE 'APPL_VIEWMODE' ,
appl_mass_processing TYPE ui_func VALUE 'APPL_MASS_PROCESSING' ,
END OF c_fcode .
EVENTS:
evnt_fcode
EXPORTING value(ev_fcode) TYPE ui_func .
METHODS:
constructor
IMPORTING iv_mass_processing TYPE flag DEFAULT space ,
free ,
hndl_toolbar_fcode
FOR EVENT function_selected OF cl_gui_toolbar
IMPORTING fcode .

ENDCLASS . "lcl_wb_appltoolbar DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_wb_appltoolbar IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_wb_appltoolbar IMPLEMENTATION .
METHOD constructor .
super->constructor( ) .

DATA:
lv_repid TYPE syrepid ,
lv_dynnr TYPE sydynnr ,
lv_text TYPE text100 ,
lv_icon TYPE icon-id ,
ls_events TYPE cntl_simple_event ,
lt_events TYPE cntl_simple_events .

lv_repid = sy-repid .
lv_dynnr = sy-dynnr .

CREATE OBJECT r_container


EXPORTING
width = 300 "450
repid = lv_repid
dynnr = lv_dynnr
* no_autodef_progid_dynnr = abap_on
EXCEPTIONS
OTHERS = 5.
CHECK sy-subrc = 0 .

CREATE OBJECT r_toolbar


EXPORTING
parent = r_container.

lv_text = v_text-t207 . " text: User guide


r_toolbar->add_button( fcode = c_fcode-appl_help
icon = icon_information "icon_personal_help
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .

lv_text = v_text-t206 . " text: Presets


r_toolbar->add_button( fcode = c_fcode-appl_presets_designtime
icon = icon_tools
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .

r_toolbar->add_button( fcode = space


icon = space
butn_type = cntb_btype_sep
quickinfo = space ) .

lv_text = v_text-t042 . " text: Window mode


r_toolbar->add_button( fcode = c_fcode-appl_viewmode
icon = icon_wd_interface_views
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .

lv_text = v_text-t043 . " text: Actualize


r_toolbar->add_button( fcode = c_fcode-appl_actualize
icon = icon_refresh
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .

r_toolbar->add_button( fcode = space


icon = space
butn_type = cntb_btype_sep
quickinfo = space ) .

lv_text = v_text-t044 . " text: Save


r_toolbar->add_button( fcode = c_fcode-appl_save
icon = icon_system_save
butn_type = cntb_btype_dropdown
quickinfo = lv_text(30) ) .

DATA lr_button_menu TYPE REF TO cl_ctmenu .


CREATE OBJECT lr_button_menu.

lv_text = v_text-t045 . " text: Save as...


lr_button_menu->add_function(
fcode = c_fcode-appl_save_as
icon = icon_save_as_template
text = lv_text(40) ) .
r_toolbar->set_static_ctxmenu(
fcode = c_fcode-appl_save
ctxmenu = lr_button_menu ) .

lv_text = v_text-t046 . " text: Activate


r_toolbar->add_button( fcode = c_fcode-appl_activate
icon = icon_activate
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) . " text: Activate

ls_events-eventid = cl_gui_toolbar=>m_id_function_selected .
APPEND ls_events TO lt_events .

r_toolbar->add_button( fcode = space


icon = space
butn_type = cntb_btype_sep
quickinfo = space ) .

CASE iv_mass_processing .
WHEN space . lv_icon = icon_segmented_data_ina .
WHEN OTHERS. lv_icon = icon_segmented_data_act .
ENDCASE .
lv_text = v_text-t214 . " text: Mass processing
r_toolbar->add_button( fcode = c_fcode-appl_mass_processing
icon = lv_icon
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .
r_toolbar->set_registered_events( events = lt_events ) .
SET HANDLER hndl_toolbar_fcode FOR r_toolbar .

ENDMETHOD . "constructor
METHOD free .
IF r_toolbar IS BOUND .
r_toolbar->free( ) .
FREE r_toolbar .
ENDIF .
IF r_container IS BOUND .
r_container->free( ) .
FREE r_container .
ENDIF .
ENDMETHOD . "free
METHOD hndl_toolbar_fcode .
RAISE EVENT evnt_fcode EXPORTING ev_fcode = fcode .
ENDMETHOD . "hndl_toolbar_fcode
ENDCLASS . "lcl_wb_appltoolbar IMPLEMENTATION

*----------------------------------------------------------------------*
* CLASS lcl_wb_excelole DEFINITION
*----------------------------------------------------------------------*
* MS-Office template document
*----------------------------------------------------------------------*
CLASS lcl_wb_ole DEFINITION INHERITING FROM lcl_ole .
PUBLIC SECTION .
METHODS:
constructor
IMPORTING ir_container TYPE REF TO cl_gui_container
iv_document_rawdata TYPE xstring
iv_viewmode TYPE flag
EXCEPTIONS process_terminated ,
selection_get
EXPORTING ev_sheet TYPE any
ev_name TYPE any
ev_area_top TYPE i
ev_area_left TYPE i
ev_area_rows TYPE i
ev_area_columns TYPE i ,
selection_set
IMPORTING iv_sheet TYPE any
iv_sheet_only TYPE flag OPTIONAL
iv_area_top TYPE i
iv_area_left TYPE i
iv_area_rows TYPE i
iv_area_columns TYPE i
RETURNING value(rv_sheet_not_found) TYPE flag ,
free REDEFINITION .

ENDCLASS . "lcl_wb_ole DEFINITION

*----------------------------------------------------------------------*
* CLASS lcl_wb_ole IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_wb_ole IMPLEMENTATION .
METHOD constructor .
super->constructor(
EXPORTING ir_container = ir_container
iv_document_rawdata = iv_document_rawdata
iv_viewmode = iv_viewmode
iv_readonly = abap_off
EXCEPTIONS OTHERS = 1 ) .
IF sy-subrc NE 0 .
RAISE process_terminated .
ENDIF .
ENDMETHOD . "constructor
METHOD selection_get .
msg_init( ) .

DATA ls_area TYPE soi_area_item .


DATA lt_areas TYPE soi_area_table .

application_availability_check( ) .
CHECK v_retcode NE c_retcode-error .

r_spreadsheet->get_selected_areas( IMPORTING areas = lt_areas ) .


DESCRIBE TABLE lt_areas .
CASE sy-tfill .
WHEN 0 .
MESSAGE e000(lp) WITH v_text-t051 INTO v_dummy . " text: Select an area on
the actual template sheet
msg_syst_catch( ) .

WHEN 1 .
READ TABLE lt_areas INTO ls_area INDEX 1 .
ev_area_left = ls_area-left .
ev_area_top = ls_area-top .
ev_area_rows = ls_area-rows .
ev_area_columns = ls_area-columns .

IF ev_area_left EQ 1
AND ev_area_top EQ 1
AND ev_area_rows EQ 1000
AND ev_area_columns EQ 1000 .
CLEAR:
ev_area_left ,
ev_area_top ,
ev_area_rows ,
ev_area_columns .

MESSAGE e000(lp) WITH v_text-t051 INTO v_dummy . " text: Select an area
on the actual template sheet
msg_syst_catch( ) .
EXIT .
ENDIF .

r_spreadsheet->get_active_sheet( IMPORTING sheetname = ev_sheet ) .

WHEN OTHERS .
MESSAGE e000(lp) WITH v_text-t052 INTO v_dummy . " text: Only single area
selection is required
msg_syst_catch( ) .
ENDCASE .
ENDMETHOD . "selection_get
METHOD selection_set .

DATA lt_sheets TYPE soi_sheets_table .


DATA lv_errorflag TYPE flag .
DATA lv_rc TYPE soi_ret_string .

CLEAR rv_sheet_not_found .

DO 1 TIMES .
IF iv_sheet IS INITIAL .
lv_errorflag = abap_on .
ENDIF .
CHECK lv_errorflag IS INITIAL .

r_spreadsheet->get_sheets(
IMPORTING sheets = lt_sheets
retcode = lv_rc ) .
READ TABLE lt_sheets TRANSPORTING NO FIELDS
WITH KEY sheet_name = iv_sheet .
IF sy-subrc NE 0 .
lv_errorflag = abap_on .
rv_sheet_not_found = abap_on .
ENDIF .
CHECK lv_errorflag IS INITIAL .

r_spreadsheet->select_sheet(
EXPORTING name = iv_sheet
IMPORTING retcode = lv_rc ) .
IF lv_rc NE 'OK' .
lv_errorflag = abap_on .
ENDIF .
CHECK lv_errorflag IS INITIAL .

IF iv_sheet_only IS NOT INITIAL .


r_spreadsheet->set_selection(
EXPORTING left = 1
top = 1
rows = 1000
columns = 1000 ) .
EXIT .
ENDIF .

IF iv_area_top IS INITIAL
AND iv_area_left IS INITIAL
AND iv_area_rows IS INITIAL
AND iv_area_columns IS INITIAL .
lv_errorflag = abap_on .
ENDIF .
CHECK lv_errorflag IS INITIAL .

r_spreadsheet->set_selection(
EXPORTING left = iv_area_left
top = iv_area_top
rows = iv_area_rows
columns = iv_area_columns
IMPORTING retcode = lv_rc ) .
IF lv_rc NE 'OK' .
lv_errorflag = abap_on .
ENDIF .
CHECK lv_errorflag IS INITIAL .
ENDDO .

CHECK lv_errorflag IS NOT INITIAL .


IF s_presets_dt-deselect_cells_no_tb IS NOT INITIAL .
r_spreadsheet->set_selection(
EXPORTING left = 1
top = 1
rows = 1000
columns = 1000 ) .
ENDIF .

CHECK s_presets_dt-mesgtab_when_error IS NOT INITIAL .


MESSAGE s000(lp) WITH v_text-t053 . " text: Positioning on the sheet is
impossible

ENDMETHOD . "selection_set
METHOD free .
super->free( ) .
ENDMETHOD . "free
ENDCLASS . "lcl_wb_ole IMPLEMENTATION

*----------------------------------------------------------------------*
* CLASS lcl_wb_formtree DEFINITION
*----------------------------------------------------------------------*
* tree for the form structure visualization
*----------------------------------------------------------------------*
CLASS lcl_wb_formtree DEFINITION INHERITING FROM cl_gui_alv_tree .
PUBLIC SECTION .
TYPES:
BEGIN OF ty_s_links ,
alvtree_nkey TYPE tv_nodekey ,
form_id TYPE snode-id ,
END OF ty_s_links ,
ty_t_links TYPE STANDARD TABLE OF ty_s_links .
TYPES:
BEGIN OF ty_s_outtab ,
retmess_icon TYPE icon_d ,
direction_icon TYPE icon_d ,
comp_descr TYPE ddtext ,
END OF ty_s_outtab ,
ty_t_outtab TYPE STANDARD TABLE OF ty_s_outtab .
DATA:
r_dgdp_source TYPE REF TO cl_dragdrop ,
r_dgdp_target TYPE REF TO cl_dragdrop ,
r_dgdp_full TYPE REF TO cl_dragdrop ,
r_dgdp_none TYPE REF TO cl_dragdrop ,
v_root_nkey TYPE lvc_nkey VALUE ' 1' ,
t_outtab TYPE ty_t_outtab ,
t_links TYPE ty_t_links .
CONSTANTS:
BEGIN OF c_fcode ,
comp_add_child TYPE ui_func VALUE 'COMP_ADD_CHILD' ,
comp_add_sibling TYPE ui_func VALUE 'COMP_ADD_SIBLING' ,
comp_clone TYPE ui_func VALUE 'COMP_CLONE' ,
comp_clone_mass TYPE ui_func VALUE 'COMP_CLONE_MASS' ,
comp_delete TYPE ui_func VALUE 'COMP_DELETE' ,
comp_delete_mass TYPE ui_func VALUE 'COMP_DELETE_MASS' ,
comp_selected TYPE ui_func VALUE 'COMP_SELECTED' ,
comp_move_sibling_up TYPE ui_func VALUE 'COMP_MOVE_SIBLING_UP' ,
comp_move_sibling_down TYPE ui_func VALUE 'COMP_MOVE_SIBLING_DOWN' ,
comp_select_all TYPE ui_func VALUE 'COMP_SELECT_ALL' ,
comp_tbshift_mass TYPE ui_func VALUE 'COMP_TBSHIFT_MASS' ,
appl_actualize TYPE ui_func VALUE 'APPL_ACTUALIZE' ,
END OF c_fcode .

METHODS:
constructor
IMPORTING ir_container TYPE REF TO cl_gui_container
ir_formtemplate TYPE REF TO lcl_formtemplate
iv_mass_processing TYPE flag DEFAULT space
EXCEPTIONS process_terminated ,
redraw
IMPORTING iv_form_id TYPE snode-id OPTIONAL
ir_formtemplate TYPE REF TO lcl_formtemplate ,
node_add
IMPORTING ir_formtemplate TYPE REF TO lcl_formtemplate
iv_form_id TYPE snode-id
iv_alvtree_nkey TYPE lvc_nkey
iv_sibling TYPE flag DEFAULT space
RETURNING value(rv_alvtree_nkey_new) TYPE lvc_nkey ,
node_del
IMPORTING iv_alvtree_nkey TYPE lvc_nkey ,
node_upd
IMPORTING ir_formtemplate TYPE REF TO lcl_formtemplate
iv_form_id TYPE snode-id
iv_alvtree_nkey TYPE lvc_nkey ,
node_prepare
IMPORTING ir_formtemplate TYPE REF TO lcl_formtemplate
iv_form_id TYPE snode-id
EXPORTING es_form_properties TYPE lcl_formtemplate=>ty_s_properties
es_outtab TYPE ty_s_outtab
es_layn TYPE lvc_s_layn
ev_ntext TYPE lvc_value .
EVENTS:
evnt_fcode
EXPORTING value(ev_fcode) TYPE ui_func
value(ev_form_id) TYPE snode-id ,
evnt_comp_move
EXPORTING value(ev_drag_drop_object) TYPE REF TO cl_dragdropobject .

PRIVATE SECTION .

METHODS:
hndl_toolbar_fcode
FOR EVENT function_selected OF cl_gui_toolbar
IMPORTING fcode ,
hndl_selection_changed
FOR EVENT selection_changed OF cl_gui_alv_tree
IMPORTING node_key ,
hndl_node_double_click
FOR EVENT node_double_click OF cl_gui_alv_tree
IMPORTING node_key ,
hndl_item_double_click
FOR EVENT item_double_click OF cl_gui_alv_tree
IMPORTING node_key fieldname ,
hndl_node_drag
FOR EVENT on_drag OF cl_gui_alv_tree
IMPORTING sender node_key drag_drop_object fieldname ,
hndl_node_drop
FOR EVENT on_drop OF cl_gui_alv_tree
IMPORTING sender node_key drag_drop_object ,
hndl_node_drop_complete
FOR EVENT on_drop_complete OF cl_gui_alv_tree
IMPORTING sender node_key fieldname drag_drop_object ,
hndl_node_context_menu_req
FOR EVENT node_context_menu_request OF cl_gui_alv_tree
IMPORTING node_key menu ,
hndl_node_context_menu_sel
FOR EVENT node_context_menu_selected OF cl_gui_alv_tree
IMPORTING node_key fcode ,
raise_component_selected
IMPORTING iv_alvtree_nkey TYPE lvc_nkey,
redraw_recurs
IMPORTING ir_formtemplate TYPE REF TO lcl_formtemplate
is_form_hier_parent TYPE lcl_formtemplate=>ty_s_hierarchy
OPTIONAL
iv_alvtree_nkey_parent TYPE lvc_nkey DEFAULT space .

ENDCLASS . "lcl_wb_formtree DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_wb_formtree IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_wb_formtree IMPLEMENTATION .
METHOD constructor .
DATA lv_node_selection_mode TYPE i .
CASE iv_mass_processing .
WHEN space . lv_node_selection_mode =
cl_gui_column_tree=>node_sel_mode_single .
WHEN OTHERS . lv_node_selection_mode =
cl_gui_column_tree=>node_sel_mode_multiple .
ENDCASE .

super->constructor(
EXPORTING parent = ir_container
node_selection_mode = lv_node_selection_mode
item_selection = abap_off
no_html_header = abap_on
no_toolbar = abap_off
EXCEPTIONS OTHERS = 7 ) .
IF sy-subrc NE 0 .
RAISE process_terminated .
ENDIF .

* hierarchy header
DATA ls_hdr TYPE treev_hhdr .
ls_hdr-heading =
ls_hdr-tooltip = lcl_root=>v_text-t055 . " text: Form structure
ls_hdr-t_image = icon_tree .
ls_hdr-width = 45 .
ls_hdr-width_pix = space .

* variant
DATA ls_var TYPE disvariant .
ls_var-report = sy-repid .
ls_var-handle = '0001' .
CALL FUNCTION 'LVC_VARIANT_DEFAULT_GET'
EXPORTING
i_save = space
CHANGING
cs_variant = ls_var
EXCEPTIONS
OTHERS = 0.

* fieldcatalog
DATA:
ls_fct TYPE lvc_s_fcat ,
lt_fct TYPE lvc_t_fcat .
CLEAR ls_fct .
ls_fct-fieldname = 'RETMESS_ICON' .
ls_fct-scrtext_s =
ls_fct-scrtext_l = ls_fct-scrtext_m =
ls_fct-reptext = ls_fct-coltext = lcl_root=>v_text-t056 . " text: Status
ls_fct-icon = abap_on .
APPEND ls_fct TO lt_fct .
CLEAR ls_fct .
ls_fct-fieldname = 'DIRECTION_ICON' .
ls_fct-scrtext_s =
ls_fct-scrtext_l = ls_fct-scrtext_m =
ls_fct-reptext = ls_fct-coltext = lcl_root=>v_text-t057 . " text: Direction
ls_fct-icon = abap_on .
APPEND ls_fct TO lt_fct .
CLEAR ls_fct .
ls_fct-fieldname = 'COMP_DESCR' .
ls_fct-scrtext_s =
ls_fct-scrtext_l = ls_fct-scrtext_m =
ls_fct-reptext = ls_fct-coltext = lcl_root=>v_text-t058 . " text:
Description
ls_fct-outputlen = 20 .
APPEND ls_fct TO lt_fct .

* initialization
me->set_table_for_first_display(
EXPORTING i_save = 'A'
is_hierarchy_header = ls_hdr
is_variant = ls_var
CHANGING it_fieldcatalog = lt_fct[]
it_outtab = t_outtab[] ) .

* tree events
IF iv_mass_processing IS INITIAL .
DATA:
ls_events TYPE cntl_simple_event ,
lt_events TYPE cntl_simple_events .
me->get_registered_events( IMPORTING events = lt_events ) .
* ls_events-eventid = cl_gui_column_tree=>eventid_node_double_click .
* APPEND ls_events TO lt_events .
* ls_events-eventid = cl_gui_column_tree=>eventid_item_double_click .
* APPEND ls_events TO lt_events .
ls_events-eventid = cl_gui_column_tree=>eventid_node_context_menu_req .
APPEND ls_events TO lt_events .
ls_events-eventid = cl_gui_column_tree=>eventid_selection_changed .
APPEND ls_events TO lt_events .
me->set_registered_events( events = lt_events ) .
ENDIF .

SET HANDLER:
hndl_selection_changed FOR me ,
hndl_node_double_click FOR me ,
hndl_item_double_click FOR me ,
hndl_node_drag FOR me ,
hndl_node_drop FOR me ,
hndl_node_drop_complete FOR me ,
hndl_node_context_menu_req FOR me ,
hndl_node_context_menu_sel FOR me .

* tree toolbar
DATA:
lr_toolbar TYPE REF TO cl_gui_toolbar ,
lv_text TYPE text100 .
FIELD-SYMBOLS <table_button> TYPE stb_button .
me->get_toolbar_object( IMPORTING er_toolbar = lr_toolbar ) .

LOOP AT lr_toolbar->m_table_button ASSIGNING <table_button>


WHERE function NE me->mc_fc_expand
AND function NE me->mc_fc_collapse
AND function NE me->mc_fc_load_variant .
lr_toolbar->delete_button( fcode = <table_button>-function ) .
ENDLOOP .
lr_toolbar->add_button( fcode = space
icon = space
butn_type = cntb_btype_sep
quickinfo = space ) .

CASE iv_mass_processing .
WHEN space .
lv_text = lcl_root=>v_text-t061 . " text: Delete component
lr_toolbar->add_button( fcode = c_fcode-comp_delete
icon = icon_delete
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .

lv_text = lcl_root=>v_text-t062 . " text: Create component


lr_toolbar->add_button( fcode = c_fcode-comp_add_child
icon = icon_create
butn_type = cntb_btype_dropdown
quickinfo = lv_text(30) ) .

DATA lr_button_menu TYPE REF TO cl_ctmenu .


CREATE OBJECT lr_button_menu.

CONCATENATE lcl_root=>v_text-t062 " text: Create component


lcl_root=>v_text-t296 " text: as Child
INTO lv_text SEPARATED BY space .
lr_button_menu->add_function(
fcode = c_fcode-comp_add_child
icon = icon_create
text = lv_text(40) ) .

CONCATENATE lcl_root=>v_text-t062 " text: Create component


lcl_root=>v_text-t297 " text: as Sibling
INTO lv_text SEPARATED BY space .
lr_button_menu->add_function(
fcode = c_fcode-comp_add_sibling
icon = icon_create
text = lv_text(40) ) .
lr_toolbar->set_static_ctxmenu(
fcode = c_fcode-comp_add_child
ctxmenu = lr_button_menu ) .

lv_text = lcl_root=>v_text-t172 . " text: Clone component


lr_toolbar->add_button( fcode = c_fcode-comp_clone
icon = icon_copy_object
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .

lr_toolbar->add_button( fcode = space


icon = space
butn_type = cntb_btype_sep
quickinfo = space ) .

lv_text = lcl_root=>v_text-t063 . " text: Move component UP


lr_toolbar->add_button( fcode = c_fcode-comp_move_sibling_up
icon = icon_next_value
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .

lv_text = lcl_root=>v_text-t064 . " text: Move component DOWN


lr_toolbar->add_button( fcode = c_fcode-comp_move_sibling_down
icon = icon_previous_value
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .
WHEN OTHERS .
lv_text = lcl_root=>v_text-t215 . " text: Select all components
lr_toolbar->add_button( fcode = c_fcode-comp_select_all
icon = icon_select_all
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .

lr_toolbar->add_button( fcode = space


icon = space
butn_type = cntb_btype_sep
quickinfo = space ) .

lv_text = lcl_root=>v_text-t061 . " text: Delete component


lr_toolbar->add_button( fcode = c_fcode-comp_delete_mass
icon = icon_delete
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .

lv_text = lcl_root=>v_text-t172 . " text: Clone component


lr_toolbar->add_button( fcode = c_fcode-comp_clone_mass
icon = icon_copy_object
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .

lv_text = lcl_root=>v_text-t220 . " text: Shift template binding


coordinates
lr_toolbar->add_button( fcode = c_fcode-comp_tbshift_mass
icon = icon_snap_to_grid
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .
ENDCASE .
* toolbar events
CLEAR:
ls_events ,
lt_events .
ls_events-eventid = cl_gui_toolbar=>m_id_function_selected .
APPEND ls_events TO lt_events .
lr_toolbar->set_registered_events( lt_events ) .
SET HANDLER hndl_toolbar_fcode FOR lr_toolbar .

* drag'n'drop objects (define any behaviours of node)


CREATE OBJECT r_dgdp_target .
r_dgdp_target->add( flavor = 'DRAGDROP'
dragsrc = abap_off
droptarget = abap_on
effect = cl_dragdrop=>move ) .

CREATE OBJECT r_dgdp_source.


r_dgdp_source->add( flavor = 'DRAGDROP'
dragsrc = abap_on
droptarget = abap_off
effect = cl_dragdrop=>move ) .

CREATE OBJECT r_dgdp_full.


r_dgdp_full->add( flavor = 'DRAGDROP'
dragsrc = abap_on
droptarget = abap_on
effect = cl_dragdrop=>move ) .

CREATE OBJECT r_dgdp_none.


r_dgdp_none->add( flavor = 'DRAGDROP'
dragsrc = abap_off
droptarget = abap_off
effect = cl_dragdrop=>move ) .

* add nodes
me->redraw( ir_formtemplate = ir_formtemplate ) .

* expand all nodes


DATA lt_subtree_nodes TYPE lvc_t_nkey .
me->get_subtree( EXPORTING i_node_key = v_root_nkey
IMPORTING et_subtree_nodes = lt_subtree_nodes ) .
IF LINES( lt_subtree_nodes ) GT 1 .
me->expand_node( EXPORTING i_node_key = v_root_nkey
i_level_count = 2
i_expand_subtree = abap_off
EXCEPTIONS OTHERS = 0 ) .
ENDIF .

ENDMETHOD. "constructor
METHOD redraw .
DATA ls_form_hier TYPE lcl_form=>ty_s_hierarchy .
IF iv_form_id IS INITIAL
OR iv_form_id EQ '000000'
OR iv_form_id EQ ir_formtemplate->v_root_id .
ls_form_hier-child = ir_formtemplate->v_root_id .
ELSE .
READ TABLE ir_formtemplate->t_hierarchy INTO ls_form_hier
WITH KEY id = iv_form_id .
ls_form_hier-id = ls_form_hier-parent .
ls_form_hier-child = iv_form_id .
ENDIF .

me->set_screen_update( i_update = space ) .

redraw_recurs( EXPORTING ir_formtemplate = ir_formtemplate


is_form_hier_parent = ls_form_hier ) .

me->set_screen_update( i_update = abap_on ) .


me->frontend_update( ) .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .
ENDMETHOD . "redraw
METHOD redraw_recurs .
DATA:
ls_links TYPE ty_s_links ,
lv_form_id_next TYPE snode-id .
FIELD-SYMBOLS:
<form_hier> TYPE lcl_form=>ty_s_hierarchy .

lv_form_id_next = is_form_hier_parent-child .
DO .
READ TABLE ir_formtemplate->t_hierarchy ASSIGNING <form_hier>
WITH KEY parent = is_form_hier_parent-id
id = lv_form_id_next .
IF sy-subrc NE 0 .
EXIT .
ENDIF .

READ TABLE t_links INTO ls_links WITH KEY form_id = <form_hier>-id .


CASE sy-subrc .
WHEN 0 .
node_upd( ir_formtemplate = ir_formtemplate
iv_form_id = ls_links-form_id
iv_alvtree_nkey = ls_links-alvtree_nkey ) .
WHEN OTHERS .
CLEAR ls_links .
ls_links-form_id = <form_hier>-id .
ls_links-alvtree_nkey =
node_add( ir_formtemplate = ir_formtemplate
iv_form_id = <form_hier>-id
iv_alvtree_nkey = iv_alvtree_nkey_parent ) .
ENDCASE .

IF <form_hier>-child IS NOT INITIAL .


redraw_recurs( ir_formtemplate = ir_formtemplate
iv_alvtree_nkey_parent = ls_links-alvtree_nkey
is_form_hier_parent = <form_hier> ) .
ENDIF .

IF <form_hier>-next IS INITIAL .
EXIT .
ELSE .
lv_form_id_next = <form_hier>-next .
ENDIF .
ENDDO .
ENDMETHOD . "redraw_recurs
METHOD node_prepare .
DATA ls_hierarchy TYPE lcl_form=>ty_s_hierarchy .
DATA ls_comp_types TYPE lcl_form=>ty_s_comp_types .
DATA lv_dragdropid TYPE i .

CLEAR es_form_properties .
CLEAR es_outtab .
CLEAR es_layn .
CLEAR ev_ntext .

es_form_properties = ir_formtemplate->node_get_properties( iv_form_id ) .


CHECK ir_formtemplate->v_retcode NE ir_formtemplate->c_retcode-error .

READ TABLE ir_formtemplate->t_hierarchy INTO ls_hierarchy


WITH KEY id = iv_form_id .
CHECK sy-subrc EQ 0 .

* node layout
READ TABLE ir_formtemplate->t_comp_types INTO ls_comp_types
WITH KEY comp_type = es_form_properties-comp_type
BINARY SEARCH .
IF sy-subrc EQ 0 .
es_layn-n_image = es_layn-exp_image = ls_comp_types-icon .
ENDIF .

CASE es_form_properties-comp_type .
WHEN ir_formtemplate->c_comp_type-sheet
OR ir_formtemplate->c_comp_type-loopstep
OR ir_formtemplate->c_comp_type-pattern
OR ir_formtemplate->c_comp_type-respattern
OR ir_formtemplate->c_comp_type-folder .
r_dgdp_full->get_handle( IMPORTING handle = lv_dragdropid ) .
WHEN ir_formtemplate->c_comp_type-field
OR ir_formtemplate->c_comp_type-drawing
OR ir_formtemplate->c_comp_type-chart
OR ir_formtemplate->c_comp_type-tree
OR ir_formtemplate->c_comp_type-grid .
r_dgdp_source->get_handle( IMPORTING handle = lv_dragdropid ) .
WHEN ir_formtemplate->c_comp_type-root .
r_dgdp_target->get_handle( IMPORTING handle = lv_dragdropid ) .
WHEN OTHERS .
r_dgdp_none->get_handle( IMPORTING handle = lv_dragdropid ) .
ENDCASE .
es_layn-dragdropid = lv_dragdropid .

IF ls_hierarchy-child IS NOT INITIAL .


es_layn-expander = abap_on .
ENDIF .

* node text
ev_ntext = es_form_properties-comp_name .

* outtab
es_outtab-comp_descr = es_form_properties-comp_descr .

CASE es_form_properties-draft_subtree .
WHEN ir_formtemplate->c_draft_subtree-yes . es_outtab-retmess_icon =
icon_delete_template .
WHEN ir_formtemplate->c_draft_subtree-legacy . es_outtab-retmess_icon =
icon_dummy .
WHEN OTHERS . es_outtab-retmess_icon = ir_formtemplate-
>get_retmess_icon( iv_form_id ) .
ENDCASE .

CASE es_form_properties-comp_type .
WHEN ir_formtemplate->c_comp_type-pattern
OR ir_formtemplate->c_comp_type-respattern
OR ir_formtemplate->c_comp_type-folder
OR ir_formtemplate->c_comp_type-tree
OR ir_formtemplate->c_comp_type-grid .
CASE es_form_properties-tb_direction .
WHEN ir_formtemplate->c_tb_direction-left2right .
es_outtab-direction_icon = icon_trend_unchanged .
WHEN ir_formtemplate->c_tb_direction-up2down .
es_outtab-direction_icon = icon_trend_down .
WHEN OTHERS .
es_outtab-direction_icon = space .
ENDCASE .
WHEN OTHERS .
es_outtab-direction_icon = space .
ENDCASE .

ENDMETHOD. "node_prepare
METHOD node_add .
DATA:
ls_form_properties TYPE lcl_formtemplate=>ty_s_properties ,
ls_outtab TYPE ty_s_outtab ,
ls_layn TYPE lvc_s_layn ,
lv_ntext TYPE lvc_value ,
ls_links TYPE ty_s_links ,
lv_relationship LIKE cl_gui_column_tree=>relat_next_sibling .

node_prepare(
EXPORTING ir_formtemplate = ir_formtemplate
iv_form_id = iv_form_id
IMPORTING es_form_properties = ls_form_properties
es_outtab = ls_outtab
es_layn = ls_layn
ev_ntext = lv_ntext ) .
CASE iv_sibling .
WHEN space . lv_relationship = cl_gui_column_tree=>relat_last_child .
WHEN OTHERS . lv_relationship = cl_gui_column_tree=>relat_next_sibling .
ENDCASE .

me->add_node(
EXPORTING i_relat_node_key = iv_alvtree_nkey
i_relationship = lv_relationship
i_node_text = lv_ntext
is_outtab_line = ls_outtab
is_node_layout = ls_layn
IMPORTING e_new_node_key = rv_alvtree_nkey_new ) .

IF ls_form_properties-id EQ ir_formtemplate->v_root_id .
v_root_nkey = rv_alvtree_nkey_new .
ENDIF .

ls_links-form_id = iv_form_id .
ls_links-alvtree_nkey = rv_alvtree_nkey_new .
APPEND ls_links TO t_links .

ENDMETHOD . " node_add


METHOD node_del .
DATA:
ls_subtree TYPE lvc_s_nkey ,
lt_subtree TYPE lvc_t_nkey .

me->get_subtree( EXPORTING i_node_key = iv_alvtree_nkey


IMPORTING et_subtree_nodes = lt_subtree ) .
LOOP AT lt_subtree INTO ls_subtree .
DELETE t_links WHERE alvtree_nkey EQ ls_subtree-node_key .
ENDLOOP .
DELETE t_links WHERE alvtree_nkey EQ iv_alvtree_nkey .

me->delete_subtree( i_node_key = iv_alvtree_nkey ) .


ENDMETHOD . "node_del
METHOD node_upd .

DATA:
ls_outtab TYPE ty_s_outtab ,
ls_layn TYPE lvc_s_layn ,
lv_ntext TYPE lvc_value ,
ls_outtab_old TYPE ty_s_outtab ,
lv_ntext_old TYPE lvc_value ,
ls_layn_old TYPE lvc_s_layn ,
ls_lacn TYPE lvc_s_lacn ,
lv_ntext_flag TYPE flag .

* get old values


me->get_outtab_line(
EXPORTING i_node_key = iv_alvtree_nkey
IMPORTING e_outtab_line = ls_outtab_old
e_node_text = lv_ntext_old
es_node_layout = ls_layn_old ) .

* prepare new values


node_prepare(
EXPORTING ir_formtemplate = ir_formtemplate
iv_form_id = iv_form_id
IMPORTING es_outtab = ls_outtab
es_layn = ls_layn
ev_ntext = lv_ntext ) .

* prepare values for update


IF ls_layn-n_image NE ls_layn_old-n_image .
ls_lacn-n_image = ls_layn-n_image .
ls_lacn-u_n_image = abap_on .
ENDIF .
IF ls_layn-exp_image NE ls_layn_old-exp_image .
ls_lacn-exp_image = ls_layn-exp_image .
ls_lacn-u_exp_imag = abap_on .
ENDIF .
IF ls_layn-dragdropid NE ls_layn_old-dragdropid .
ls_lacn-dragdropid = ls_layn-dragdropid .
ls_lacn-u_dragdrop = abap_on .
ENDIF .
* IF ls_layn-isfolder NE ls_layn_old-isfolder .
* ls_lacn-isfolder = ls_layn-isfolder .
* ls_lacn-u_isfolder = abap_on .
* ENDIF .
IF ls_layn-expander NE ls_layn_old-expander .
ls_lacn-expander = ls_layn-expander .
ls_lacn-u_expander = abap_on .
ENDIF .
IF lv_ntext NE lv_ntext_old .
lv_ntext_flag = abap_on .
ENDIF .

* update node (if required)


CHECK ls_outtab NE ls_outtab_old
OR ls_lacn IS NOT INITIAL
OR lv_ntext_flag IS NOT INITIAL .

me->change_node(
EXPORTING i_node_key = iv_alvtree_nkey
i_outtab_line = ls_outtab
is_node_layout = ls_lacn
i_node_text = lv_ntext
i_u_node_text = lv_ntext_flag ) .

ENDMETHOD . "node_upd
METHOD hndl_toolbar_fcode .
DATA:
lv_node_key TYPE lvc_nkey ,
lt_node_key TYPE lvc_t_nkey ,
ls_links TYPE ty_s_links .

* ------------- process function: Select all


CASE fcode .
WHEN c_fcode-comp_select_all .
LOOP AT t_links INTO ls_links .
lv_node_key = ls_links-alvtree_nkey .
INSERT lv_node_key INTO TABLE lt_node_key .
ENDLOOP .
me->set_selected_nodes( EXPORTING it_selected_nodes = lt_node_key
EXCEPTIONS OTHERS = 0 ) .
EXIT .
ENDCASE .

* ------------- process other functions


me->get_selected_item( IMPORTING e_selected_node = lv_node_key
EXCEPTIONS OTHERS = 0 ) .
IF lv_node_key IS INITIAL .
me->get_selected_nodes( CHANGING ct_selected_nodes = lt_node_key
EXCEPTIONS OTHERS = 0 ).
READ TABLE lt_node_key INTO lv_node_key INDEX 1 .
ENDIF .
IF lv_node_key IS INITIAL .
MESSAGE s000(lp) WITH lcl_root=>v_text-t066 . " text: Select the node
EXIT .
ENDIF .

READ TABLE t_links INTO ls_links WITH KEY alvtree_nkey = lv_node_key .


CHECK sy-subrc EQ 0 .

RAISE EVENT evnt_fcode


EXPORTING ev_fcode = fcode
ev_form_id = ls_links-form_id .

ENDMETHOD . "hndl_toolbar_fcode
METHOD hndl_selection_changed .
raise_component_selected( node_key ) .
ENDMETHOD . "hndl_selection_changed
METHOD hndl_node_double_click .
raise_component_selected( node_key ) .
ENDMETHOD . "hndl_node_double_click
METHOD hndl_item_double_click .
raise_component_selected( node_key ) .
ENDMETHOD . "hndl_item_double_click
METHOD hndl_node_drag .
DATA lr_dragdrop_data TYPE REF TO lcl_wb_formtree_drgdrpdata .
FIELD-SYMBOLS <links> TYPE ty_s_links .

READ TABLE t_links ASSIGNING <links> WITH KEY alvtree_nkey = node_key .


CHECK sy-subrc EQ 0 .

CREATE OBJECT lr_dragdrop_data .


lr_dragdrop_data->v_source_alvtree_nkey = <links>-alvtree_nkey .
lr_dragdrop_data->v_source_form_id = <links>-form_id .
drag_drop_object->object = lr_dragdrop_data .
ENDMETHOD . "hndl_node_drag
METHOD hndl_node_drop .
DATA lr_dragdrop_data TYPE REF TO lcl_wb_formtree_drgdrpdata .
FIELD-SYMBOLS <links> TYPE ty_s_links .

READ TABLE t_links ASSIGNING <links> WITH KEY alvtree_nkey = node_key .


CHECK sy-subrc EQ 0 .

CATCH SYSTEM-EXCEPTIONS move_cast_error = 1 .


lr_dragdrop_data ?= drag_drop_object->object .
lr_dragdrop_data->v_target_alvtree_nkey = <links>-alvtree_nkey .
lr_dragdrop_data->v_target_form_id = <links>-form_id .
drag_drop_object->object = lr_dragdrop_data .
ENDCATCH .

CHECK sy-subrc NE 0 .
drag_drop_object->abort( ) .
ENDMETHOD . "hndl_node_drop
METHOD hndl_node_drop_complete .
DATA lr_dragdrop_data TYPE REF TO lcl_wb_formtree_drgdrpdata .

CATCH SYSTEM-EXCEPTIONS move_cast_error = 1 .


lr_dragdrop_data ?= drag_drop_object->object .
ENDCATCH .
CHECK sy-subrc EQ 0 .

RAISE EVENT evnt_comp_move


EXPORTING ev_drag_drop_object = drag_drop_object .

CHECK lr_dragdrop_data->v_terminated IS INITIAL .

* set on an Expander option in the target node of AlvTree


DATA:
ls_outtab TYPE ty_s_outtab ,
ls_layn TYPE lvc_s_layn ,
ls_lacn TYPE lvc_s_lacn .
me->get_outtab_line(
EXPORTING i_node_key = lr_dragdrop_data->v_target_alvtree_nkey
IMPORTING e_outtab_line = ls_outtab
es_node_layout = ls_layn ) .
IF ls_layn-isfolder IS INITIAL .
ls_lacn-isfolder = ls_lacn-u_isfolder = abap_on .
me->change_node(
EXPORTING i_node_key = lr_dragdrop_data->v_target_alvtree_nkey
i_outtab_line = ls_outtab
is_node_layout = ls_lacn ) .
me->frontend_update( ) .
ENDIF .

* move subtree
move_node(
EXPORTING i_node_key = lr_dragdrop_data->v_source_alvtree_nkey
i_relatkey = lr_dragdrop_data->v_target_alvtree_nkey
i_relatship = cl_gui_column_tree=>relat_last_child
EXCEPTIONS node_not_found = 1
relative_not_found = 2
OTHERS = 3 ) .
IF sy-subrc EQ 0 .
redraw( iv_form_id = lr_dragdrop_data->v_target_form_id
"lr_dragdrop_data->v_source_form_id
ir_formtemplate = lr_dragdrop_data->r_formtemplate ) .

expand_node( i_node_key = lr_dragdrop_data->v_target_alvtree_nkey ) .


ELSE .
RAISE EVENT evnt_fcode " hard redraw tree
EXPORTING ev_fcode = c_fcode-appl_actualize
ev_form_id = 0 .
ENDIF .

ENDMETHOD . "hndl_node_drop_complete
METHOD hndl_node_context_menu_req .
DATA lv_text TYPE gui_text .

lv_text = lcl_root=>v_text-t061 . " text: Delete component


menu->add_function( fcode = c_fcode-comp_delete
icon = icon_delete
text = lv_text ) .

CONCATENATE lcl_root=>v_text-t062 " text: Create component


lcl_root=>v_text-t296 " text: as Child
INTO lv_text SEPARATED BY space .
menu->add_function( fcode = c_fcode-comp_add_child
icon = icon_create
text = lv_text ) .

CONCATENATE lcl_root=>v_text-t062 " text: Create component


lcl_root=>v_text-t297 " text: as Sibling
INTO lv_text SEPARATED BY space .
menu->add_function( fcode = c_fcode-comp_add_sibling
icon = icon_create
text = lv_text ) .

lv_text = lcl_root=>v_text-t172 . " text: Clone component


menu->add_function( fcode = c_fcode-comp_clone
icon = icon_copy_object
text = lv_text ) .

lv_text = lcl_root=>v_text-t063 . " text: Move component UP


menu->add_function( fcode = c_fcode-comp_move_sibling_up
icon = icon_next_value
text = lv_text ) .

lv_text = lcl_root=>v_text-t064 . " text: Move component DOWN


menu->add_function( fcode = c_fcode-comp_move_sibling_down
icon = icon_previous_value
text = lv_text ) .
ENDMETHOD . "hndl_node_context_menu_req
METHOD hndl_node_context_menu_sel .
hndl_toolbar_fcode( fcode = fcode ) .
ENDMETHOD . "hndl_node_context_menu_sel
METHOD raise_component_selected .
DATA ls_links TYPE ty_s_links .
READ TABLE t_links INTO ls_links WITH KEY alvtree_nkey = iv_alvtree_nkey .
CHECK sy-subrc EQ 0 .

RAISE EVENT evnt_fcode


EXPORTING ev_fcode = c_fcode-comp_selected
ev_form_id = ls_links-form_id .
ENDMETHOD . "raise_component_selected
ENDCLASS . "lcl_wb_formtree IMPLEMENTATION

*----------------------------------------------------------------------*
* CLASS lcl_wb_protab DEFINITION
*----------------------------------------------------------------------*
* tab bar of the properties
*----------------------------------------------------------------------*
CLASS lcl_wb_protab DEFINITION INHERITING FROM lcl_root .

PUBLIC SECTION .
DATA:
* ----------- general
v_form_id TYPE snode-id ,
v_formdescr TYPE string ,
v_devclass TYPE tadir-devclass ,
v_extension TYPE ty_char10 ,
v_created_uname TYPE syuname ,
v_created_datum TYPE sydatum ,
v_changed_uname TYPE syuname ,
v_changed_datum TYPE sydatum ,
v_contextname TYPE string ,
v_contextshortdescr TYPE string ,
s_comp_types TYPE ty_s_comp_types ,
v_dummy_text TYPE string ,
* ----------- tabs appearance
v_rt_show TYPE flag ,
v_cm_show TYPE flag ,
v_pr_show TYPE flag ,
v_ms_show TYPE flag ,
v_dm_show TYPE flag ,
* ----------- comp.properties
s_form_prop TYPE lcl_form=>ty_s_properties ,
v_tb_printtitles_r_name TYPE ty_comp_name ,
v_tb_printtitles_c_name TYPE ty_comp_name ,
v_dataset_name TYPE ty_char100 ,
v_valvld_for1_dataset_name TYPE ty_char100 ,
v_valvld_for1_dataset_field TYPE ty_char100 ,
* ----------- messages
t_ms_retmess TYPE bapiret2_t ,
v_ms_logh TYPE balloghndl ,
v_ms_cnth TYPE balcnthndl .

METHODS:
constructor
IMPORTING ir_container TYPE REF TO cl_gui_container ,
free,
redraw
IMPORTING ir_formtemplate TYPE REF TO lcl_formtemplate
iv_form_id TYPE snode-id OPTIONAL
iv_activetab_id TYPE i OPTIONAL ,
redraw_dummy
IMPORTING iv_text TYPE any OPTIONAL
iv_icon TYPE icon-id OPTIONAL .
CONSTANTS:
BEGIN OF c_tab_id ,
root TYPE i VALUE 1 ,
common TYPE i VALUE 2 ,
adjustments TYPE i VALUE 3 ,
messages TYPE i VALUE 4 ,
dummy TYPE i VALUE 5 ,
END OF c_tab_id .
CONSTANTS:
BEGIN OF c_fcode ,
context_change TYPE ui_func VALUE 'CONTEXT_CHANGE' ,
formdescr_change TYPE ui_func VALUE 'FORMDESCR_CHANGE' ,
format_change TYPE ui_func VALUE 'FORMAT_CHANGE' ,
compname_change TYPE ui_func VALUE 'COMPNAME_CHANGE' ,
cb_relpath_change_f4 TYPE ui_func VALUE 'CB_RELPATH_CHANGE_F4' ,
cb_relpath_change_mn TYPE ui_func VALUE 'CB_RELPATH_CHANGE_MN' ,
cb_relpath_delete TYPE ui_func VALUE 'CB_RELPATH_DELETE' ,
cb_aprpath_change_f4 TYPE ui_func VALUE 'CB_APRPATH_CHANGE_F4' ,
cb_aprpath_change_mn TYPE ui_func VALUE 'CB_APRPATH_CHANGE_MN' ,
cb_aprchar_change TYPE ui_func VALUE 'CB_APRCHAR_CHANGE' ,
cb_aprpath_delete TYPE ui_func VALUE 'CB_APRPATH_DELETE' ,
cb_cellrng_change_f4 TYPE ui_func VALUE 'CB_CELLRNG_CHANGE_F4' ,
cb_cellrng_change_mn TYPE ui_func VALUE 'CB_CELLRNG_CHANGE_MN' ,
cb_cellrng_change_char TYPE ui_func VALUE 'CB_CELLRNG_CHANGE_CHAR' ,
cb_cellrng_delete TYPE ui_func VALUE 'CB_CELLRNG_DELETE' ,
cb_valpath_change_f4 TYPE ui_func VALUE 'CB_VALPATH_CHANGE_F4' ,
cb_valpath_change_mn TYPE ui_func VALUE 'CB_VALPATH_CHANGE_MN' ,
cb_valpath_sub TYPE ui_func VALUE 'CB_VALPATH_SUB' ,
cb_valchar_change TYPE ui_func VALUE 'CB_VALCHAR_CHANGE' ,
cb_valpath_delete TYPE ui_func VALUE 'CB_VALPATH_DELETE' ,
cb_valconv_change TYPE ui_func VALUE 'CB_VALCONV_CHANGE' ,
cb_valvld_attrpath_change_f4 TYPE ui_func VALUE
'CB_VALVLD_ATTRPATH_CHANGE_F4' ,
cb_valvld_attrpath_change_mn TYPE ui_func VALUE
'CB_VALVLD_ATTRPATH_CHANGE_MN' ,
cb_valvld_attrpath_delete TYPE ui_func VALUE 'CB_VALVLD_ATTRPATH_DELETE
' ,

cb_valvld_for1_template TYPE ui_func VALUE


'CB_VALVLD_FOR1_TEMPLATE' ,
cb_valvld_for1_relpath TYPE ui_func VALUE 'CB_VALVLD_FOR1_RELPATH' ,
cb_valvld_for1_dataset_id TYPE ui_func VALUE
'CB_VALVLD_FOR1_DATASET_ID' ,
cb_valvld_for1_dataset_fld TYPE ui_func VALUE
'CB_VALVLD_FOR1_DATASET_FLD' ,
cb_valvld_for2_template TYPE ui_func VALUE
'CB_VALVLD_FOR2_TEMPLATE' ,
cb_valvld_for2_relpath TYPE ui_func VALUE 'CB_VALVLD_FOR2_RELPATH' ,

cb_loop_from_to TYPE ui_func VALUE 'CB_LOOP_FROM_TO' ,


tb_sheetname_change TYPE ui_func VALUE 'TB_SHEETNAME_CHANGE' ,
tb_sheetname_delete TYPE ui_func VALUE 'TB_SHEETNAME_DELETE' ,
tb_sheetstate TYPE ui_func VALUE 'TB_SHEETSTATE' ,
tb_sheetprot_change TYPE ui_func VALUE 'TB_SHEETPROT_CHANGE' ,
tb_sheetprot_delete TYPE ui_func VALUE 'TB_SHEETPROT_DELETE' ,
tb_sheetprotection_from_temp TYPE ui_func VALUE 'TB_SHEETPROT_FROM_TEMP' ,
tb_sheetprotection_from_cont TYPE ui_func VALUE 'TB_SHEETPROT_FROM_CONT' ,
tb_sheetprotection_static TYPE ui_func VALUE 'TB_SHEETPROT_STATIC' ,
tb_area_setcells TYPE ui_func VALUE 'TB_AREA_SETCELLS' ,
tb_area_settextmark TYPE ui_func VALUE 'TB_AREA_SETTEXTMARK' ,
tb_area_delete TYPE ui_func VALUE 'TB_AREA_DELETE' ,
tb_valstring_change TYPE ui_func VALUE 'TB_VALSTRING_CHANGE' ,
tb_valformula_change TYPE ui_func VALUE 'TB_VALFORMULA_CHANGE' ,
tb_valmatrix_change TYPE ui_func VALUE 'TB_VALMATRIX_CHANGE' ,
tb_direction_change TYPE ui_func VALUE 'TB_DIRECTION_CHANGE' ,
tb_rowprop_change TYPE ui_func VALUE 'TB_ROWPROP_CHANGE' ,
tb_colprop_change TYPE ui_func VALUE 'TB_COLPROP_CHANGE' ,
tb_rowgroup_change TYPE ui_func VALUE 'TB_ROWGROUP_CHANGE' ,
tb_colgroup_change TYPE ui_func VALUE 'TB_COLGROUP_CHANGE' ,
tb_rowgroup_clp_change TYPE ui_func VALUE 'TB_ROWGROUP_CLP_CHANGE' ,
tb_colgroup_clp_change TYPE ui_func VALUE 'TB_COLGROUP_CLP_CHANGE' ,
tb_drwstflag_change TYPE ui_func VALUE 'TB_DRWSTFLAG_CHANGE' ,
tb_drwstname_change TYPE ui_func VALUE 'TB_DRWSTNAME_CHANGE' ,
tb_drwstname_delete TYPE ui_func VALUE 'TB_DRWSTNAME_DELETE' ,
tb_drwsize_fit TYPE ui_func VALUE 'TB_DRWSIZE_FIT' ,
tb_drwsize_context TYPE ui_func VALUE 'TB_DRWSIZE_CONTEXT' ,
tb_drwsize_h_f4 TYPE ui_func VALUE 'TB_DRWSIZE_H_F4' ,
tb_drwsize_h_mn TYPE ui_func VALUE 'TB_DRWSIZE_H_MN' ,
tb_drwsize_w_f4 TYPE ui_func VALUE 'TB_DRWSIZE_W_F4' ,
tb_drwsize_w_mn TYPE ui_func VALUE 'TB_DRWSIZE_W_MN' ,
tb_pgbreak_left TYPE ui_func VALUE 'TB_PGBREAK_LEFT' ,
tb_pgbreak_top TYPE ui_func VALUE 'TB_PGBREAK_TOP' ,
tb_nopgbreak_left TYPE ui_func VALUE 'TB_NOPGBREAK_LEFT' ,
tb_nopgbreak_top TYPE ui_func VALUE 'TB_NOPGBREAK_TOP' ,
tb_printtitles_rows_change TYPE ui_func VALUE 'TB_PRINTTITLES_ROWS_CHANGE'
,
tb_printtitles_rows_delete TYPE ui_func VALUE 'TB_PRINTTITLES_ROWS_DELETE'
,
tb_printtitles_cols_change TYPE ui_func VALUE 'TB_PRINTTITLES_COLS_CHANGE'
,
tb_printtitles_cols_delete TYPE ui_func VALUE 'TB_PRINTTITLES_COLS_DELETE'
,
tb_mergecells_change TYPE ui_func VALUE 'TB_MERGECELLS_CHANGE' ,
tb_autofitmerged_off TYPE ui_func VALUE 'TB_AUTOFITMERGED_OFF' ,
tb_autofitmerged_r TYPE ui_func VALUE 'TB_AUTOFITMERGED_R' ,
tb_autofitmerged_c TYPE ui_func VALUE 'TB_AUTOFITMERGED_C' ,
tb_respattern_before TYPE ui_func VALUE 'TB_RESPATTERN_BEFORE' ,
tb_respattern_after TYPE ui_func VALUE 'TB_RESPATTERN_AFTER' ,
tree_layout_rotate TYPE ui_func VALUE 'TREE_LAYOUT_ROTATE' ,
tree_layout_exp_coll TYPE ui_func VALUE 'TREE_LAYOUT_EXP_COLL' ,
tree_layout_stru TYPE ui_func VALUE 'TREE_LAYOUT_STRU' ,
tree_layout_head TYPE ui_func VALUE 'TREE_LAYOUT_HEAD' ,
tree_layout_colhier TYPE ui_func VALUE 'TREE_LAYOUT_COLHIER' ,
tree_layout_colhier_after TYPE ui_func VALUE
'TREE_LAYOUT_COLHIER_AFTER' ,
tree_layout_colhier_shift TYPE ui_func VALUE
'TREE_LAYOUT_COLHIER_SHIFT' ,
tree_layout_colother TYPE ui_func VALUE 'TREE_LAYOUT_COLOTHER' ,
tree_layout_colother_wdh TYPE ui_func VALUE 'TREE_LAYOUT_COLOTHER_WDH' ,
tree_layout_allowformulas TYPE ui_func VALUE
'TREE_LAYOUT_ALLOWFORMULAS' ,
grid_layout_rotate TYPE ui_func VALUE 'GRID_LAYOUT_ROTATE' ,
grid_layout_head TYPE ui_func VALUE 'GRID_LAYOUT_HEAD' ,
grid_layout_head_titles TYPE ui_func VALUE 'GRID_LAYOUT_HEAD_TITLES' ,
grid_layout_allowformulas TYPE ui_func VALUE
'GRID_LAYOUT_ALLOWFORMULAS' ,
grid_fldseq TYPE ui_func VALUE 'GRID_FLDSEQ' ,
grid_fldprop TYPE ui_func VALUE 'GRID_FLDPROP' ,
chart_model_change TYPE ui_func VALUE 'CHART_MODEL_CHANGE' ,
chart_model_delete TYPE ui_func VALUE 'CHART_MODEL_DELETE' ,
chart_title TYPE ui_func VALUE 'CHART_TITLE' ,
chart_title_catax TYPE ui_func VALUE 'CHART_TITLE_CATAX' ,
chart_title_valax TYPE ui_func VALUE 'CHART_TITLE_VALAX' ,
chart_title_series TYPE ui_func VALUE 'CHART_TITLE_SERIES' ,
chart_dtset_change TYPE ui_func VALUE 'CHART_DTSET_CHANGE' ,
chart_dtset_delete TYPE ui_func VALUE 'CHART_DTSET_DELETE' ,
chart_dtset_series TYPE ui_func VALUE 'CHART_DTSET_SERIES' ,
draft_change TYPE ui_func VALUE 'DRAFT_CHANGE' ,
postproc_vbs_code TYPE ui_func VALUE 'POSTPROC_VBS_CODE' ,
postproc_vbs_tables TYPE ui_func VALUE 'POSTPROC_VBS_TABLES' ,
definednames_dont_remove TYPE ui_func VALUE 'DEFINEDNAMES_DONT_REMOVE' ,
END OF c_fcode .
EVENTS:
evnt_fcode
EXPORTING value(ev_fcode) TYPE ui_func
value(ev_form_id) TYPE snode-id .

PRIVATE SECTION .
DATA:
r_container TYPE REF TO cl_gui_container ,
r_container_bar TYPE REF TO cl_gui_container_bar_2 ,
r_menutree_rt TYPE REF TO cl_gui_list_tree ,
r_menutree_cm TYPE REF TO cl_gui_list_tree ,
r_menutree_pr TYPE REF TO cl_gui_list_tree .
CONSTANTS:
BEGIN OF c_nkey ,
cntxt TYPE tv_nodekey VALUE 'CNTXT' ,
cntxt_name TYPE tv_nodekey VALUE 'CNTXT_NAME' ,
formdescr TYPE tv_nodekey VALUE 'FORMDESCR' ,
formdescr_name TYPE tv_nodekey VALUE 'FORMDESCR_NM' ,
format TYPE tv_nodekey VALUE 'FORMAT' ,
format_line1 TYPE tv_nodekey VALUE 'FORMAT_LINE1' ,
postprocessing TYPE tv_nodekey VALUE 'POSTPROCESSING' ,
postproc_line1 TYPE tv_nodekey VALUE 'POSTPROC_LINE1' ,
techinfo TYPE tv_nodekey VALUE 'TECHINFO' ,
created TYPE tv_nodekey VALUE 'CREATED' ,
changed TYPE tv_nodekey VALUE 'CHANGED' ,
devclass TYPE tv_nodekey VALUE 'DEVCLASS' ,
relpath TYPE tv_nodekey VALUE 'RELPATH' ,
relpath_line1 TYPE tv_nodekey VALUE 'RELPATH_1' ,
relpath_line2 TYPE tv_nodekey VALUE 'RELPATH_2' ,
cellrng TYPE tv_nodekey VALUE 'CELLRNG' ,
cellrng_line1 TYPE tv_nodekey VALUE 'CELLRNG_1' ,
cellrng_line2 TYPE tv_nodekey VALUE 'CELLRNG_2' ,
cellrng_line3 TYPE tv_nodekey VALUE 'CELLRNG_3' ,
aprpath TYPE tv_nodekey VALUE 'APRPATH' ,
aprpath_line1 TYPE tv_nodekey VALUE 'APRPATH_1' ,
aprpath_line2 TYPE tv_nodekey VALUE 'APRPATH_2' ,
aprpath_line3 TYPE tv_nodekey VALUE 'APRPATH_3' ,
valpath TYPE tv_nodekey VALUE 'VALPATH' ,
valpath_line1 TYPE tv_nodekey VALUE 'VALPATH_1' ,
valpath_line2 TYPE tv_nodekey VALUE 'VALPATH_2' ,
valpath_line3 TYPE tv_nodekey VALUE 'VALPATH_3' ,
valpath_line4 TYPE tv_nodekey VALUE 'VALPATH_4' ,
vallayout TYPE tv_nodekey VALUE 'VALLAYOUT' ,
vallayout_line1 TYPE tv_nodekey VALUE 'VALLAYOUT_1' ,
vallayout_line2 TYPE tv_nodekey VALUE 'VALLAYOUT_2' ,
vallayout_line3 TYPE tv_nodekey VALUE 'VALLAYOUT_3' ,
vallayout_line31 TYPE tv_nodekey VALUE 'VALLAYOUT_31' ,
valvalid TYPE tv_nodekey VALUE 'VALIDAT' ,
valvalid_line1 TYPE tv_nodekey VALUE 'VALIDAT_1' ,
valvalid_line11 TYPE tv_nodekey VALUE 'VALIDAT_11' ,
valvalid_line12 TYPE tv_nodekey VALUE 'VALIDAT_12' ,
valvalid_line2 TYPE tv_nodekey VALUE 'VALIDAT_2' ,
valvalid_line21 TYPE tv_nodekey VALUE 'VALIDAT_21' ,
valvalid_line22 TYPE tv_nodekey VALUE 'VALIDAT_22' ,
valvalid_line23 TYPE tv_nodekey VALUE 'VALIDAT_23' ,
valvalid_line3 TYPE tv_nodekey VALUE 'VALIDAT_3' ,
valvalid_line31 TYPE tv_nodekey VALUE 'VALIDAT_31' ,
valvalid_line32 TYPE tv_nodekey VALUE 'VALIDAT_32' ,
valvalid_line33 TYPE tv_nodekey VALUE 'VALIDAT_33' ,
component TYPE tv_nodekey VALUE 'COMP' ,
component_line1 TYPE tv_nodekey VALUE 'COMP_1' ,
component_line2 TYPE tv_nodekey VALUE 'COMP_2' ,
sheet TYPE tv_nodekey VALUE 'SHEET' ,
sheet_line1 TYPE tv_nodekey VALUE 'SHEET_1' ,
area TYPE tv_nodekey VALUE 'AREA' ,
area_line1 TYPE tv_nodekey VALUE 'AREA_1' ,
direction TYPE tv_nodekey VALUE 'DIRECTION' ,
direction_line1 TYPE tv_nodekey VALUE 'DIRECTION_1' ,
colrow_prop TYPE tv_nodekey VALUE 'COLROW_PRP' ,
colrow_prop_line1 TYPE tv_nodekey VALUE 'COLROW_PRP_1' ,
colrow_grp TYPE tv_nodekey VALUE 'COLROW_GRP' ,
colrow_grp_line1 TYPE tv_nodekey VALUE 'COLROW_GRP_1' ,
drwstat TYPE tv_nodekey VALUE 'DRWSTAT' ,
drwstat_line1 TYPE tv_nodekey VALUE 'DRWSTAT_1' ,
drwstat_line2 TYPE tv_nodekey VALUE 'DRWSTAT_2' ,
drwsize TYPE tv_nodekey VALUE 'DRWSIZE' ,
drwsize_line1 TYPE tv_nodekey VALUE 'DRWSIZE_1' ,
drwsize_line2 TYPE tv_nodekey VALUE 'DRWSIZE_2' ,
drwsize_line3 TYPE tv_nodekey VALUE 'DRWSIZE_3' ,
chart_layout TYPE tv_nodekey VALUE 'CHARTLAYOUT' ,
chart_model TYPE tv_nodekey VALUE 'CHART_MDL' ,
chart_title TYPE tv_nodekey VALUE 'CHART_TITLE' ,
chart_title_catax TYPE tv_nodekey VALUE 'CHART_TLCATAX' ,
chart_title_valax TYPE tv_nodekey VALUE 'CHART_TLVALAX' ,
chart_title_ser TYPE tv_nodekey VALUE 'CHART_TLSER' ,
chart_dtset TYPE tv_nodekey VALUE 'CHART_DTS' ,
chart_dtset_1 TYPE tv_nodekey VALUE 'CHART_DTS_1' ,
chart_dtset_2 TYPE tv_nodekey VALUE 'CHART_DTS_2' ,
printtitles TYPE tv_nodekey VALUE 'PRINTTL' ,
printtitles_line1 TYPE tv_nodekey VALUE 'PRINTTL_1' ,
printtitles_line2 TYPE tv_nodekey VALUE 'PRINTTL_2' ,
sheetprot TYPE tv_nodekey VALUE 'SHEETPROT' ,
sheetprot_line1 TYPE tv_nodekey VALUE 'SHEETPROT_1' ,
sheetprot_line2 TYPE tv_nodekey VALUE 'SHEETPROT_2' ,
sheetprot_line3 TYPE tv_nodekey VALUE 'SHEETPROT_3' ,
sheetprot_line4 TYPE tv_nodekey VALUE 'SHEETPROT_4' ,
pgbrk TYPE tv_nodekey VALUE 'PGBRK' ,
pgbrk_line1 TYPE tv_nodekey VALUE 'PGBRK_1' ,
pgbrk_line2 TYPE tv_nodekey VALUE 'PGBRK_2' ,
nopgbrk TYPE tv_nodekey VALUE 'NOPGBRK' ,
nopgbrk_line1 TYPE tv_nodekey VALUE 'NOPGBRK_1' ,
nopgbrk_line2 TYPE tv_nodekey VALUE 'NOPGBRK_2' ,
mergecells TYPE tv_nodekey VALUE 'MRGCELLS' ,
mergecells_line1 TYPE tv_nodekey VALUE 'MRGCELLS_1' ,
mergecells_line2 TYPE tv_nodekey VALUE 'MRGCELLS_2' ,
autofitmrg TYPE tv_nodekey VALUE 'AUTOFITMRG' ,
autofitmrg_line1 TYPE tv_nodekey VALUE 'AUTOFITMRG_1' ,
treelayout TYPE tv_nodekey VALUE 'TREELAYOUT' ,
treelayout_line1 TYPE tv_nodekey VALUE 'TREELAYO_1' ,
treelayout_line2 TYPE tv_nodekey VALUE 'TREELAYO_2' ,
treelayout_line3 TYPE tv_nodekey VALUE 'TREELAYO_3' ,
treelayout_line4 TYPE tv_nodekey VALUE 'TREELAYO_4' ,
treelayout_line5 TYPE tv_nodekey VALUE 'TREELAYO_5' ,
treelayout_line6 TYPE tv_nodekey VALUE 'TREELAYO_6' ,
treelayout_line61 TYPE tv_nodekey VALUE 'TREELAYO_61' ,
treelayout_line62 TYPE tv_nodekey VALUE 'TREELAYO_62' ,
gridlayout TYPE tv_nodekey VALUE 'GRIDLAYOUT' ,
gridlayout_line1 TYPE tv_nodekey VALUE 'GRIDLAYO_1' ,
gridlayout_line2 TYPE tv_nodekey VALUE 'GRIDLAYO_2' ,
gridlayout_line3 TYPE tv_nodekey VALUE 'GRIDLAYO_3' ,
gridlayout_line4 TYPE tv_nodekey VALUE 'GRIDLAYO_4' ,
draft TYPE tv_nodekey VALUE 'DRAFT' ,
draft_line1 TYPE tv_nodekey VALUE 'DRAFT_1' ,
loop TYPE tv_nodekey VALUE 'LOOP' ,
loop_line1 TYPE tv_nodekey VALUE 'LOOP_1' ,
root_others TYPE tv_nodekey VALUE 'ROOT_OTH' ,
root_others_line1 TYPE tv_nodekey VALUE 'ROOT_OTH_1' ,
respatt_place TYPE tv_nodekey VALUE 'RPT_PLACE' ,
respatt_place_line1 TYPE tv_nodekey VALUE 'RPT_PLACE1' ,
END OF c_nkey .
METHODS:
hndl_tab_clicked
FOR EVENT clicked OF cl_gui_container_bar_2
IMPORTING id container name ,
hndl_button_click
FOR EVENT button_click OF cl_gui_list_tree
IMPORTING sender node_key item_name ,
redraw_tab_rt
IMPORTING ir_container TYPE REF TO cl_gui_container ,
redraw_tab_cm
IMPORTING ir_container TYPE REF TO cl_gui_container ,
redraw_tab_pr
IMPORTING ir_container TYPE REF TO cl_gui_container ,
redraw_tab_ms
IMPORTING ir_container TYPE REF TO cl_gui_container ,
redraw_tab_dm
IMPORTING ir_container TYPE REF TO cl_gui_container ,
redraw_menutree
IMPORTING it_nodes TYPE treev_ntab
it_items TYPE STANDARD TABLE
ir_container TYPE REF TO cl_gui_container
CHANGING cr_menutree TYPE REF TO cl_gui_list_tree ,
tab_block_context
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_format
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_postprocessing
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_root_others
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_techinfo
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_formdescr
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_component
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_loop
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_relpath
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_relpath_apr
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_relpath_cellrng
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_relpath_val
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_val_layout
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_val_validation
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_sheet_tb
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_printtitles
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_sheetprotection
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_pgbrk
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_draft
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_area
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_direction
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_mergecells
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_colrow_prop
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_colrow_group
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_autofitmerged
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_respattern_place
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_drwstat
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_drwsize
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_chart
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_tree_layout
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
tab_block_grid_layout
CHANGING ct_nodes TYPE treev_ntab
ct_items TYPE STANDARD TABLE ,
format_text1
IMPORTING iv_offset TYPE any
iv_match TYPE any
EXPORTING ev_text TYPE any .

ENDCLASS . "lcl_wb_protab DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_wb_protab IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_wb_protab IMPLEMENTATION .
METHOD constructor .
super->constructor( ) .

r_container = ir_container .

DATA:
ls_captions TYPE sbptcaptn ,
lt_captions TYPE sbptcaptns .

ls_captions-caption+2 = v_text-t067 . " text: Form properties


ls_captions-icon = icon_object_list .
ls_captions-no_close = abap_on .
ls_captions-invisible = abap_on .
ls_captions-name = 'ROOT' .
APPEND ls_captions TO lt_captions .
*
ls_captions-caption+2 = v_text-t068 . " text: Component.
ls_captions-icon = icon_tools .
ls_captions-no_close = abap_on .
ls_captions-invisible = abap_on .
ls_captions-name = 'COMMON' .
APPEND ls_captions TO lt_captions .
*
ls_captions-caption+2 = v_text-t069 . " text: Properties of the component
ls_captions-icon = icon_tools .
ls_captions-no_close = abap_on .
ls_captions-invisible = abap_on .
ls_captions-name = 'PROPERTIES' .
APPEND ls_captions TO lt_captions .
*
ls_captions-caption+2 = v_text-t070 . " text: Messages
ls_captions-icon = icon_error_protocol .
ls_captions-no_close = abap_on .
ls_captions-invisible = abap_on .
ls_captions-name = 'MESSAGES' .
APPEND ls_captions TO lt_captions .
*
ls_captions-caption = space .
ls_captions-icon = icon_tools .
ls_captions-no_close = abap_on .
ls_captions-invisible = abap_off .
ls_captions-name = 'DUMMY' .
APPEND ls_captions TO lt_captions .

CREATE OBJECT r_container_bar


EXPORTING
parent = r_container
captions = lt_captions
active_id = 1
style = cl_gui_container_bar_2=>c_style_fix
* style = cl_gui_container_bar_2=>c_style_outlook
close_buttons = space
EXCEPTIONS
OTHERS = 7.
IF sy-subrc NE 0 .
EXIT .
ENDIF .

SET HANDLER hndl_tab_clicked FOR r_container_bar .

ENDMETHOD . "constructor
METHOD free .
IF r_menutree_rt IS BOUND .
r_menutree_rt->free( ) .
FREE r_menutree_rt .
ENDIF.
IF r_menutree_cm IS BOUND .
r_menutree_cm->free( ) .
FREE r_menutree_cm .
ENDIF.
IF r_menutree_pr IS BOUND .
r_menutree_pr->free( ) .
FREE r_menutree_pr .
ENDIF.
IF r_container_bar IS BOUND .
r_container_bar->free( ) .
FREE r_container_bar .
ENDIF.
IF r_container IS BOUND .
r_container->free( ) .
FREE r_container .
ENDIF .
ENDMETHOD . "free
METHOD redraw_dummy .
v_rt_show = abap_off .
v_cm_show = abap_off .
v_pr_show = abap_off .
v_ms_show = abap_off .
v_dm_show = abap_on .

v_dummy_text = iv_text .

*------ make tabs visible or hidden


r_container_bar->set_cell_visible( id = c_tab_id-root visible =
v_rt_show ) .
r_container_bar->set_cell_visible( id = c_tab_id-common visible =
v_cm_show ) .
r_container_bar->set_cell_visible( id = c_tab_id-adjustments visible =
v_pr_show ) .
r_container_bar->set_cell_visible( id = c_tab_id-messages visible =
v_ms_show ) .
r_container_bar->set_cell_visible( id = c_tab_id-dummy visible =
v_dm_show ) .

*------ set dummy tab active


r_container_bar->set_active( id = c_tab_id-dummy ) .

*------ set icon


IF iv_icon IS NOT INITIAL .
DATA ls_caption TYPE sbptcaptn .
ls_caption-caption = space .
ls_caption-icon = iv_icon .
ls_caption-no_close = abap_on .
ls_caption-invisible = abap_on .
ls_caption-name = 'DUMMY' .
r_container_bar->set_cell_caption( id = c_tab_id-dummy
caption = ls_caption ) .
ENDIF .

ENDMETHOD . "redraw_dummy
METHOD redraw .

DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties ,
ls_form_excp TYPE lcl_form=>ty_s_exceptions ,
lv_sheet_compname TYPE ty_char100 ,
lv_sheet_compname_ds TYPE ty_char100 ,
ls_ms_retmess TYPE bapiret2 ,
lv_ms_error TYPE flag ,
ls_ctxt_prop_ds TYPE lcl_context=>ty_s_properties ,
lt_ctxt_prop_ds TYPE lcl_context=>ty_t_properties .

*------ retrieve a general data


CLEAR s_form_prop .
s_form_prop = ir_formtemplate->node_get_properties( iv_form_id ) .
ls_form_excp = ir_formtemplate->node_get_exceptions( iv_form_id ) .
CHECK ir_formtemplate->v_retcode NE c_retcode-error .

CLEAR s_comp_types .
READ TABLE ir_formtemplate->t_comp_types INTO s_comp_types
WITH KEY comp_type = s_form_prop-comp_type
BINARY SEARCH .

ir_formtemplate->node_get_protab_relevance(
EXPORTING is_properties = s_form_prop
IMPORTING ev_rt_show = v_rt_show
ev_cm_show = v_cm_show
ev_pr_show = v_pr_show
ev_ms_show = v_ms_show ) .
CHECK ir_formtemplate->v_retcode NE ir_formtemplate->c_retcode-error .

v_form_id = iv_form_id .
v_formdescr = ir_formtemplate->v_formdescr .
v_devclass = ir_formtemplate->v_devclass .
v_extension = ir_formtemplate->r_exceltemplate->v_extension .
v_created_uname = ir_formtemplate->v_created_uname .
v_created_datum = ir_formtemplate->v_created_datum .
v_changed_uname = ir_formtemplate->v_changed_uname .
v_changed_datum = ir_formtemplate->v_changed_datum .
v_contextname = ir_formtemplate->r_context->v_contextname .
v_contextshortdescr = ir_formtemplate->r_context->v_contextshortdescr .
t_ms_retmess = ls_form_excp-t_retmess .

LOOP AT t_ms_retmess INTO ls_ms_retmess WHERE type CA 'EAX' .


IF s_presets_dt-mesgtab_when_error IS INITIAL .
MESSAGE ID ls_ms_retmess-id
TYPE 'S'
NUMBER ls_ms_retmess-number
WITH ls_ms_retmess-message_v1
ls_ms_retmess-message_v2
ls_ms_retmess-message_v3
ls_ms_retmess-message_v4 DISPLAY LIKE 'E' .
ENDIF .

lv_ms_error = abap_on .
EXIT .
ENDLOOP .

" print titles


CLEAR v_tb_printtitles_r_name .
IF s_form_prop-tb_printtitles_r IS NOT INITIAL .
ls_form_prop = ir_formtemplate->node_get_properties( s_form_prop-
tb_printtitles_r ) .
IF ir_formtemplate->v_retcode NE c_retcode-error .
v_tb_printtitles_r_name = ls_form_prop-comp_name .
ENDIF .
ENDIF .

CLEAR v_tb_printtitles_c_name .
IF s_form_prop-tb_printtitles_c IS NOT INITIAL .
ls_form_prop = ir_formtemplate->node_get_properties( s_form_prop-
tb_printtitles_c ) .
IF ir_formtemplate->v_retcode NE c_retcode-error .
v_tb_printtitles_c_name = ls_form_prop-comp_name .
ENDIF .
ENDIF .

" dataset name


DO 1 TIMES .
CLEAR v_dataset_name .
CHECK s_form_prop-dataset_id IS NOT INITIAL .

CLEAR ls_form_prop .
ls_form_prop = ir_formtemplate->node_get_properties( s_form_prop-dataset_id )
.
v_dataset_name = ls_form_prop-comp_name .
CHECK ls_form_prop-id IS NOT INITIAL .

ir_formtemplate->node_get_legacy_info( EXPORTING iv_id = iv_form_id


IMPORTING ev_tb_sheet_compname =
lv_sheet_compname ) .

ir_formtemplate->node_get_legacy_info( EXPORTING iv_id = ls_form_prop-id


IMPORTING ev_tb_sheet_compname =
lv_sheet_compname_ds ) .
CHECK lv_sheet_compname_ds NE lv_sheet_compname .
CONCATENATE v_dataset_name '~('
v_text-t238 "text: On the sheet
':~' lv_sheet_compname_ds ')' INTO v_dataset_name .
TRANSLATE v_dataset_name USING '~ ' .
ENDDO .

" dataset and field name for data validation formula


DO 1 TIMES .
CLEAR v_valvld_for1_dataset_name .
CLEAR v_valvld_for1_dataset_field .

CHECK s_form_prop-cb_valvld_for1_dataset_id IS NOT INITIAL .

CLEAR ls_form_prop .
ls_form_prop = ir_formtemplate->node_get_properties( s_form_prop-
cb_valvld_for1_dataset_id ) .
v_valvld_for1_dataset_name = ls_form_prop-comp_name .

CHECK s_form_prop-cb_valvld_for1_dataset_fld IS NOT INITIAL .

ir_formtemplate->get_grid_fldseqprop(
EXPORTING iv_id = s_form_prop-cb_valvld_for1_dataset_id
IMPORTING et_ctxt_prop = lt_ctxt_prop_ds[] ).

READ TABLE lt_ctxt_prop_ds INTO ls_ctxt_prop_ds


WITH KEY comp_fullpath = s_form_prop-cb_valvld_for1_dataset_fld
comp_type = lcl_context=>c_comp_type-element .
CHECK sy-subrc EQ 0 .

v_valvld_for1_dataset_field = ls_ctxt_prop_ds-comp_name .
IF ls_ctxt_prop_ds-comp_shortdescr IS NOT INITIAL .
CONCATENATE v_valvld_for1_dataset_field ` (`
ls_ctxt_prop_ds-comp_shortdescr `)`
INTO v_valvld_for1_dataset_field .
ENDIF .
ENDDO .

*------ make changes (to provide redrawing)


r_container_bar->set_active( id = c_tab_id-dummy ) .

*------ set active tab


IF iv_activetab_id IS NOT INITIAL .
r_container_bar->set_active( id = iv_activetab_id ) .
ELSEIF lv_ms_error IS NOT INITIAL
AND s_presets_dt-mesgtab_when_error IS NOT INITIAL .
r_container_bar->set_active( id = c_tab_id-messages ) .
ELSE .
CASE abap_on .
WHEN v_rt_show. r_container_bar->set_active( id = c_tab_id-root ) .
WHEN v_pr_show. r_container_bar->set_active( id = c_tab_id-adjustments ) .
WHEN v_cm_show. r_container_bar->set_active( id = c_tab_id-common ) .
WHEN OTHERS .
ENDCASE .
ENDIF .

*------ make the tabs visible or hidden


r_container_bar->set_cell_visible( id = c_tab_id-root visible =
v_rt_show ) .
r_container_bar->set_cell_visible( id = c_tab_id-common visible =
v_cm_show ) .
r_container_bar->set_cell_visible( id = c_tab_id-adjustments visible =
v_pr_show ) .
r_container_bar->set_cell_visible( id = c_tab_id-messages visible =
v_ms_show ) .
IF v_rt_show IS NOT INITIAL
OR v_cm_show IS NOT INITIAL
OR v_pr_show IS NOT INITIAL
OR v_ms_show IS NOT INITIAL .
r_container_bar->set_cell_visible( id = c_tab_id-dummy visible =
abap_off ) .
ENDIF .

*------
IF v_cm_show IS NOT INITIAL .
DATA ls_caption TYPE sbptcaptn .
CONCATENATE '~~' s_form_prop-comp_name
'~~' s_form_prop-comp_descr INTO ls_caption-caption .
SET LOCALE LANGUAGE sy-langu .
TRANSLATE ls_caption-caption USING '~ ' .
ls_caption-icon = s_comp_types-icon .
ls_caption-no_close = abap_on .
ls_caption-invisible = abap_on .
ls_caption-name = 'COMMON' .
r_container_bar->set_cell_caption( id = c_tab_id-common caption = ls_caption
) .
ENDIF .
ENDMETHOD . "redraw
METHOD hndl_tab_clicked .
CASE id .
WHEN c_tab_id-root . redraw_tab_rt( container ) .
WHEN c_tab_id-common . redraw_tab_cm( container ) .
WHEN c_tab_id-adjustments . redraw_tab_pr( container ) .
WHEN c_tab_id-messages . redraw_tab_ms( container ) .
WHEN c_tab_id-dummy . redraw_tab_dm( container ) .
ENDCASE .
ENDMETHOD . "hndl_tab_clicked
METHOD redraw_tab_rt .
CHECK v_rt_show EQ abap_on .

DATA:
lt_nodes TYPE treev_ntab ,
lt_items TYPE STANDARD TABLE OF mtreeitm
WITH DEFAULT KEY .
tab_block_formdescr(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_context(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_format(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_postprocessing(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_root_others(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_techinfo(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

redraw_menutree(
EXPORTING it_nodes = lt_nodes
it_items = lt_items
ir_container = ir_container
CHANGING cr_menutree = r_menutree_rt ) .

ENDMETHOD . "redraw_tab_rt
METHOD redraw_tab_cm .
CHECK v_cm_show EQ abap_on .

DATA:
lt_nodes TYPE treev_ntab ,
lt_items TYPE STANDARD TABLE OF mtreeitm
WITH DEFAULT KEY .

tab_block_component( CHANGING ct_nodes = lt_nodes


ct_items = lt_items ) .
redraw_menutree( EXPORTING it_nodes = lt_nodes
it_items = lt_items
ir_container = ir_container
CHANGING cr_menutree = r_menutree_cm ) .

ENDMETHOD . "redraw_tab_cm
METHOD redraw_tab_pr .
CHECK v_pr_show EQ abap_on .

DATA:
lt_nodes TYPE treev_ntab,
lt_items TYPE STANDARD TABLE OF mtreeitm
WITH DEFAULT KEY .

CASE s_comp_types-comp_type .
WHEN lcl_form=>c_comp_type-sheet .
tab_block_sheet_tb(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_relpath_val(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_relpath_apr(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_printtitles(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_sheetprotection(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

WHEN lcl_form=>c_comp_type-folder .
tab_block_relpath(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_relpath_apr(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_direction(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_relpath_cellrng(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_colrow_group(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_pgbrk(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_draft(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

WHEN lcl_form=>c_comp_type-loopstep .
tab_block_relpath(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_loop(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

WHEN lcl_form=>c_comp_type-pattern .
tab_block_area(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_relpath_apr(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_direction(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_colrow_prop(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_autofitmerged(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

WHEN lcl_form=>c_comp_type-respattern .
tab_block_area(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_relpath_apr(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_direction(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_mergecells(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_respattern_place(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_colrow_prop(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_autofitmerged(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

WHEN lcl_form=>c_comp_type-field .
tab_block_area(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_relpath_val(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_val_layout(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_val_validation(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

WHEN lcl_form=>c_comp_type-drawing .
tab_block_area(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_drwsize(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_relpath_apr(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_drwstat(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

IF s_form_prop-tb_drwstat_flag IS INITIAL .
tab_block_relpath_val(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .
ENDIF .

WHEN lcl_form=>c_comp_type-chart .
tab_block_area(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_drwsize(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_relpath_apr(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .
tab_block_chart(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

WHEN lcl_form=>c_comp_type-tree .
tab_block_area(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_relpath_val(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_direction(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_tree_layout(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

WHEN lcl_form=>c_comp_type-grid .
tab_block_area(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_relpath_val(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_direction(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

tab_block_grid_layout(
CHANGING ct_nodes = lt_nodes
ct_items = lt_items ) .

WHEN OTHERS .
ENDCASE .

redraw_menutree( EXPORTING it_nodes = lt_nodes


it_items = lt_items
ir_container = ir_container
CHANGING cr_menutree = r_menutree_pr ) .
ENDMETHOD . "redraw_tab_pr
METHOD redraw_tab_ms .
CHECK v_ms_show EQ abap_on .

DATA:
lt_ms_logh TYPE bal_t_logh ,
ls_log TYPE bal_s_log ,
ls_msg TYPE bal_s_msg ,
ls_display_profile TYPE bal_s_prof ,
ls_retmess TYPE bapiret2 .

IF v_ms_logh IS INITIAL .
ls_log-extnumber = 'COMP_MESSAGES' .
CALL FUNCTION 'BAL_LOG_CREATE'
EXPORTING
i_s_log = ls_log
IMPORTING
e_log_handle = v_ms_logh
EXCEPTIONS
OTHERS = 1.
CHECK sy-subrc EQ 0 .
INSERT v_ms_logh INTO TABLE lt_ms_logh .

CALL FUNCTION 'BAL_DSP_PROFILE_NO_TREE_GET'


IMPORTING
e_s_display_profile = ls_display_profile.
ls_display_profile-no_toolbar = abap_on .

CALL FUNCTION 'BAL_CNTL_CREATE'


EXPORTING
i_container = ir_container
i_s_display_profile = ls_display_profile
i_t_log_handle = lt_ms_logh
IMPORTING
e_control_handle = v_ms_cnth
EXCEPTIONS
OTHERS = 0.
ENDIF .

IF lt_ms_logh[] IS INITIAL .
INSERT v_ms_logh INTO TABLE lt_ms_logh .
ENDIF .

CALL FUNCTION 'BAL_LOG_MSG_DELETE_ALL'


EXPORTING
i_log_handle = v_ms_logh
EXCEPTIONS
OTHERS = 0.

LOOP AT t_ms_retmess INTO ls_retmess .


CLEAR ls_msg .
ls_msg-msgty = ls_retmess-type .
ls_msg-msgid = ls_retmess-id .
ls_msg-msgno = ls_retmess-number .
ls_msg-msgv1 = ls_retmess-message_v1 .
ls_msg-msgv2 = ls_retmess-message_v2 .
ls_msg-msgv3 = ls_retmess-message_v3 .
ls_msg-msgv4 = ls_retmess-message_v4 .

CALL FUNCTION 'BAL_LOG_MSG_ADD'


EXPORTING
i_log_handle = v_ms_logh
i_s_msg = ls_msg
EXCEPTIONS
OTHERS = 0.
ENDLOOP .

CALL FUNCTION 'BAL_CNTL_REFRESH'


EXPORTING
i_control_handle = v_ms_cnth
i_t_log_handle = lt_ms_logh
EXCEPTIONS
OTHERS = 0.

ENDMETHOD . "redraw_tab_ms
METHOD redraw_tab_dm .
CHECK v_dm_show EQ abap_on .

DATA:
lr_html_document TYPE REF TO cl_dd_document ,
lv_text TYPE sdydo_text_element .

CREATE OBJECT lr_html_document .

lr_html_document->underline( ) .

lv_text = v_dummy_text .
lr_html_document->add_text( text = lv_text
sap_style = cl_dd_document=>heading ).
lr_html_document->underline( ) .
lr_html_document->merge_document( ) .
lr_html_document->display_document( parent = ir_container ) .
ENDMETHOD . "redraw_tab_dm
METHOD redraw_menutree .
DATA:
ls_events TYPE cntl_simple_event ,
lt_events TYPE cntl_simple_events ,
ls_node TYPE treev_node ,
lt_collapsed TYPE treev_nks .

IF cr_menutree IS NOT BOUND .


CREATE OBJECT cr_menutree
EXPORTING
parent = ir_container
node_selection_mode = cl_gui_list_tree=>node_sel_mode_single
item_selection = abap_on
with_headers = ' '
EXCEPTIONS
OTHERS = 6.
IF sy-subrc NE 0 .
MESSAGE i000(lp) WITH v_text-t072 . " text: Error Creating Control
EXIT .
ENDIF .

ls_events-eventid = cl_gui_list_tree=>eventid_button_click .
APPEND ls_events TO lt_events .
ls_events-eventid = cl_gui_list_tree=>eventid_checkbox_change .
APPEND ls_events TO lt_events .

cr_menutree->set_registered_events(
EXPORTING events = lt_events
EXCEPTIONS OTHERS = 3 ) .
IF sy-subrc NE 0 .
MESSAGE i000(lp) WITH v_text-t072 . " text: Error Creating Control
EXIT .
ENDIF .

SET HANDLER hndl_button_click FOR cr_menutree .


* SET HANDLER hndl_checkbox_change FOR cr_menutree .
ENDIF .
cr_menutree->delete_all_nodes( ) .

cr_menutree->add_nodes_and_items(
EXPORTING node_table = it_nodes
item_table = it_items
item_table_structure_name = 'MTREEITM'
EXCEPTIONS OTHERS = 7 ) .
IF sy-subrc NE 0 .
MESSAGE i000(lp) WITH v_text-t072 . " text: Error Creating Control
EXIT .
ENDIF .

cr_menutree->expand_root_nodes(
EXPORTING level_count = 10
expand_subtree = abap_on
EXCEPTIONS OTHERS = 0 ) .

LOOP AT it_nodes INTO ls_node WHERE expander IS NOT INITIAL .


COLLECT ls_node-node_key INTO lt_collapsed .
ENDLOOP .

IF lt_collapsed[] IS NOT INITIAL .


cr_menutree->collapse_nodes(
EXPORTING node_key_table = lt_collapsed
EXCEPTIONS OTHERS = 0 ) .
ENDIF .

ENDMETHOD . "redraw_menutree
METHOD hndl_button_click .
DATA lv_fcode TYPE ui_func .

* translate button click (in the tree of properties tab) to user command

CASE sender .
WHEN r_menutree_rt .
IF node_key EQ c_nkey-cntxt_name AND item_name EQ '1' .
lv_fcode = c_fcode-context_change .
ELSEIF node_key EQ c_nkey-formdescr_name AND item_name EQ '1' .
lv_fcode = c_fcode-formdescr_change .
ELSEIF node_key EQ c_nkey-format_line1 AND item_name EQ '1' .
lv_fcode = c_fcode-format_change .
ELSEIF node_key EQ c_nkey-postproc_line1 AND item_name EQ '1' .
lv_fcode = c_fcode-postproc_vbs_code .
ELSEIF node_key EQ c_nkey-postproc_line1 AND item_name EQ '2' .
lv_fcode = c_fcode-postproc_vbs_tables .
ELSEIF node_key EQ c_nkey-root_others_line1 AND item_name EQ '1' .
lv_fcode = c_fcode-definednames_dont_remove .
ENDIF .
WHEN r_menutree_cm .
IF node_key EQ c_nkey-component AND item_name EQ '1' .
lv_fcode = c_fcode-compname_change .
ENDIF .
WHEN r_menutree_pr .
IF node_key EQ c_nkey-relpath_line1 AND item_name EQ '1' .
lv_fcode = c_fcode-cb_relpath_change_f4 .
ELSEIF node_key EQ c_nkey-relpath_line1 AND item_name EQ '2' .
lv_fcode = c_fcode-cb_relpath_change_mn .
ELSEIF node_key EQ c_nkey-relpath_line1 AND item_name EQ '3' .
lv_fcode = c_fcode-cb_relpath_delete .

ELSEIF node_key EQ c_nkey-aprpath_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-cb_aprpath_change_f4 .
ELSEIF node_key EQ c_nkey-aprpath_line1 AND item_name EQ '2' .
lv_fcode = c_fcode-cb_aprpath_change_mn .
ELSEIF node_key EQ c_nkey-aprpath_line1 AND item_name EQ '3' .
lv_fcode = c_fcode-cb_aprpath_delete .
ELSEIF node_key EQ c_nkey-aprpath_line2 AND item_name EQ '1' .
lv_fcode = c_fcode-cb_aprchar_change .

ELSEIF node_key EQ c_nkey-cellrng_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-cb_cellrng_change_f4 .
ELSEIF node_key EQ c_nkey-cellrng_line1 AND item_name EQ '2' .
lv_fcode = c_fcode-cb_cellrng_change_mn .
ELSEIF node_key EQ c_nkey-cellrng_line1 AND item_name EQ '3' .
lv_fcode = c_fcode-cb_cellrng_delete .
ELSEIF node_key EQ c_nkey-cellrng_line2 AND item_name EQ '1' .
lv_fcode = c_fcode-cb_cellrng_change_char .

ELSEIF node_key EQ c_nkey-valpath_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-cb_valpath_change_f4 .
ELSEIF node_key EQ c_nkey-valpath_line1 AND item_name EQ '2' .
lv_fcode = c_fcode-cb_valpath_change_mn .
ELSEIF node_key EQ c_nkey-valpath_line1 AND item_name EQ '3' .
lv_fcode = c_fcode-cb_valpath_delete .
ELSEIF node_key EQ c_nkey-valpath_line2 AND item_name EQ '1' .
lv_fcode = c_fcode-cb_valpath_sub .
ELSEIF node_key EQ c_nkey-valpath_line3 AND item_name EQ '1' .
lv_fcode = c_fcode-cb_valchar_change .
ELSEIF node_key EQ c_nkey-valpath_line4 AND item_name EQ '1' .
lv_fcode = c_fcode-cb_valconv_change .

ELSEIF node_key EQ c_nkey-valvalid_line12 AND item_name EQ '1' .


lv_fcode = c_fcode-cb_valvld_attrpath_change_f4 .
ELSEIF node_key EQ c_nkey-valvalid_line12 AND item_name EQ '2' .
lv_fcode = c_fcode-cb_valvld_attrpath_change_mn .
ELSEIF node_key EQ c_nkey-valvalid_line12 AND item_name EQ '3' .
lv_fcode = c_fcode-cb_valvld_attrpath_delete .

ELSEIF node_key EQ c_nkey-valvalid_line21 AND item_name EQ '1' .


lv_fcode = c_fcode-cb_valvld_for1_template .
ELSEIF node_key EQ c_nkey-valvalid_line22 AND item_name EQ '1' .
lv_fcode = c_fcode-cb_valvld_for1_relpath .
ELSEIF node_key EQ c_nkey-valvalid_line23 AND item_name EQ '1' .
lv_fcode = c_fcode-cb_valvld_for1_dataset_id .
ELSEIF node_key EQ c_nkey-valvalid_line23 AND item_name EQ '4' .
lv_fcode = c_fcode-cb_valvld_for1_dataset_fld .

ELSEIF node_key EQ c_nkey-valvalid_line31 AND item_name EQ '1' .


lv_fcode = c_fcode-cb_valvld_for2_template .
ELSEIF node_key EQ c_nkey-valvalid_line32 AND item_name EQ '1' .
lv_fcode = c_fcode-cb_valvld_for2_relpath .

ELSEIF node_key EQ c_nkey-loop_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-cb_loop_from_to .

ELSEIF node_key EQ c_nkey-sheet_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-tb_sheetname_change .
ELSEIF node_key EQ c_nkey-sheet_line1 AND item_name EQ '2' .
lv_fcode = c_fcode-tb_sheetname_delete .
ELSEIF node_key EQ c_nkey-sheet_line1 AND item_name EQ '4' .
lv_fcode = c_fcode-tb_sheetstate .
ELSEIF node_key EQ c_nkey-sheetprot_line1 AND item_name EQ '1' .
lv_fcode = c_fcode-tb_sheetprot_change .
ELSEIF node_key EQ c_nkey-sheetprot_line1 AND item_name EQ '2' .
lv_fcode = c_fcode-tb_sheetprot_delete .

ELSEIF node_key EQ c_nkey-area_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-tb_area_setcells .
ELSEIF node_key EQ c_nkey-area_line1 AND item_name EQ '2' .
lv_fcode = c_fcode-tb_area_settextmark .
ELSEIF node_key EQ c_nkey-area_line1 AND item_name EQ '3' .
lv_fcode = c_fcode-tb_area_delete .

ELSEIF node_key EQ c_nkey-vallayout_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-tb_valstring_change .
ELSEIF node_key EQ c_nkey-vallayout_line2 AND item_name EQ '1' .
lv_fcode = c_fcode-tb_valformula_change .
ELSEIF node_key EQ c_nkey-vallayout_line3 AND item_name EQ '1' .
lv_fcode = c_fcode-tb_valmatrix_change .

ELSEIF node_key EQ c_nkey-direction_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-tb_direction_change .

ELSEIF node_key EQ c_nkey-colrow_prop_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-tb_rowprop_change .
ELSEIF node_key EQ c_nkey-colrow_prop_line1 AND item_name EQ '2' .
lv_fcode = c_fcode-tb_colprop_change .

ELSEIF node_key EQ c_nkey-respatt_place_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-tb_respattern_before .
ELSEIF node_key EQ c_nkey-respatt_place_line1 AND item_name EQ '2' .
lv_fcode = c_fcode-tb_respattern_after .

ELSEIF node_key EQ c_nkey-colrow_grp_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-tb_rowgroup_change .
ELSEIF node_key EQ c_nkey-colrow_grp_line1 AND item_name EQ '2' .
lv_fcode = c_fcode-tb_rowgroup_clp_change .
ELSEIF node_key EQ c_nkey-colrow_grp_line1 AND item_name EQ '3' .
lv_fcode = c_fcode-tb_colgroup_change .
ELSEIF node_key EQ c_nkey-colrow_grp_line1 AND item_name EQ '4' .
lv_fcode = c_fcode-tb_colgroup_clp_change .

ELSEIF node_key EQ c_nkey-drwstat_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-tb_drwstflag_change .
ELSEIF node_key EQ c_nkey-drwstat_line2 AND item_name EQ '1' .
lv_fcode = c_fcode-tb_drwstname_change .
ELSEIF node_key EQ c_nkey-drwstat_line2 AND item_name EQ '2' .
lv_fcode = c_fcode-tb_drwstname_delete .

ELSEIF node_key EQ c_nkey-drwsize_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-tb_drwsize_fit .
ELSEIF node_key EQ c_nkey-drwsize_line1 AND item_name EQ '2' .
lv_fcode = c_fcode-tb_drwsize_context .
ELSEIF node_key EQ c_nkey-drwsize_line2 AND item_name EQ '2' .
lv_fcode = c_fcode-tb_drwsize_h_f4 .
ELSEIF node_key EQ c_nkey-drwsize_line2 AND item_name EQ '3' .
lv_fcode = c_fcode-tb_drwsize_h_mn .
ELSEIF node_key EQ c_nkey-drwsize_line3 AND item_name EQ '2' .
lv_fcode = c_fcode-tb_drwsize_w_f4 .
ELSEIF node_key EQ c_nkey-drwsize_line3 AND item_name EQ '3' .
lv_fcode = c_fcode-tb_drwsize_w_mn .

ELSEIF node_key EQ c_nkey-pgbrk_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-tb_pgbreak_top .
ELSEIF node_key EQ c_nkey-pgbrk_line2 AND item_name EQ '1' .
lv_fcode = c_fcode-tb_pgbreak_left .
ELSEIF node_key EQ c_nkey-nopgbrk_line1 AND item_name EQ '1' .
lv_fcode = c_fcode-tb_nopgbreak_top .
ELSEIF node_key EQ c_nkey-nopgbrk_line2 AND item_name EQ '1' .
lv_fcode = c_fcode-tb_nopgbreak_left .

ELSEIF node_key EQ c_nkey-printtitles_line1 AND item_name EQ '2' .


lv_fcode = c_fcode-tb_printtitles_rows_change .
ELSEIF node_key EQ c_nkey-printtitles_line1 AND item_name EQ '3' .
lv_fcode = c_fcode-tb_printtitles_rows_delete .
ELSEIF node_key EQ c_nkey-printtitles_line2 AND item_name EQ '2' .
lv_fcode = c_fcode-tb_printtitles_cols_change .
ELSEIF node_key EQ c_nkey-printtitles_line2 AND item_name EQ '3' .
lv_fcode = c_fcode-tb_printtitles_cols_delete .

ELSEIF node_key EQ c_nkey-mergecells_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-tb_mergecells_change .

ELSEIF node_key EQ c_nkey-autofitmrg_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-tb_autofitmerged_off .
ELSEIF node_key EQ c_nkey-autofitmrg_line1 AND item_name EQ '2' .
lv_fcode = c_fcode-tb_autofitmerged_r .
ELSEIF node_key EQ c_nkey-autofitmrg_line1 AND item_name EQ '3' .
lv_fcode = c_fcode-tb_autofitmerged_c .

ELSEIF node_key EQ c_nkey-treelayout_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-tree_layout_rotate .
ELSEIF node_key EQ c_nkey-treelayout_line2 AND item_name EQ '1' .
lv_fcode = c_fcode-tree_layout_stru .
ELSEIF node_key EQ c_nkey-treelayout_line2 AND item_name EQ '4' .
lv_fcode = c_fcode-tree_layout_exp_coll .
ELSEIF node_key EQ c_nkey-treelayout_line4 AND item_name EQ '1' .
lv_fcode = c_fcode-tree_layout_head .
ELSEIF node_key EQ c_nkey-treelayout_line5 AND item_name EQ '1' .
lv_fcode = c_fcode-tree_layout_colhier .
ELSEIF node_key EQ c_nkey-treelayout_line5 AND item_name EQ '3' .
lv_fcode = c_fcode-tree_layout_colhier_after .
ELSEIF node_key EQ c_nkey-treelayout_line5 AND item_name EQ '4' .
lv_fcode = c_fcode-tree_layout_colhier_shift .
ELSEIF node_key EQ c_nkey-treelayout_line6 AND item_name EQ '1' .
lv_fcode = c_fcode-tree_layout_colother .
ELSEIF node_key EQ c_nkey-treelayout_line61 AND item_name EQ '1' .
lv_fcode = c_fcode-tree_layout_colother_wdh .
ELSEIF node_key EQ c_nkey-treelayout_line62 AND item_name EQ '1' .
lv_fcode = c_fcode-tree_layout_allowformulas .

ELSEIF node_key EQ c_nkey-gridlayout_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-grid_layout_rotate .
ELSEIF node_key EQ c_nkey-gridlayout_line2 AND item_name EQ '1' .
lv_fcode = c_fcode-grid_layout_head .
ELSEIF node_key EQ c_nkey-gridlayout_line2 AND item_name EQ '3' .
lv_fcode = c_fcode-grid_layout_head_titles .
ELSEIF node_key EQ c_nkey-gridlayout_line3 AND item_name EQ '1' .
lv_fcode = c_fcode-grid_fldseq .
ELSEIF node_key EQ c_nkey-gridlayout_line3 AND item_name EQ '3' .
lv_fcode = c_fcode-grid_fldprop .
ELSEIF node_key EQ c_nkey-gridlayout_line4 AND item_name EQ '1' .
lv_fcode = c_fcode-grid_layout_allowformulas . .

ELSEIF node_key EQ c_nkey-chart_model AND item_name EQ '1' .


lv_fcode = c_fcode-chart_model_change .
ELSEIF node_key EQ c_nkey-chart_model AND item_name EQ '2' .
lv_fcode = c_fcode-chart_model_delete .
ELSEIF node_key EQ c_nkey-chart_title AND item_name EQ '1' .
lv_fcode = c_fcode-chart_title .
ELSEIF node_key EQ c_nkey-chart_title_catax AND item_name EQ '1' .
lv_fcode = c_fcode-chart_title_catax .
ELSEIF node_key EQ c_nkey-chart_title_valax AND item_name EQ '1' .
lv_fcode = c_fcode-chart_title_valax .
ELSEIF node_key EQ c_nkey-chart_title_ser AND item_name EQ '1' .
lv_fcode = c_fcode-chart_title_series .
ELSEIF node_key EQ c_nkey-chart_dtset_1 AND item_name EQ '1' .
lv_fcode = c_fcode-chart_dtset_change .
ELSEIF node_key EQ c_nkey-chart_dtset_1 AND item_name EQ '2' .
lv_fcode = c_fcode-chart_dtset_delete .
ELSEIF node_key EQ c_nkey-chart_dtset_2 AND item_name EQ '1' .
lv_fcode = c_fcode-chart_dtset_series .

ELSEIF node_key EQ c_nkey-draft_line1 AND item_name EQ '1' .


lv_fcode = c_fcode-draft_change .
ENDIF .

WHEN OTHERS .
ENDCASE .

CHECK lv_fcode IS NOT INITIAL .

RAISE EVENT evnt_fcode


EXPORTING ev_form_id = v_form_id
ev_fcode = lv_fcode .
ENDMETHOD . "hndl_button_click
METHOD tab_block_context .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-cntxt .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-cntxt .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t073 . " text: Name of the context
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-cntxt_name .
ls_nodes-relatkey = c_nkey-cntxt .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-cntxt_name .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-cntxt_name .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF v_contextname IS INITIAL .
ls_items-text = v_text-t074 . " text: <...not assigned...>
ELSE .
ls_items-text = v_contextname .
ENDIF .
APPEND ls_items TO ct_items .

IF v_contextname IS NOT INITIAL .


CLEAR ls_items .
ls_items-node_key = c_nkey-cntxt_name .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
CONCATENATE '(' v_contextshortdescr ')' INTO ls_items-text+2.
APPEND ls_items TO ct_items .
ENDIF .

ENDMETHOD . "tab_block_context
METHOD tab_block_format .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-format .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-format .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t327 . " text: File format
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-format_line1 .
ls_nodes-relatkey = c_nkey-format .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-format_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-format_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
CASE v_extension .
WHEN c_extension_xlsx . ls_items-text = v_text-t328 . " text: Without
VBA-macro .XLSX
WHEN c_extension_xlsm . ls_items-text = v_text-t329 . " text: VBA-macro-
enabled .XLSM
ENDCASE .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_format
METHOD tab_block_postprocessing .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-postprocessing .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-postprocessing .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t287 . " text: Final post processing
APPEND ls_items TO ct_items .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-postproc_line1 .
ls_nodes-relatkey = c_nkey-postprocessing .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-postproc_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-text = ' VBScript' .
CASE s_form_prop-postproc_vbs_code .
WHEN space . ls_items-t_image = icon_abap_local .
WHEN OTHERS . ls_items-t_image = icon_abap .
ENDCASE .
APPEND ls_items TO ct_items .

CHECK s_form_prop-postproc_vbs_code IS NOT INITIAL .

CLEAR ls_items .
ls_items-node_key = c_nkey-postproc_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
* ls_items-text = v_text-t288 . " text: Provide tables
ls_items-t_image = icon_report_call .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_postprocessing
METHOD tab_block_root_others .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-root_others .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-root_others .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t346 . " text: Other options
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-root_others_line1 .
ls_nodes-relatkey = c_nkey-root_others .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-root_others_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF s_form_prop-definednames_dont_remove IS INITIAL .
ls_items-t_image = icon_wd_iframe .
ELSE .
ls_items-t_image = icon_checkbox .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-root_others_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text = v_text-t347 . " text: Keep named ranges of template
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_root_others
METHOD tab_block_techinfo .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm ,
lv_datum10 TYPE ty_char10 .

*------ TECHNICAL INFORMATION


CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-techinfo .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-techinfo .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t147 . " text: Technical information
APPEND ls_items TO ct_items .

*------ CREATED BY
IF v_created_uname IS NOT INITIAL
OR v_created_datum IS NOT INITIAL .
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-created .
ls_nodes-relatkey = c_nkey-techinfo .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
ls_items-font = cl_gui_list_tree=>item_font_prop .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-created .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
CONCATENATE v_text-t148 ':' INTO ls_items-text . " text: Created by
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-created .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
WRITE v_created_datum TO lv_datum10 DD/MM/YYYY .
CONCATENATE v_created_uname lv_datum10 INTO ls_items-text+1 SEPARATED BY
space .
APPEND ls_items TO ct_items .
ENDIF .

*------ CHANGED BY
IF v_changed_uname IS NOT INITIAL
OR v_changed_datum IS NOT INITIAL .
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-changed .
ls_nodes-relatkey = c_nkey-techinfo .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-changed .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
CONCATENATE v_text-t149 ':' INTO ls_items-text . " text: Changed by
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-changed .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
WRITE v_changed_datum TO lv_datum10 DD/MM/YYYY .
CONCATENATE v_changed_uname lv_datum10 INTO ls_items-text+1 SEPARATED BY
space .
APPEND ls_items TO ct_items .
ENDIF .
*------ PACKAGE
IF v_devclass IS NOT INITIAL .
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-devclass .
ls_nodes-relatkey = c_nkey-techinfo .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-devclass .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
CONCATENATE v_text-t150 ':' INTO ls_items-text . " text: Package
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-devclass .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text+1 = v_devclass .
APPEND ls_items TO ct_items .
ENDIF .

ENDMETHOD . "tab_block_techinfo
METHOD tab_block_formdescr .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-formdescr .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-formdescr .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t075 . " text: Form description
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-formdescr_name .
ls_nodes-relatkey = c_nkey-formdescr .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .
CLEAR ls_items .
ls_items-node_key = c_nkey-formdescr_name .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-formdescr_name .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF v_formdescr IS INITIAL .
ls_items-text = space .
ELSE .
ls_items-text = v_formdescr .
ENDIF .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_formdescr
METHOD tab_block_component .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-component .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-component .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t076 . " text: Name/ description
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-component_line1 .
ls_nodes-relatkey = c_nkey-component .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-component_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-t_image = s_comp_types-icon .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-component_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = s_form_prop-comp_name .
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-component_line2 .
ls_nodes-relatkey = c_nkey-component .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-component_line2 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text = s_form_prop-comp_descr .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_component
METHOD tab_block_loop .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
DATA:
lv_icon TYPE icon_d ,
lv_text TYPE ty_char100 ,
lv_loop_from TYPE ty_char100 ,
lv_loop_to TYPE ty_char100 .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-loop .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-loop .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t261 . " text: Row processing
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-loop_line1 .
ls_nodes-relatkey = c_nkey-loop .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-loop_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-loop_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .

* presets
IF s_form_prop-cb_loop_from IS INITIAL .
s_form_prop-cb_loop_from = 1 .
ENDIF .

IF s_form_prop-cb_loop_from EQ 1
AND s_form_prop-cb_loop_to IS INITIAL .
ls_items-text+1 = v_text-t262 . " text: All rows
APPEND ls_items TO ct_items .

ELSE .
ls_items-text+1 = v_text-t163 . " text: row(s)
APPEND ls_items TO ct_items .

* calculations
lv_loop_from = s_form_prop-cb_loop_from . CONDENSE lv_loop_from NO-GAPS .
lv_loop_to = s_form_prop-cb_loop_to . CONDENSE lv_loop_to NO-GAPS .

IF s_form_prop-cb_loop_to IS INITIAL .
IF s_form_prop-cb_loop_from EQ 1 .
lv_icon = icon_select_all .
lv_text = v_text-t262 . " text: All rows
ELSE .
lv_icon = icon_greater_equal_green .
lv_text = lv_loop_from .
ENDIF .

ELSE .
IF s_form_prop-cb_loop_from EQ s_form_prop-cb_loop_to .
lv_icon = icon_equal_green .
lv_text = lv_loop_from .

ELSEIF s_form_prop-cb_loop_from EQ 1 .
lv_icon = icon_less_equal_green .
lv_text = lv_loop_to .

ELSE .
lv_icon = icon_interval_include_green .

CONCATENATE v_text-t264 " text: from


lv_loop_from
v_text-t265 " text: to
lv_loop_to
INTO lv_text SEPARATED BY space .
ENDIF .
ENDIF .

CLEAR ls_items .
ls_items-node_key = c_nkey-loop_line1 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-t_image = lv_icon .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-loop_line1 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = lv_text .
APPEND ls_items TO ct_items .
ENDIF .

ENDMETHOD . "tab_block_loop
METHOD tab_block_relpath .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-relpath .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-relpath .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t077 . " text: Binding with context
IF s_form_prop-comp_type EQ lcl_form=>c_comp_type-folder .
CONCATENATE ls_items-text
v_text-t078 " text: (optional)
INTO ls_items-text SEPARATED BY space .
ENDIF .
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-relpath_line1 .
ls_nodes-relatkey = c_nkey-relpath .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-relpath_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-relpath_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change_password ."icon_create_note .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-relpath_line1 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_delete .
IF s_form_prop-cb_relpath IS INITIAL .
ls_items-disabled = abap_on .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-relpath_line1 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF s_form_prop-cb_relpath IS INITIAL .
ls_items-text = v_text-t074 . " text: <...not assigned...>
ELSE .
format_path( EXPORTING iv_source = s_form_prop-cb_relpath
CHANGING cv_formatted = ls_items-text ) .
ENDIF .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_relpath
METHOD tab_block_relpath_apr .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-aprpath .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .
CLEAR ls_items .
ls_items-node_key = c_nkey-aprpath .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t079 . " text: Appearance at runtime:
IF s_form_prop-cb_apr_relpath IS INITIAL .
CONCATENATE ls_items-text
v_text-t080 " text: Always
INTO ls_items-text SEPARATED BY space .
ELSE .
CONCATENATE ls_items-text
v_text-t081 " text: Only when field contains value
INTO ls_items-text SEPARATED BY space .
ENDIF .
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-aprpath_line1 .
ls_nodes-relatkey = c_nkey-aprpath .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-aprpath_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-aprpath_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change_password ."icon_create_note .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-aprpath_line1 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_delete .
IF s_form_prop-cb_apr_relpath IS INITIAL .
ls_items-disabled = abap_on .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-aprpath_line1 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
format_path( EXPORTING iv_source = s_form_prop-cb_apr_relpath
CHANGING cv_formatted = ls_items-text ) .
APPEND ls_items TO ct_items .

*------
CHECK s_form_prop-cb_apr_relpath IS NOT INITIAL .
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-aprpath_line2 .
ls_nodes-relatkey = c_nkey-aprpath .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-aprpath_line2 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-t_image = icon_change .
format_text1( EXPORTING iv_offset = s_form_prop-cb_apr_offset
iv_match = s_form_prop-cb_apr_match
IMPORTING ev_text = ls_items-text ) .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_relpath_apr
METHOD tab_block_relpath_val .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm ,
lv_char_tmp TYPE ty_char100 .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valpath .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valpath .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
IF s_form_prop-comp_type EQ lcl_form=>c_comp_type-sheet .
ls_items-text = v_text-t082 . " text: Sheet name at runtime
IF s_form_prop-cb_val_relpath IS INITIAL .
CONCATENATE ls_items-text
v_text-t083 " text: Auto
INTO ls_items-text SEPARATED BY space .
ELSE .
CONCATENATE ls_items-text
v_text-t084 " text: get Value from field
INTO ls_items-text SEPARATED BY space .
ENDIF .
ELSE .
ls_items-text = v_text-t011 . " text: Value
ENDIF .
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valpath_line1 .
ls_nodes-relatkey = c_nkey-valpath .
IF s_form_prop-cb_val_sub_req IS NOT INITIAL .
ls_nodes-isfolder = abap_on .
ENDIF .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valpath_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-valpath_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change_password ."icon_create_note .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-valpath_line1 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_delete .
IF s_form_prop-cb_val_relpath IS INITIAL .
ls_items-disabled = abap_on .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-valpath_line1 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF s_form_prop-cb_val_relpath IS INITIAL .
ls_items-text = space .
ELSE .
format_path( EXPORTING iv_source = s_form_prop-cb_val_relpath
CHANGING cv_formatted = ls_items-text ) .
ENDIF .
APPEND ls_items TO ct_items .

*------
IF s_form_prop-cb_val_sub_req IS NOT INITIAL .
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valpath_line2 .
ls_nodes-relatkey = c_nkey-valpath_line1 .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_expand_all .
ls_nodes-exp_image = icon_expand_all .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valpath_line2 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-t_image = icon_table_settings .
ls_items-text = space .
APPEND ls_items TO ct_items .

IF s_form_prop-cb_val_sub_row IS NOT INITIAL


OR s_form_prop-cb_val_sub_col IS NOT INITIAL .
CLEAR ls_items .
ls_items-node_key = c_nkey-valpath_line2 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
lv_char_tmp = s_form_prop-cb_val_sub_row .
CONDENSE lv_char_tmp .
CONCATENATE v_text-t236 ':~' " text: Table row
lv_char_tmp '~/~'
v_text-t237 ':~' " text: Column
s_form_prop-cb_val_sub_col
INTO ls_items-text .
TRANSLATE ls_items-text USING '~ ' .
ENDIF .
APPEND ls_items TO ct_items .
ENDIF .

*------
IF s_form_prop-comp_type NE lcl_form=>c_comp_type-drawing
AND s_form_prop-comp_type NE lcl_form=>c_comp_type-tree
AND s_form_prop-comp_type NE lcl_form=>c_comp_type-grid
AND s_form_prop-cb_val_relpath IS NOT INITIAL .
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valpath_line3 .
ls_nodes-relatkey = c_nkey-valpath .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valpath_line3 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-t_image = icon_change .
format_text1( EXPORTING iv_offset = s_form_prop-cb_val_offset
iv_match = s_form_prop-cb_val_match
IMPORTING ev_text = ls_items-text ) .
APPEND ls_items TO ct_items .
ENDIF .

*------
IF s_form_prop-comp_type NE lcl_form=>c_comp_type-drawing
AND s_form_prop-comp_type NE lcl_form=>c_comp_type-tree
AND s_form_prop-comp_type NE lcl_form=>c_comp_type-grid
AND s_form_prop-cb_val_relpath IS NOT INITIAL .
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valpath_line4 .
ls_nodes-relatkey = c_nkey-valpath .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valpath_line4 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t085 . " text: convert value to ext.format
IF s_form_prop-cb_val_convert IS INITIAL .
ls_items-t_image = icon_wd_iframe .
ELSE .
ls_items-t_image = icon_checkbox .
ENDIF .
APPEND ls_items TO ct_items .
ENDIF .

ENDMETHOD . "tab_block_relpath_val
METHOD tab_block_relpath_cellrng .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-cellrng .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-cellrng .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t330 . " text: Name of Cell range
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-cellrng_line1 .
ls_nodes-relatkey = c_nkey-cellrng .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-cellrng_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-cellrng_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change_password ."icon_create_note .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-cellrng_line1 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_delete .
IF s_form_prop-cb_cellrng_relpath IS INITIAL .
ls_items-disabled = abap_on .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-cellrng_line1 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
format_path( EXPORTING iv_source = s_form_prop-cb_cellrng_relpath
CHANGING cv_formatted = ls_items-text ) .
APPEND ls_items TO ct_items .

*------
CHECK s_form_prop-cb_cellrng_relpath IS NOT INITIAL .
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-cellrng_line2 .
ls_nodes-relatkey = c_nkey-cellrng .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-cellrng_line2 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-t_image = icon_change .
format_text1( EXPORTING iv_offset = s_form_prop-cb_cellrng_offset
iv_match = s_form_prop-cb_cellrng_match
IMPORTING ev_text = ls_items-text ) .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_relpath_cellrng
METHOD tab_block_val_layout .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-vallayout .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-vallayout .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t185 . " text: Layout options
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-vallayout_line1 .
ls_nodes-relatkey = c_nkey-vallayout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-vallayout_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
IF s_form_prop-tb_val_matrix IS INITIAL
AND s_form_prop-tb_val_formula IS INITIAL .
ls_items-t_image = icon_radiobutton .
ELSE .
ls_items-t_image = icon_wd_radio_button_empty .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-vallayout_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t011 . " text: Value
APPEND ls_items TO ct_items .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-vallayout_line2 .
ls_nodes-relatkey = c_nkey-vallayout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-vallayout_line2 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
IF s_form_prop-tb_val_formula IS INITIAL .
ls_items-t_image = icon_wd_radio_button_empty .
ELSE .
ls_items-t_image = icon_radiobutton .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-vallayout_line2 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t268 . " text: Formula
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-vallayout_line3 .
ls_nodes-relatkey = c_nkey-vallayout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
IF s_form_prop-tb_val_matrix IS NOT INITIAL .
ls_nodes-isfolder = abap_on .
ENDIF .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-vallayout_line3 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
IF s_form_prop-tb_area_textmark IS NOT INITIAL .
ls_items-disabled = abap_on .
ENDIF .
IF s_form_prop-tb_val_matrix IS INITIAL .
ls_items-t_image = icon_wd_radio_button_empty .
ELSE .
ls_items-t_image = icon_radiobutton .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-vallayout_line3 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t216 . " text: Matrix (one char per cell)
APPEND ls_items TO ct_items .

IF s_form_prop-tb_val_matrix IS NOT INITIAL .


DATA:
lv_interval_rows TYPE ty_char10 ,
lv_interval_cols TYPE ty_char10 .

WRITE s_form_prop-tb_val_matr_r TO lv_interval_rows LEFT-JUSTIFIED .


WRITE s_form_prop-tb_val_matr_c TO lv_interval_cols LEFT-JUSTIFIED .

CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-vallayout_line31 .
ls_nodes-relatkey = c_nkey-vallayout_line3 .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-vallayout_line31 .
ls_items-item_name = '1' .
ls_items-t_image = icon_space .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-vallayout_line31 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
CONCATENATE v_text-t217 " text: Interval:
v_text-t162 " text: column(s)
lv_interval_cols '/'
v_text-t163 " text: row(s)
lv_interval_rows
INTO ls_items-text SEPARATED BY space .
CONDENSE ls_items-text .
APPEND ls_items TO ct_items .
ENDIF .

ENDMETHOD . "tab_block_val_layout
METHOD tab_block_val_validation .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valvalid .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
IF s_form_prop-cb_valvld_attr_relpath IS INITIAL
AND s_form_prop-cb_valvld_for1_dataset_id IS INITIAL
AND s_form_prop-cb_valvld_for1_relpath IS INITIAL
AND s_form_prop-cb_valvld_for2_relpath IS INITIAL .
ls_nodes-expander = '-' .
ENDIF .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t348 . " text: Data validation
APPEND ls_items TO ct_items .

*====== Attributes
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valvalid_line1 .
ls_nodes-relatkey = c_nkey-valvalid .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image =
ls_nodes-exp_image = icon_oo_attribute .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t349 . " text: Attributes (from template)
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valvalid_line11 .
ls_nodes-relatkey = c_nkey-valvalid_line1 .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line11 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t350 . " text: Table for dynamic substitution
(field/value)
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valvalid_line12 .
ls_nodes-relatkey = c_nkey-valvalid_line1 .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .
CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line12 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line12 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change_password ."icon_create_note .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line12 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_delete .
IF s_form_prop-cb_valvld_attr_relpath IS INITIAL .
ls_items-disabled = abap_on .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line12 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF s_form_prop-cb_valvld_attr_relpath IS INITIAL .
ls_items-text = v_text-t074 . " text: <...not assigned...>
ELSE .
format_path( EXPORTING iv_source = s_form_prop-cb_valvld_attr_relpath
CHANGING cv_formatted = ls_items-text ) .
ENDIF .
APPEND ls_items TO ct_items .

*====== Formula1
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valvalid_line2 .
ls_nodes-relatkey = c_nkey-valvalid .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image =
ls_nodes-exp_image = icon_parameter_import .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line2 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
CONCATENATE `( 1 ) ` v_text-t351 " text: Value (Formula)
INTO ls_items-text .
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valvalid_line21 .
ls_nodes-relatkey = c_nkey-valvalid_line2 .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line21 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
IF s_form_prop-cb_valvld_for1_dataset_id IS INITIAL
AND s_form_prop-cb_valvld_for1_relpath IS INITIAL .
ls_items-t_image = icon_radiobutton .
ELSE .
ls_items-t_image = icon_wd_radio_button_empty .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line21 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t299 . " text: From template
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valvalid_line22 .
ls_nodes-relatkey = c_nkey-valvalid_line2 .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line22 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
IF s_form_prop-cb_valvld_for1_dataset_id IS INITIAL
AND s_form_prop-cb_valvld_for1_relpath IS NOT INITIAL .
ls_items-t_image = icon_radiobutton .
ELSE .
ls_items-t_image = icon_wd_radio_button_empty .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line22 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t339 . " text: From context field
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line22 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF s_form_prop-cb_valvld_for1_relpath IS NOT INITIAL .
format_path( EXPORTING iv_source = s_form_prop-cb_valvld_for1_relpath
CHANGING cv_formatted = ls_items-text ) .
ENDIF .
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valvalid_line23 .
ls_nodes-relatkey = c_nkey-valvalid_line2 .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line23 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
IF s_form_prop-cb_valvld_for1_dataset_id IS NOT INITIAL
AND s_form_prop-cb_valvld_for1_relpath IS INITIAL .
ls_items-t_image = icon_radiobutton .
ELSE .
ls_items-t_image = icon_wd_radio_button_empty .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line23 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t352 . " text: From Grid
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line23 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF v_valvld_for1_dataset_name IS NOT INITIAL .
ls_items-text = v_valvld_for1_dataset_name .
ENDIF .
APPEND ls_items TO ct_items .
IF s_form_prop-cb_valvld_for1_dataset_id IS NOT INITIAL .
CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line23 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_choose_columns .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line23 .
ls_items-item_name = '5' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text = v_valvld_for1_dataset_field .
APPEND ls_items TO ct_items .
ENDIF .

*====== Formula2
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valvalid_line3 .
ls_nodes-relatkey = c_nkey-valvalid .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image =
ls_nodes-exp_image = icon_parameter_import .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line3 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
CONCATENATE `( 2 ) ` v_text-t351 " text: Value (Formula)
INTO ls_items-text .
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valvalid_line31 .
ls_nodes-relatkey = c_nkey-valvalid_line3 .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line31 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
IF s_form_prop-cb_valvld_for2_relpath IS INITIAL .
ls_items-t_image = icon_radiobutton .
ELSE .
ls_items-t_image = icon_wd_radio_button_empty .
ENDIF .
APPEND ls_items TO ct_items .
CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line31 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t299 . " text: From template
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-valvalid_line32 .
ls_nodes-relatkey = c_nkey-valvalid_line3 .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line32 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
IF s_form_prop-cb_valvld_for2_relpath IS NOT INITIAL .
ls_items-t_image = icon_radiobutton .
ELSE .
ls_items-t_image = icon_wd_radio_button_empty .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line32 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t339 . " text: From context field
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-valvalid_line32 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF s_form_prop-cb_valvld_for2_relpath IS NOT INITIAL .
format_path( EXPORTING iv_source = s_form_prop-cb_valvld_for2_relpath
CHANGING cv_formatted = ls_items-text ) .
ENDIF .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_val_validation
METHOD tab_block_sheet_tb .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-sheet .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-sheet .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t086 . " text: Binding with sheet of the
template
APPEND ls_items TO ct_items .

*------ template worksheet


CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-sheet_line1 .
ls_nodes-relatkey = c_nkey-sheet .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-sheet_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-sheet_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_delete .
IF s_form_prop-tb_sheetname IS INITIAL .
ls_items-disabled = abap_on .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-sheet_line1 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF s_form_prop-tb_sheetname IS INITIAL .
ls_items-text = v_text-t074 . " text: <...not assigned...>
ELSE.
ls_items-text = s_form_prop-tb_sheetname .
ENDIF .
APPEND ls_items TO ct_items .

*------ state of the sheet ( Visible / Hidden )


IF s_form_prop-tb_sheetname IS NOT INITIAL .
CLEAR ls_items .
ls_items-node_key = c_nkey-sheet_line1 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
CASE s_form_prop-tb_sheetstate .
WHEN space . ls_items-t_image = icon_presence . ls_items-text = v_text-
t259 . " text: Visible
WHEN OTHERS . ls_items-t_image = icon_absence . ls_items-text = v_text-
t260 . " text: Hidden
ENDCASE .
CONCATENATE v_text-t258 " text: Runtime state
':' ls_items-text
INTO ls_items-text SEPARATED BY space .
SHIFT ls_items-text RIGHT BY 1 PLACES .
APPEND ls_items TO ct_items .
ENDIF .

ENDMETHOD . "tab_block_sheet_tb
METHOD tab_block_printtitles .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-printtitles .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-printtitles .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t152 . " text: Print titles
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-printtitles_line1 .
ls_nodes-relatkey = c_nkey-printtitles .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-printtitles_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text = v_text-t092 . " text: Rows
ls_items-text+8 = ':' .
APPEND ls_items TO ct_items .
CLEAR ls_items .
ls_items-node_key = c_nkey-printtitles_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-printtitles_line1 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_delete .
IF s_form_prop-tb_printtitles_r IS INITIAL .
ls_items-disabled = abap_on .
ENDIF .
APPEND ls_items TO ct_items .

IF s_form_prop-tb_printtitles_r IS NOT INITIAL .


CLEAR ls_items .
ls_items-node_key = c_nkey-printtitles_line1 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text = v_tb_printtitles_r_name .
APPEND ls_items TO ct_items .
ENDIF .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-printtitles_line2 .
ls_nodes-relatkey = c_nkey-printtitles .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-printtitles_line2 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text = v_text-t093 . " text: Columns
ls_items-text+8 = ':' .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-printtitles_line2 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-printtitles_line2 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_delete .
IF s_form_prop-tb_printtitles_c IS INITIAL .
ls_items-disabled = abap_on .
ENDIF .
APPEND ls_items TO ct_items .

IF s_form_prop-tb_printtitles_c IS NOT INITIAL .


CLEAR ls_items .
ls_items-node_key = c_nkey-printtitles_line2 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text = v_tb_printtitles_c_name .
APPEND ls_items TO ct_items .
ENDIF .

ENDMETHOD . "tab_block_printtitles
METHOD tab_block_sheetprotection .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm ,
ls_sheetprotection TYPE ty_s_sheetprotection .

ls_sheetprotection = lcl_form=>conv_sheetprotection_st( s_form_prop-


tb_sheetprotection ) .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-sheetprot .
ls_nodes-isfolder = abap_on .
IF ls_sheetprotection IS INITIAL .
ls_nodes-n_image = icon_unlocked .
ELSE .
ls_nodes-n_image = icon_locked .
ENDIF .
ls_nodes-exp_image = ls_nodes-n_image .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-sheetprot .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t298 . " text: Sheet protection
APPEND ls_items TO ct_items .

*------ template worksheet


CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-sheetprot_line1 .
ls_nodes-relatkey = c_nkey-sheetprot .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-sheetprot_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-sheetprot_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_delete .
IF ls_sheetprotection IS INITIAL .
ls_items-disabled = abap_on .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-sheetprot_line1 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
CASE ls_sheetprotection-mode .
WHEN c_sheetprotection_mode-off . ls_items-text = v_text-t276 .
" text: Off
WHEN c_sheetprotection_mode-from_template . ls_items-text = v_text-t299 .
" text: From template
WHEN c_sheetprotection_mode-from_context . ls_items-text = v_text-t300 .
" text: From context
WHEN c_sheetprotection_mode-static . ls_items-text = v_text-t301 .
" text: Static
ENDCASE .
APPEND ls_items TO ct_items .

CHECK ls_sheetprotection-mode EQ c_sheetprotection_mode-from_context .

CLEAR ls_items .
ls_items-node_key = c_nkey-sheetprot_line1 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF ls_sheetprotection-cb_val_relpath IS INITIAL .
ls_items-text = space .
ELSE .
format_path( EXPORTING iv_source = ls_sheetprotection-cb_val_relpath
CHANGING cv_formatted = ls_items-text ) .
ENDIF .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_sheetprotection
METHOD tab_block_pgbrk .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm ,
lv_char_tmp TYPE ty_char100 .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-pgbrk .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-pgbrk .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t223 . " text: Insert page break (at the
beginning)
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-pgbrk_line1 .
ls_nodes-relatkey = c_nkey-pgbrk .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-pgbrk_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t154 . " text: Horizontal
IF s_form_prop-tb_pgbrk_top IS INITIAL .
ls_items-t_image = icon_wd_iframe .
ELSE .
ls_items-t_image = icon_checkbox .
ENDIF .
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-pgbrk_line2 .
ls_nodes-relatkey = c_nkey-pgbrk .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-pgbrk_line2 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t155 . " text: Vertical
IF s_form_prop-tb_pgbrk_left IS INITIAL .
ls_items-t_image = icon_wd_iframe .
ELSE .
ls_items-t_image = icon_checkbox .
ENDIF .
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-nopgbrk .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-nopgbrk .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t153 . " text: Preventing of automatic page
breaks (inside)
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-nopgbrk_line1 .
ls_nodes-relatkey = c_nkey-nopgbrk .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-nopgbrk_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t154 . " text: Horizontal
IF s_form_prop-tb_nopgbrk_top IS INITIAL .
ls_items-t_image = icon_wd_iframe .
ELSE .
ls_items-t_image = icon_checkbox .
ENDIF .
APPEND ls_items TO ct_items .

IF s_form_prop-tb_nopgbrk_top IS NOT INITIAL .


CLEAR ls_items .
ls_items-node_key = c_nkey-nopgbrk_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
IF s_form_prop-tb_nopgbrk_top_shift IS INITIAL .
ls_items-text = v_text-t160 . " text: shift pagebreak to the top border
ELSE .
ls_items-text = v_text-t161 . " text: shift pagebreak: & row(s) higher
than top border

lv_char_tmp = s_form_prop-tb_nopgbrk_top_shift . CONDENSE lv_char_tmp NO-


GAPS .
REPLACE FIRST OCCURRENCE OF '&' IN ls_items-text WITH lv_char_tmp .
ENDIF .
APPEND ls_items TO ct_items .
ENDIF .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-nopgbrk_line2 .
ls_nodes-relatkey = c_nkey-nopgbrk .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-nopgbrk_line2 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t155 . " text: Vertical
IF s_form_prop-tb_nopgbrk_left IS INITIAL .
ls_items-t_image = icon_wd_iframe .
ELSE .
ls_items-t_image = icon_checkbox .
ENDIF .
APPEND ls_items TO ct_items .

IF s_form_prop-tb_nopgbrk_left IS NOT INITIAL .


CLEAR ls_items .
ls_items-node_key = c_nkey-nopgbrk_line2 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .

IF s_form_prop-tb_nopgbrk_left_shift IS INITIAL .
ls_items-text = v_text-t158 . " text: shift pagebreak to the left-side
border
ELSE .
ls_items-text = v_text-t159 . " text: shift pagebreak: & column(s)
outside the left border

lv_char_tmp = s_form_prop-tb_nopgbrk_left_shift . CONDENSE lv_char_tmp NO-


GAPS .
REPLACE FIRST OCCURRENCE OF '&' IN ls_items-text WITH lv_char_tmp .
ENDIF .
APPEND ls_items TO ct_items .
ENDIF .

ENDMETHOD . "tab_block_pgbrk
METHOD tab_block_draft .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-draft .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-draft .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t195 . " text: Draft
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-draft_line1 .
ls_nodes-relatkey = c_nkey-draft .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-draft_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF s_form_prop-draft_subtree IS INITIAL .
ls_items-t_image = icon_wd_iframe .
ELSE .
ls_items-t_image = icon_checkbox .
ENDIF .
APPEND ls_items TO ct_items .

IF s_form_prop-draft_subtree IS NOT INITIAL .


CLEAR ls_items .
ls_items-node_key = c_nkey-draft_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-t_image = icon_delete_template .
APPEND ls_items TO ct_items .
ENDIF .

ENDMETHOD . "tab_block_draft
METHOD tab_block_area .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-area .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-area .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t087 . " text: Area in the template
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-area_line1 .
ls_nodes-relatkey = c_nkey-area .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-area_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

IF s_form_prop-comp_type EQ lcl_form=>c_comp_type-field .
CLEAR ls_items .
ls_items-node_key = c_nkey-area_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_fast_entry .
APPEND ls_items TO ct_items .
ENDIF .

CLEAR ls_items .
ls_items-node_key = c_nkey-area_line1 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_delete .
IF s_form_prop-tb_area_top IS INITIAL
AND s_form_prop-tb_area_left IS INITIAL
AND s_form_prop-tb_area_rows IS INITIAL
AND s_form_prop-tb_area_columns IS INITIAL
AND s_form_prop-tb_area_textmark IS INITIAL .
ls_items-disabled = abap_on .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-area_line1 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF s_form_prop-tb_area_top IS NOT INITIAL
OR s_form_prop-tb_area_left IS NOT INITIAL
OR s_form_prop-tb_area_rows IS NOT INITIAL
OR s_form_prop-tb_area_columns IS NOT INITIAL .
DATA:
lv_top TYPE ty_char100 ,
lv_left TYPE ty_char100 ,
lv_rows TYPE ty_char100 ,
lv_columns TYPE ty_char100 .
WRITE:
s_form_prop-tb_area_top TO lv_top LEFT-JUSTIFIED ,
s_form_prop-tb_area_left TO lv_left LEFT-JUSTIFIED ,
s_form_prop-tb_area_rows TO lv_rows LEFT-JUSTIFIED ,
s_form_prop-tb_area_columns TO lv_columns LEFT-JUSTIFIED .

IF s_form_prop-comp_type EQ lcl_form=>c_comp_type-field
AND s_form_prop-tb_val_matrix IS INITIAL .
CONCATENATE 'Top:' lv_top 'Left:' lv_left
INTO ls_items-text SEPARATED BY space .
ELSE .
CONCATENATE 'Top:' lv_top 'Left:' lv_left 'Rows:' lv_rows 'Columns:'
lv_columns
INTO ls_items-text SEPARATED BY space .
ENDIF .

ELSEIF s_form_prop-tb_area_textmark IS NOT INITIAL .


CONCATENATE v_text-t272 " text: Mark in the text
':' s_form_prop-tb_area_textmark INTO ls_items-text SEPARATED BY
space .
ELSE .
ls_items-text = v_text-t074 . " text: <...not assigned...>
ENDIF .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_area
METHOD tab_block_direction .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes.
ls_nodes-node_key = c_nkey-direction .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-direction .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t088 . " text: Output direction at runtime
APPEND ls_items TO ct_items .
*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-direction_line1 .
ls_nodes-relatkey = c_nkey-direction .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-direction_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
CASE s_form_prop-tb_direction .
WHEN lcl_form=>c_tb_direction-left2right .
ls_items-t_image = icon_trend_unchanged .
WHEN lcl_form=>c_tb_direction-up2down .
ls_items-t_image = icon_trend_down .
ENDCASE .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-direction_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
CASE s_form_prop-tb_direction .
WHEN lcl_form=>c_tb_direction-left2right .
ls_items-text = v_text-t089 . " text: Right
WHEN lcl_form=>c_tb_direction-up2down .
ls_items-text = v_text-t090 . " text: Down
ENDCASE .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_direction
METHOD tab_block_mergecells .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes.
ls_nodes-node_key = c_nkey-mergecells .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-mergecells .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t176 . " text: Merge cells
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-mergecells_line1 .
ls_nodes-relatkey = c_nkey-mergecells .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-mergecells_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
CASE s_form_prop-tb_mergecells .
WHEN lcl_form=>c_tb_mergecells-rows .
ls_items-t_image = icon_wd_view_set_t_layout_270 .
WHEN lcl_form=>c_tb_mergecells-cols .
ls_items-t_image = icon_wd_view_set_t_layout .
ENDCASE .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-mergecells_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
CASE s_form_prop-tb_mergecells .
WHEN lcl_form=>c_tb_mergecells-rows .
ls_items-text = v_text-t177 . " text: Span rows
WHEN lcl_form=>c_tb_mergecells-cols .
ls_items-text = v_text-t178 . " text: Span columns
ENDCASE .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_mergecells
METHOD tab_block_colrow_prop .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes.
ls_nodes-node_key = c_nkey-colrow_prop .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-colrow_prop .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t091 . " text: Copy properties
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-colrow_prop_line1 .
ls_nodes-relatkey = c_nkey-colrow_prop .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-colrow_prop_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t092 . " text: Rows
IF s_form_prop-tb_rowprop IS INITIAL .
ls_items-t_image = icon_wd_iframe .
ELSE .
ls_items-t_image = icon_checkbox .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-colrow_prop_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t093 . " text: Columns
IF s_form_prop-tb_colprop IS INITIAL .
ls_items-t_image = icon_wd_iframe .
ELSE .
ls_items-t_image = icon_checkbox .
ENDIF .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_colrow_prop
METHOD tab_block_colrow_group .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes.
ls_nodes-node_key = c_nkey-colrow_grp .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-colrow_grp .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t094 . " text: Group
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-colrow_grp_line1 .
ls_nodes-relatkey = c_nkey-colrow_grp .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-colrow_grp_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t092 . " text: Rows
IF s_form_prop-tb_rowgroup IS INITIAL .
ls_items-t_image = icon_wd_iframe .
ELSE .
ls_items-t_image = icon_checkbox .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-colrow_grp_line1 .
ls_items-item_name = '2' .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = space .
IF s_form_prop-tb_rowgroup IS INITIAL .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-t_image = icon_space .
ELSEIF s_form_prop-tb_rowgroup_clp IS INITIAL .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-t_image = icon_collapse .
ELSE .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-t_image = icon_expand .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-colrow_grp_line1 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t093 . " text: Columns
IF s_form_prop-tb_colgroup IS INITIAL .
ls_items-t_image = icon_wd_iframe .
ELSE .
ls_items-t_image = icon_checkbox .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-colrow_grp_line1 .
ls_items-item_name = '4' .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = space .
IF s_form_prop-tb_colgroup IS INITIAL .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-t_image = icon_space .
ELSEIF s_form_prop-tb_colgroup_clp IS INITIAL .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-t_image = icon_collapse .
ELSE .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-t_image = icon_expand .
ENDIF .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_colrow_group
METHOD tab_block_autofitmerged .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes.
ls_nodes-node_key = c_nkey-autofitmrg .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-autofitmrg .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t275 . " text: AutoFit for merged cells
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-autofitmrg_line1 .
ls_nodes-relatkey = c_nkey-autofitmrg .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-autofitmrg_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t276 . " text: Off
IF s_form_prop-tb_autofitmerged_r IS INITIAL
AND s_form_prop-tb_autofitmerged_c IS INITIAL .
ls_items-t_image = icon_radiobutton .
ELSE .
ls_items-t_image = icon_wd_radio_button_empty .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-autofitmrg_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t277 . " text: Row height
CASE s_form_prop-tb_autofitmerged_r .
WHEN space . ls_items-t_image = icon_wd_radio_button_empty .
WHEN OTHERS . ls_items-t_image = icon_radiobutton .
ENDCASE .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-autofitmrg_line1 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t278 . " text: Column width
CASE s_form_prop-tb_autofitmerged_c .
WHEN space . ls_items-t_image = icon_wd_radio_button_empty .
WHEN OTHERS . ls_items-t_image = icon_radiobutton .
ENDCASE .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_autofitmerged
METHOD tab_block_respattern_place .
DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes.
ls_nodes-node_key = c_nkey-respatt_place .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-respatt_place .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t355 . " text: Place relative to Subarea
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-respatt_place_line1 .
ls_nodes-relatkey = c_nkey-respatt_place .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-respatt_place_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t356 . " text: Before
CASE s_form_prop-tb_respattern_place .
WHEN lcl_form=>c_respattern_place-before_subarea . ls_items-t_image =
icon_radiobutton .
WHEN lcl_form=>c_respattern_place-after_subarea . ls_items-t_image =
icon_wd_radio_button_empty .
ENDCASE .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-respatt_place_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t357 . " text: After
CASE s_form_prop-tb_respattern_place .
WHEN lcl_form=>c_respattern_place-before_subarea . ls_items-t_image =
icon_wd_radio_button_empty .
WHEN lcl_form=>c_respattern_place-after_subarea . ls_items-t_image =
icon_radiobutton .
ENDCASE .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_respattern_place
METHOD tab_block_drwstat .

DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes.
ls_nodes-node_key = c_nkey-drwstat .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwstat .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t140 . " text: Source
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-drwstat_line1 .
ls_nodes-relatkey = c_nkey-drwstat .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .
CLEAR ls_items .
ls_items-node_key = c_nkey-drwstat_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
IF s_form_prop-tb_drwstat_flag IS INITIAL .
ls_items-t_image = icon_binary_document .
ls_items-text+1 = v_text-t141 . " text: Rawdata from context field
ELSE .
ls_items-t_image = icon_jpg .
ls_items-text+1 = v_text-t142 . " text: Drawing, located on the sheet
ENDIF .
APPEND ls_items TO ct_items .

CHECK s_form_prop-tb_drwstat_flag IS NOT INITIAL .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-drwstat_line2 .
ls_nodes-relatkey = c_nkey-drwstat .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwstat_line2 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwstat_line2 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_delete .
IF s_form_prop-tb_drwstat_name IS INITIAL .
ls_items-disabled = abap_on .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwstat_line2 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
IF s_form_prop-tb_drwstat_name IS INITIAL .
ls_items-text = v_text-t074 . " text: <...not assigned...>
ELSE .
ls_items-text = s_form_prop-tb_drwstat_name .
ENDIF .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_drwstat
METHOD tab_block_drwsize .

DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
*------
CLEAR ls_nodes.
ls_nodes-node_key = c_nkey-drwsize .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image = icon_dummy .
ls_nodes-exp_image = icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwsize .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t337 . " text: Size
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-drwsize_line1 .
ls_nodes-relatkey = c_nkey-drwsize .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwsize_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = v_text-t338 . " text: Fit within area
CASE s_form_prop-drawing_size .
WHEN lcl_form=>c_drawing_size-fit_within_area . ls_items-t_image =
icon_radiobutton .
WHEN lcl_form=>c_drawing_size-from_context . ls_items-t_image =
icon_wd_radio_button_empty .
ENDCASE .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwsize_line1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = v_text-t339 . " text: From context field
CASE s_form_prop-drawing_size .
WHEN lcl_form=>c_drawing_size-fit_within_area . ls_items-t_image =
icon_wd_radio_button_empty .
WHEN lcl_form=>c_drawing_size-from_context . ls_items-t_image =
icon_radiobutton .
ENDCASE .
APPEND ls_items TO ct_items .

CHECK s_form_prop-drawing_size EQ lcl_form=>c_drawing_size-from_context .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-drwsize_line2 .
ls_nodes-relatkey = c_nkey-drwsize .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwsize_line2 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text = v_text-t340 . " text: Height
ls_items-text+8 = ':' .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwsize_line2 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwsize_line2 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change_password .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwsize_line2 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF s_form_prop-drawing_size_h_relpath IS INITIAL .
ls_items-text = v_text-t074 . " text: <...not assigned...>
ELSE .
format_path( EXPORTING iv_source = s_form_prop-drawing_size_h_relpath
CHANGING cv_formatted = ls_items-text ) .
ENDIF .
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-drwsize_line3 .
ls_nodes-relatkey = c_nkey-drwsize .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwsize_line3 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text = v_text-t341 . " text: Width
ls_items-text+8 = ':' .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwsize_line3 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwsize_line3 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change_password .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-drwsize_line3 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF s_form_prop-drawing_size_w_relpath IS INITIAL .
ls_items-text = v_text-t074 . " text: <...not assigned...>
ELSE .
format_path( EXPORTING iv_source = s_form_prop-drawing_size_w_relpath
CHANGING cv_formatted = ls_items-text ) .
ENDIF .
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_drwsize
METHOD tab_block_chart .

DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm .
DATA:
lv_dataset_series_assigned TYPE ty_char10 ,
lv_dataset_series_all TYPE ty_char10 ,
lt_dataset_series_tab TYPE ty_t_dataset_series_tab .

*------ Layout options


CLEAR ls_nodes.
ls_nodes-node_key = c_nkey-chart_layout .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image =
ls_nodes-exp_image = icon_layout_control .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_layout .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t185 . " text: Layout options
APPEND ls_items TO ct_items .

*------ Model
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-chart_model .
ls_nodes-relatkey = c_nkey-chart_layout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image =
ls_nodes-exp_image = icon_gis_bar .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_model .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-t_image = icon_change .
ls_items-text+1 = v_text-t233 . " text: Model
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_model .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_delete .
IF s_form_prop-tb_drwstat_name IS INITIAL .
ls_items-disabled = abap_on .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_model .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF s_form_prop-tb_drwstat_name IS INITIAL .
ls_items-text = v_text-t074 . " text: <...not assigned...>
ELSE .
ls_items-text = s_form_prop-tb_drwstat_name .
ENDIF .
APPEND ls_items TO ct_items .

*------ Chart title (mode, path)


CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-chart_title .
ls_nodes-relatkey = c_nkey-chart_layout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image =
ls_nodes-exp_image = icon_wd_caption .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = v_text-t251 . " text: Chart title
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text(1) = ':' .
CASE s_form_prop-chart_title .
WHEN space . ls_items-text+2 = v_text-t253 . " text: from Model
(statically)
WHEN OTHERS . ls_items-text+2 = v_text-t254 . " text: from Context
ENDCASE .
APPEND ls_items TO ct_items .

IF s_form_prop-chart_title IS NOT INITIAL .


CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text(1) = ':' .
IF s_form_prop-chart_title_relpath IS INITIAL .
ls_items-text+2 = v_text-t074 . " text: <...not assigned...>
ELSE .
format_path( EXPORTING iv_source = s_form_prop-chart_title_relpath
CHANGING cv_formatted = ls_items-text+2 ) .
ENDIF .
APPEND ls_items TO ct_items .
ENDIF .

*------ Category Axis title (mode, path)


CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-chart_title_catax .
ls_nodes-relatkey = c_nkey-chart_layout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image =
ls_nodes-exp_image = icon_wd_label .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title_catax .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title_catax .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = v_text-t344 . " text: Category Axis title
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title_catax .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text(1) = ':' .
CASE s_form_prop-chart_catax_title .
WHEN space . ls_items-text+2 = v_text-t253 . " text: from Model
(statically)
WHEN '1' . ls_items-text+2 = v_text-t255 . " text: from Dataset grid
column captions
WHEN OTHERS . ls_items-text+2 = v_text-t254 . " text: from Context
ENDCASE .
APPEND ls_items TO ct_items .

IF s_form_prop-chart_catax_title IS NOT INITIAL .


CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title_catax .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text(1) = ':' .
IF s_form_prop-chart_catax_title_relpath IS INITIAL .
ls_items-text+2 = v_text-t074 . " text: <...not assigned...>
ELSE .
format_path( EXPORTING iv_source = s_form_prop-chart_catax_title_relpath
CHANGING cv_formatted = ls_items-text+2 ) .
ENDIF .
APPEND ls_items TO ct_items .
ENDIF .

*------ Value Axis title (mode, path)


CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-chart_title_valax .
ls_nodes-relatkey = c_nkey-chart_layout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image =
ls_nodes-exp_image = icon_wd_label .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title_valax .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title_valax .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = v_text-t343 . " text: Value Axis title
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title_valax .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text(1) = ':' .
CASE s_form_prop-chart_valax_title .
WHEN space . ls_items-text+2 = v_text-t253 . " text: from Model
(statically)
WHEN OTHERS . ls_items-text+2 = v_text-t254 . " text: from Context
ENDCASE .
APPEND ls_items TO ct_items .

IF s_form_prop-chart_valax_title IS NOT INITIAL .


CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title_valax .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text(1) = ':' .
IF s_form_prop-chart_valax_title_relpath IS INITIAL .
ls_items-text+2 = v_text-t074 . " text: <...not assigned...>
ELSE .
format_path( EXPORTING iv_source = s_form_prop-chart_valax_title_relpath
CHANGING cv_formatted = ls_items-text+2 ) .
ENDIF .
APPEND ls_items TO ct_items .
ENDIF .

*------ Series title (mode)


CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-chart_title_ser .
ls_nodes-relatkey = c_nkey-chart_layout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image =
ls_nodes-exp_image = icon_wd_label .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title_ser .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title_ser .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = v_text-t252 . " text: Series name
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_title_ser .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
ls_items-text(1) = ':' .
CASE s_form_prop-chart_series_title .
WHEN space . ls_items-text+2 = v_text-t253 . " text: from Model
(statically)
WHEN OTHERS . ls_items-text+2 = v_text-t255 . " text: from Dataset grid
column captions
ENDCASE .
APPEND ls_items TO ct_items .

*------ DataSource
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-chart_dtset .
ls_nodes-relatkey = space .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image =
ls_nodes-exp_image = icon_wd_table .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_dtset .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = v_text-t234 . " text: Dataset
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-chart_dtset_1 .
ls_nodes-relatkey = c_nkey-chart_dtset .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image =
ls_nodes-exp_image = icon_table_settings .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_dtset_1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-t_image = icon_change .
ls_items-text+1 = v_text-t225 . " text: Grid
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_dtset_1 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_delete .
IF s_form_prop-dataset_id IS INITIAL .
ls_items-disabled = abap_on .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_dtset_1 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .
IF s_form_prop-dataset_id IS INITIAL .
ls_items-text = v_text-t074 . " text: <...not assigned...>
ELSE .
ls_items-text = v_dataset_name .
ENDIF .
APPEND ls_items TO ct_items .

*------ Series
CHECK s_form_prop-dataset_id IS NOT INITIAL .

CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-chart_dtset_2 .
ls_nodes-relatkey = c_nkey-chart_dtset .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image =
ls_nodes-exp_image = icon_choose_columns .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_dtset_2 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-t_image = icon_change .
ls_items-text+1 = v_text-t235 . " text: Series
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-chart_dtset_2 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_fixed .

lt_dataset_series_tab[] =
lcl_formtemplate=>conv_dataset_series_st( s_form_prop-dataset_series ) .
DELETE lt_dataset_series_tab WHERE seridx EQ c_chart_category_idx .
lv_dataset_series_all = LINES( lt_dataset_series_tab[] ) .
LOOP AT lt_dataset_series_tab TRANSPORTING NO FIELDS WHERE dtsfld IS NOT
INITIAL .
ADD 1 TO lv_dataset_series_assigned .
ENDLOOP .
IF lv_dataset_series_assigned IS INITIAL .
ls_items-text+2 = v_text-t074 . " text: <...not assigned...>
ELSEIF lv_dataset_series_assigned EQ lv_dataset_series_all .
ls_items-t_image = icon_complete .
ELSE .
CONCATENATE lv_dataset_series_assigned
v_text-t246 " text: from
lv_dataset_series_all
INTO ls_items-text SEPARATED BY space .
CONDENSE ls_items-text+2 .
ENDIF .

APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_chart
METHOD tab_block_tree_layout .

DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm ,
ls_tree_layout TYPE ty_s_tree_layout ,
lv_int TYPE i ,
lv_text TYPE ty_char100 .

lcl_form=>conv_container_fs(
EXPORTING iv_field = s_form_prop-tree_layout
IMPORTING es_structure = ls_tree_layout ) .

*------
CLEAR ls_nodes.
ls_nodes-node_key = c_nkey-treelayout .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image =
ls_nodes-exp_image = icon_layout_control . "icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t185 . " text: Layout options
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-treelayout_line1 .
ls_nodes-relatkey = c_nkey-treelayout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
CASE ls_tree_layout-rotate .
WHEN space .
ls_items-t_image = icon_bw_apd_transformation .
ls_items-text+1 = v_text-t187 . " text: standard orientation
WHEN OTHERS .
ls_items-t_image = icon_bw_rotate_left .
ls_items-text+1 = v_text-t186 . " text: rotate 90 CCW
ENDCASE .
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-treelayout_line2 .
ls_nodes-relatkey = c_nkey-treelayout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line2 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
CASE ls_tree_layout-stru .
WHEN space . ls_items-t_image = icon_wd_iframe .
WHEN OTHERS . ls_items-t_image = icon_checkbox .
ENDCASE .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line2 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = v_text-t188 . " text: structure
APPEND ls_items TO ct_items .

IF ls_tree_layout-stru IS NOT INITIAL .


CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line2 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t205 . " text: . Initial state of nodes:
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line2 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
CASE ls_tree_layout-stru_exp_coll .
WHEN lcl_form=>c_stru_exp_coll-expanded .
ls_items-t_image = icon_collapse .
ls_items-text+1 = v_text-t193 . " text: All expanded
WHEN lcl_form=>c_stru_exp_coll-collapsed .
ls_items-t_image = icon_expand .
ls_items-text+1 = v_text-t194 . " text: All Collapsed
WHEN OTHERS .
ls_items-t_image = icon_paw_item .
ls_items-text+1 = v_text-t204 . " text: Actual (from TreeControl)
ENDCASE .
APPEND ls_items TO ct_items .
ENDIF .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-treelayout_line4 .
ls_nodes-relatkey = c_nkey-treelayout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line4 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
CASE ls_tree_layout-head .
WHEN space . ls_items-t_image = icon_wd_iframe .
WHEN OTHERS . ls_items-t_image = icon_checkbox .
ENDCASE .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line4 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = v_text-t189 . " text: header
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-treelayout_line5 .
ls_nodes-relatkey = c_nkey-treelayout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line5 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
CASE ls_tree_layout-col_hier .
WHEN space . ls_items-t_image = icon_wd_iframe .
WHEN OTHERS . ls_items-t_image = icon_checkbox .
ENDCASE .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line5 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = v_text-t190 . " text: hierarchy column
APPEND ls_items TO ct_items .

IF ls_tree_layout-col_hier IS NOT INITIAL .


CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line5 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-t_image = icon_change .
CASE ls_tree_layout-col_hier_after .
WHEN space . ls_items-text+1 = v_text-t199 . " text: Before
WHEN OTHERS . ls_items-text+1 = v_text-t200 . " text: After
ENDCASE .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line5 .
ls_items-item_name = '4' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-t_image = icon_change .
lv_text = lv_int = ls_tree_layout-col_hier_shift .
CONDENSE lv_text NO-GAPS .

CONCATENATE v_text-t191 " text: shift


':' lv_text INTO ls_items-text+1 SEPARATED BY space .
APPEND ls_items TO ct_items .
ENDIF .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-treelayout_line6 .
ls_nodes-relatkey = c_nkey-treelayout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
IF ls_tree_layout-col_othr IS NOT INITIAL .
ls_nodes-isfolder = abap_on .
ENDIF .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line6 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
CASE ls_tree_layout-col_othr .
WHEN space . ls_items-t_image = icon_wd_iframe .
WHEN OTHERS . ls_items-t_image = icon_checkbox .
ENDCASE .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line6 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = v_text-t192 . " text: other columns
APPEND ls_items TO ct_items .

IF ls_tree_layout-col_othr IS NOT INITIAL .


*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-treelayout_line61 .
ls_nodes-relatkey = c_nkey-treelayout_line6 .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line61 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
IF ls_tree_layout-col_othr_width IS INITIAL
OR ls_tree_layout-col_othr_width EQ 0 .
ls_items-t_image = icon_wd_iframe .
ELSE .
ls_items-t_image = icon_checkbox .
ENDIF .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line61 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
IF ls_tree_layout-col_othr_width IS INITIAL
OR ls_tree_layout-col_othr_width EQ 0 .
ls_items-text+1 = v_text-t201 . " text: width from f.cat.
ELSE .
lv_text = lv_int = ls_tree_layout-col_othr_width .
CONDENSE lv_text .
CONCATENATE v_text-t201 " text: width from f.cat.
'~(' v_text-t202 " text: multiplier
':~' lv_text ')'
INTO ls_items-text+1 .
SET LOCALE LANGUAGE sy-langu .
TRANSLATE ls_items-text USING '~ ' .
ENDIF .
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-treelayout_line62 .
ls_nodes-relatkey = c_nkey-treelayout_line6 .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line62 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
CASE ls_tree_layout-allow_formulas .
WHEN space . ls_items-t_image = icon_wd_iframe .
WHEN OTHERS . ls_items-t_image = icon_checkbox .
ENDCASE .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-treelayout_line62 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = v_text-t269 . " text: allow formulas
APPEND ls_items TO ct_items .
ENDIF .

ENDMETHOD . "tab_block_tree_layout
METHOD tab_block_grid_layout .

DATA:
ls_nodes TYPE treev_node ,
ls_items TYPE mtreeitm ,
ls_grid_layout TYPE ty_s_grid_layout .

lcl_form=>conv_container_fs(
EXPORTING iv_field = s_form_prop-grid_layout
IMPORTING es_structure = ls_grid_layout ) .

*------
CLEAR ls_nodes.
ls_nodes-node_key = c_nkey-gridlayout .
ls_nodes-isfolder = abap_on .
ls_nodes-n_image =
ls_nodes-exp_image = icon_layout_control . "icon_dummy .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-gridlayout .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text = v_text-t185 . " text: Layout options
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-gridlayout_line1 .
ls_nodes-relatkey = c_nkey-gridlayout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-gridlayout_line1 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
CASE ls_grid_layout-rotate .
WHEN space .
ls_items-t_image = icon_bw_apd_transformation .
ls_items-text+1 = v_text-t187 . " text: standard orientation
WHEN OTHERS .
ls_items-t_image = icon_bw_rotate_left .
ls_items-text+1 = v_text-t186 . " text: rotate 90 CCW
ENDCASE .
APPEND ls_items TO ct_items .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-gridlayout_line2 .
ls_nodes-relatkey = c_nkey-gridlayout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-gridlayout_line2 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
CASE ls_grid_layout-head .
WHEN space . ls_items-t_image = icon_wd_iframe .
WHEN OTHERS . ls_items-t_image = icon_checkbox .
ENDCASE .
APPEND ls_items TO ct_items .
CLEAR ls_items .
ls_items-node_key = c_nkey-gridlayout_line2 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = v_text-t189 . " text: header
APPEND ls_items TO ct_items .

IF ls_grid_layout-head IS NOT INITIAL .


CLEAR ls_items .
ls_items-node_key = c_nkey-gridlayout_line2 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_change .

CASE ls_grid_layout-head_titles .
WHEN lcl_form=>c_head_titles-tech . ls_items-text = v_text-t229 . " text:
Tech.names
WHEN lcl_form=>c_head_titles-descr . ls_items-text = v_text-t230 . " text:
Descriptions
WHEN OTHERS .
CONCATENATE v_text-t229 '-' " text: Tech.names
v_text-t230 " text: Descriptions
INTO ls_items-text SEPARATED BY space .
ENDCASE .
APPEND ls_items TO ct_items .
ENDIF .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-gridlayout_line3 .
ls_nodes-relatkey = c_nkey-gridlayout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-gridlayout_line3 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_choose_columns .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-gridlayout_line3 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .

DATA lv_count TYPE ty_char10 .


IF s_form_prop-grid_fldseq IS INITIAL .
ls_items-text+1 = v_text-t226 . " text: columns
ELSE .
FIND ALL OCCURRENCES OF c_fldseq_separator
IN s_form_prop-grid_fldseq MATCH COUNT lv_count .
ADD 1 TO lv_count .
CONDENSE lv_count NO-GAPS .

CONCATENATE v_text-t226 " text: columns


'(' lv_count ')'
INTO ls_items-text+1 SEPARATED BY space .
ENDIF .
APPEND ls_items TO ct_items .

IF s_form_prop-grid_fldseq IS NOT INITIAL .


CLEAR ls_items .
ls_items-node_key = c_nkey-gridlayout_line3 .
ls_items-item_name = '3' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-t_image = icon_tools .
APPEND ls_items TO ct_items .
ENDIF .

*------
CLEAR ls_nodes .
ls_nodes-node_key = c_nkey-gridlayout_line4 .
ls_nodes-relatkey = c_nkey-gridlayout .
ls_nodes-relatship = cl_gui_list_tree=>relat_last_child .
ls_nodes-n_image = icon_space .
ls_nodes-exp_image = icon_space .
APPEND ls_nodes TO ct_nodes .

CLEAR ls_items .
ls_items-node_key = c_nkey-gridlayout_line4 .
ls_items-item_name = '1' .
ls_items-class = cl_gui_list_tree=>item_class_button .
ls_items-alignment = cl_gui_list_tree=>align_auto .
CASE ls_grid_layout-allow_formulas .
WHEN space . ls_items-t_image = icon_wd_iframe .
WHEN OTHERS . ls_items-t_image = icon_checkbox .
ENDCASE .
APPEND ls_items TO ct_items .

CLEAR ls_items .
ls_items-node_key = c_nkey-gridlayout_line4 .
ls_items-item_name = '2' .
ls_items-class = cl_gui_list_tree=>item_class_text .
ls_items-alignment = cl_gui_list_tree=>align_auto .
ls_items-font = cl_gui_list_tree=>item_font_prop .
ls_items-text+1 = v_text-t269 . " text: allow formulas
APPEND ls_items TO ct_items .

ENDMETHOD . "tab_block_grid_layout
METHOD format_text1 .
DATA:
lv_char_offset TYPE ty_char100 ,
lv_char_match TYPE ty_char100 .

lv_char_offset = iv_offset . CONDENSE lv_char_offset .


lv_char_match = iv_match . CONDENSE lv_char_match .

IF iv_offset EQ 0
AND iv_match EQ 0 .
ev_text = v_text-t095 . " text: The entire value
ELSEIF iv_offset EQ 0
AND iv_match NE 0 .
CONCATENATE v_text-t096 " text: first
'_' lv_char_match '_'
v_text-t097 " text: characters
INTO ev_text SEPARATED BY space .
ELSEIF iv_offset NE 0
AND iv_match EQ 0 .
CONCATENATE v_text-t098 " text: from position
lv_char_offset ',_'
v_text-t099 " text: all subsequent
INTO ev_text .
ELSE .
CONCATENATE v_text-t098 " text: from position
':_' lv_char_offset INTO lv_char_offset .
CONCATENATE v_text-t097 " text: characters
':_' lv_char_match INTO lv_char_match .
CONCATENATE lv_char_offset ',_' lv_char_match INTO ev_text .
ENDIF .
TRANSLATE ev_text USING '_ ' .
ENDMETHOD . "format_text1
ENDCLASS . "lcl_wb_protab IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_workbench DEFINITION
*----------------------------------------------------------------------*
* the form builder application
*----------------------------------------------------------------------*
CLASS lcl_workbench DEFINITION INHERITING FROM lcl_root .
PUBLIC SECTION .
METHODS:
constructor
IMPORTING iv_formname TYPE any OPTIONAL
iv_action TYPE any
EXCEPTIONS process_terminated ,
free ,
action_edit
IMPORTING iv_formname TYPE any
EXCEPTIONS process_terminated ,
action_create
IMPORTING iv_formname TYPE any
iv_with_template TYPE flag DEFAULT space
EXCEPTIONS process_terminated ,
action_copy
IMPORTING iv_formname TYPE any
EXCEPTIONS process_terminated ,
action_delete
IMPORTING iv_formname TYPE any
EXCEPTIONS process_terminated ,
action_export
IMPORTING iv_formname TYPE any
EXCEPTIONS process_terminated ,
action_import
IMPORTING iv_formname TYPE any
EXCEPTIONS process_terminated ,
new_formname_to_selscreen
IMPORTING iv_formname TYPE any ,
pbo ,
popup_compname
IMPORTING iv_comp_type TYPE any
CHANGING cv_retcode TYPE any
cv_comp_name TYPE any
cv_comp_descr TYPE any ,
popup_comp_types
IMPORTING iv_title TYPE any OPTIONAL
it_comp_types TYPE ty_t_comp_types
iv_wizard_mode_allow TYPE any
EXPORTING ev_comp_type TYPE any
ev_wizard_mode TYPE any
ev_cancel TYPE flag ,
popup_component
IMPORTING iv_title TYPE any OPTIONAL
iv_comp_type TYPE any
EXPORTING es_form_prop TYPE lcl_form=>ty_s_properties
ev_cancel TYPE flag ,
popup_textmark
CHANGING cv_retcode TYPE any
cv_textmark TYPE any ,
popup_ctxtfield
IMPORTING iv_cb_fullpath_parent TYPE any
iv_f4_strategy TYPE i
iv_manual TYPE flag OPTIONAL
CHANGING cv_cb_relpath TYPE ty_comp_path
cv_cb_comp_type TYPE ty_comp_type OPTIONAL
cv_cancel TYPE flag OPTIONAL ,
popup_ctxtfield_sub
IMPORTING iv_cb_fullpath_parent TYPE any
iv_cb_relpath TYPE ty_comp_path
CHANGING cv_cb_val_sub_col TYPE any
cv_cb_val_sub_row TYPE i
cs_ctxt_prop TYPE lcl_context=>ty_s_properties
cv_cancel TYPE flag OPTIONAL ,
popup_ctxtfield_callback
IMPORTING is_nodetab TYPE seucomm
iv_uc TYPE any
CHANGING cv_exit TYPE flag
cv_list_refresh TYPE flag ,
popup_ctxtmulti
IMPORTING iv_cb_fullpath_parent TYPE any
CHANGING ct_comp_paths TYPE ty_t_ctxtmulti
cv_cancel TYPE flag OPTIONAL ,
popup_ctxtmulti_callback
IMPORTING is_nodetab TYPE seucomm
iv_uc TYPE any
CHANGING cv_exit TYPE flag
cv_list_refresh TYPE flag ,
popup_charpos
IMPORTING iv_length TYPE any
CHANGING cv_offset TYPE any
cv_match TYPE any
cv_cancel TYPE flag OPTIONAL ,
popup_matrix_interval
CHANGING cv_rows TYPE any
cv_cols TYPE any
cv_cancel TYPE flag OPTIONAL ,
popup_tbsheet
RETURNING value(rv_name) TYPE ty_char31 ,
popup_tbdrawing
IMPORTING iv_sheetname TYPE any
iv_vector TYPE flag OPTIONAL
iv_bitmap TYPE flag OPTIONAL
iv_chart TYPE flag OPTIONAL
RETURNING value(rv_name) TYPE ty_char100 ,
popup_dataset_id
IMPORTING iv_id TYPE lcl_form=>ty_s_hierarchy-id
iv_same_sheet TYPE flag OPTIONAL
CHANGING cv_dataset_id TYPE lcl_form=>ty_s_hierarchy-id ,
popup_dataset_series
CHANGING cs_form_prop TYPE lcl_form=>ty_s_properties ,
popup_dataset_field
IMPORTING iv_dataset_id TYPE lcl_form=>ty_s_hierarchy-id
CHANGING cv_fieldname TYPE string ,
popup_devclass
IMPORTING iv_objid TYPE any
RETURNING value(rv_devclass) TYPE tadir-devclass ,
popup_pgbrk
IMPORTING iv_top TYPE any OPTIONAL
iv_left TYPE any OPTIONAL
CHANGING cv_shift TYPE any ,
popup_printtitles
IMPORTING iv_sheetname TYPE any
iv_rows TYPE any OPTIONAL
iv_cols TYPE any OPTIONAL
CHANGING cv_comp_id TYPE any ,
popup_grid_fldseq
CHANGING cs_form_prop TYPE lcl_form=>ty_s_properties ,
popup_grid_fldprop
CHANGING cs_form_prop TYPE lcl_form=>ty_s_properties ,
popup_vbs_code_editor
CHANGING cv_vbs_code TYPE any
cv_cancel TYPE flag OPTIONAL ,
popup_vbs_tables
CHANGING cv_vbs_tables TYPE any
cv_cancel TYPE flag OPTIONAL .

CLASS-METHODS:
class_constructor ,
popup_postprocessing_info ,
popup_to_confirm
IMPORTING iv_text TYPE any
iv_text_button_1 TYPE any OPTIONAL
iv_icon_button_1 TYPE any OPTIONAL
iv_text_button_2 TYPE any OPTIONAL
iv_icon_button_2 TYPE any OPTIONAL
RETURNING value(rv_answer_okey) TYPE flag ,
popup_to_get_value
IMPORTING iv_title TYPE any OPTIONAL
iv_tabname TYPE any
iv_fieldname TYPE any
iv_fieldtext TYPE any OPTIONAL
iv_obligatory TYPE any OPTIONAL
iv_2tabname TYPE any OPTIONAL
iv_2fieldname TYPE any OPTIONAL
iv_2fieldtext TYPE any OPTIONAL
iv_2obligatory TYPE any OPTIONAL
iv_3tabname TYPE any OPTIONAL
iv_3fieldname TYPE any OPTIONAL
iv_3fieldtext TYPE any OPTIONAL
iv_3obligatory TYPE any OPTIONAL
iv_4tabname TYPE any OPTIONAL
iv_4fieldname TYPE any OPTIONAL
iv_4fieldtext TYPE any OPTIONAL
iv_4obligatory TYPE any OPTIONAL
EXPORTING ev_cancel TYPE any
CHANGING cv_value TYPE any
cv_2value TYPE any OPTIONAL
cv_3value TYPE any OPTIONAL
cv_4value TYPE any OPTIONAL ,
popup_to_decide
IMPORTING iv_title TYPE any OPTIONAL
iv_text TYPE any OPTIONAL
iv_text2 TYPE any OPTIONAL
iv_text_rb1 TYPE any
iv_text_rb2 TYPE any OPTIONAL
iv_text_rb3 TYPE any OPTIONAL
iv_text_rb4 TYPE any OPTIONAL
iv_text_rb5 TYPE any OPTIONAL
iv_text_rb6 TYPE any OPTIONAL
iv_text_rb7 TYPE any OPTIONAL
iv_text_rb8 TYPE any OPTIONAL
EXPORTING ev_cancel TYPE flag
CHANGING cv_selected_rb TYPE any ,
popup_sheetprotection_static
EXPORTING ev_cancel TYPE any
CHANGING cs_sheetprotection TYPE ty_s_sheetprotection ,
popup_sheetprotection_password
EXPORTING ev_cancel TYPE any
CHANGING cv_password TYPE any ,
popup_file_select
IMPORTING iv_title TYPE any OPTIONAL
RETURNING value(rv_fullpath) TYPE string ,
popup_formname_f4
CHANGING cv_formname TYPE any .

CLASS-DATA:
popup_ctxtfield_id TYPE snodetext-id ,
popup_ctxtfield_cancel TYPE flag .
CONSTANTS:
BEGIN OF c_action ,
edit TYPE syucomm VALUE 'EDIT' ,
create TYPE syucomm VALUE 'CREATE' ,
crea_t TYPE syucomm VALUE 'CREA_T' ,
copy TYPE syucomm VALUE 'COPY' ,
delete TYPE syucomm VALUE 'DELETE' ,
export TYPE syucomm VALUE 'EXPORT' ,
import TYPE syucomm VALUE 'IMPORT' ,
help TYPE syucomm VALUE 'HELP' ,
preset TYPE syucomm VALUE 'PRESET' ,
prese2 TYPE syucomm VALUE 'PRESE2' ,
END OF c_action .

PRIVATE SECTION.
DATA:
r_cont_splitter1 TYPE REF TO cl_gui_splitter_container ,
r_cont_splitter2 TYPE REF TO cl_gui_splitter_container ,
r_cont_4splitter2 TYPE REF TO cl_gui_container ,
r_cont_root TYPE REF TO cl_gui_docking_container ,
r_cont_4formtree TYPE REF TO cl_gui_container ,
r_cont_4protab TYPE REF TO cl_gui_container ,
r_cont_4template TYPE REF TO cl_gui_container ,
r_appltoolbar TYPE REF TO lcl_wb_appltoolbar ,
r_excelole TYPE REF TO lcl_wb_ole ,
r_formtree TYPE REF TO lcl_wb_formtree ,
r_protab TYPE REF TO lcl_wb_protab ,
r_formtemplate TYPE REF TO lcl_formtemplate .
DATA:
v_oletempl_viewmode TYPE flag ,
v_initialized TYPE flag ,
v_mass_processing TYPE flag ,
v_extension TYPE ty_char10 .
METHODS:
init_containers ,
init_appltoolbar ,
init_excelole ,
init_formtree ,
init_protab ,
tech_template_sync
IMPORTING iv_new_extension TYPE ty_char10 OPTIONAL
RETURNING value(rv_okey) TYPE flag ,
tech_fcode_dispatch
IMPORTING iv_fcode TYPE any
iv_form_id TYPE snode-id OPTIONAL ,
tech_presets_dt_save ,
tech_presets_rt_save ,
hndl_fcode_appl
FOR EVENT evnt_fcode OF lcl_wb_appltoolbar
IMPORTING ev_fcode ,
hndl_fcode_comp
FOR EVENT evnt_fcode OF lcl_wb_formtree
IMPORTING ev_fcode ev_form_id ,
hndl_fcode_ptab
FOR EVENT evnt_fcode OF lcl_wb_protab
IMPORTING ev_fcode ev_form_id ,
hndl_fcode_tmpl
FOR EVENT evnt_fcode OF lcl_wb_ole
IMPORTING ev_fcode ,
hndl_comp_move
FOR EVENT evnt_comp_move OF lcl_wb_formtree
IMPORTING sender ev_drag_drop_object ,
actn_appl_save ,
actn_appl_save_as ,
actn_appl_activate ,
actn_appl_actualize ,
actn_appl_viewmode ,
actn_appl_help
IMPORTING iv_url TYPE any ,
actn_appl_presets ,
actn_appl_presets_designtime ,
actn_appl_presets_runtime ,
actn_appl_close_template ,
actn_appl_mass_processing ,
actn_comp_selected
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_comp_add
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_child TYPE flag OPTIONAL
iv_sibling TYPE flag OPTIONAL ,
actn_comp_clone
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_comp_clone_mass ,
actn_comp_delete
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_comp_delete_mass ,
actn_comp_tbshift_mass ,
actn_comp_move_sibling_up
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_comp_move_sibling_down
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_compname_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_formdescr_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_format_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_context_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_cb_loop_from_to
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_cb_relpath_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_relpath_mn TYPE flag OPTIONAL , " -->> manual
actn_cb_relpath_delete
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_cb_val_vld_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_attrpath_f4 TYPE flag OPTIONAL " -->> search-help
iv_attrpath_mn TYPE flag OPTIONAL " -->> manual
iv_attrpath_del TYPE flag OPTIONAL
iv_for1_template TYPE flag OPTIONAL
iv_for1_relpath TYPE flag OPTIONAL
iv_for1_dataset_id TYPE flag OPTIONAL
iv_for1_dataset_fld TYPE flag OPTIONAL
iv_for2_template TYPE flag OPTIONAL
iv_for2_relpath TYPE flag OPTIONAL ,
actn_cb_apr_relpath_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_relpath_f4 TYPE flag OPTIONAL " -->> search-help
iv_relpath_mn TYPE flag OPTIONAL , " -->> manual
actn_cb_apr_relpath_delete
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_cb_cellrng_relpth_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_relpath_f4 TYPE flag OPTIONAL " -->> search-help
iv_relpath_mn TYPE flag OPTIONAL , " -->> manual
actn_cb_cellrng_relpth_delete
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_cb_val_relpath_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_relpath_f4 TYPE flag OPTIONAL " -->> search-help
iv_relpath_mn TYPE flag OPTIONAL " -->> manual
iv_charpos TYPE flag OPTIONAL
iv_convertion TYPE flag OPTIONAL
iv_sub TYPE flag OPTIONAL ,
actn_cb_val_relpath_delete
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_tb_val_layout_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_valformula TYPE flag OPTIONAL
iv_valmatrix TYPE flag OPTIONAL ,
actn_tb_sheetname_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_tb_sheetname_delete
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_tb_sheetstate
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_tb_sheetprotection
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_change TYPE flag OPTIONAL
iv_delete TYPE flag OPTIONAL ,
actn_tb_area_delete
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_tb_area_setcells
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_tb_area_settextmark
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_tb_direction_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_tb_colrow_prop_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_columns TYPE flag OPTIONAL
iv_rows TYPE flag OPTIONAL ,
actn_tb_colrow_group_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_clp TYPE flag OPTIONAL
iv_columns TYPE flag OPTIONAL
iv_rows TYPE flag OPTIONAL ,
actn_tb_drwstatflag_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_tb_drwstatname_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_change TYPE flag OPTIONAL
iv_delete TYPE flag OPTIONAL ,
actn_tb_drwsize_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_fit TYPE flag OPTIONAL
iv_context TYPE flag OPTIONAL
iv_h_f4 TYPE flag OPTIONAL
iv_h_mn TYPE flag OPTIONAL
iv_w_f4 TYPE flag OPTIONAL
iv_w_mn TYPE flag OPTIONAL ,
actn_tb_pgbreak
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_top TYPE flag OPTIONAL
iv_left TYPE flag OPTIONAL
iv_nopgbreak TYPE flag DEFAULT space ,
actn_tb_printtitles
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_cols TYPE flag OPTIONAL
iv_rows TYPE flag OPTIONAL
iv_change TYPE flag OPTIONAL
iv_delete TYPE flag OPTIONAL ,
actn_tb_mergecells_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_tb_autofitmerged_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_rows TYPE flag DEFAULT space
iv_cols TYPE flag DEFAULT space ,
actn_tb_respattern_place
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_before TYPE flag DEFAULT space
iv_after TYPE flag DEFAULT space ,
actn_draft_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id ,
actn_tree_layout_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_rotate TYPE flag OPTIONAL
iv_stru TYPE flag OPTIONAL
iv_stru_exp_coll TYPE flag OPTIONAL
iv_head TYPE flag OPTIONAL
iv_col_hier TYPE flag OPTIONAL
iv_col_hier_after TYPE flag OPTIONAL
iv_col_hier_shift TYPE flag OPTIONAL
iv_col_othr TYPE flag OPTIONAL
iv_col_othr_width TYPE flag OPTIONAL
iv_col_othr_allowformulas
TYPE flag OPTIONAL ,
actn_grid_layout_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_rotate TYPE flag OPTIONAL
iv_head TYPE flag OPTIONAL
iv_head_titles TYPE flag OPTIONAL
iv_fldseq TYPE flag OPTIONAL
iv_fldprop TYPE flag OPTIONAL
iv_allowformulas TYPE flag OPTIONAL ,
actn_chart_change
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_model_change TYPE flag OPTIONAL
iv_model_delete TYPE flag OPTIONAL
iv_title TYPE flag OPTIONAL
iv_title_catax TYPE flag OPTIONAL
iv_title_valax TYPE flag OPTIONAL
iv_title_series TYPE flag OPTIONAL
iv_dtset_change TYPE flag OPTIONAL
iv_dtset_delete TYPE flag OPTIONAL
iv_dtset_series TYPE flag OPTIONAL ,
actn_postproccessing
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_vbs_code TYPE flag OPTIONAL
iv_vbs_tables TYPE flag OPTIONAL ,
actn_root_others
IMPORTING iv_alvtree_nkey TYPE lvc_nkey
iv_form_id TYPE snode-id
iv_definednames_dont_remove TYPE flag OPTIONAL .

ENDCLASS . "lcl_workbench DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_workbench IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_workbench IMPLEMENTATION .
METHOD class_constructor .
tech_presets_dt_load( ) .
tech_presets_rt_load( ) .
ENDMETHOD . "class_constructor
METHOD constructor .
super->constructor( ) .

IF v_gui_available IS INITIAL .
MESSAGE e000(lp)
WITH v_text-t125 " text: Process is flowing in OFF-line mode
RAISING process_terminated .
ENDIF .

CASE iv_action .
WHEN lcl_workbench=>c_action-edit . action_edit( EXPORTING iv_formname =
iv_formname EXCEPTIONS OTHERS = 1 ) .
WHEN lcl_workbench=>c_action-create . action_create( EXPORTING iv_formname =
iv_formname EXCEPTIONS OTHERS = 1 ) .
WHEN lcl_workbench=>c_action-crea_t . action_create( EXPORTING iv_formname =
iv_formname iv_with_template = abap_on EXCEPTIONS OTHERS = 1 ) .
WHEN lcl_workbench=>c_action-copy . action_copy( EXPORTING iv_formname =
iv_formname EXCEPTIONS OTHERS = 1 ) .
WHEN lcl_workbench=>c_action-delete . action_delete( EXPORTING iv_formname =
iv_formname EXCEPTIONS OTHERS = 1 ) .
WHEN lcl_workbench=>c_action-export . action_export( EXPORTING iv_formname =
iv_formname EXCEPTIONS OTHERS = 1 ) .
WHEN lcl_workbench=>c_action-import . action_import( EXPORTING iv_formname =
iv_formname EXCEPTIONS OTHERS = 1 ) .
WHEN lcl_workbench=>c_action-help . actn_appl_help( iv_url = v_text-
url1 ) .
WHEN lcl_workbench=>c_action-preset . actn_appl_presets( ) .
WHEN OTHERS .
MESSAGE e000(lp)
WITH v_text-t104 "text: Function has not been processed
RAISING process_terminated .
ENDCASE .
CHECK sy-subrc NE 0 .

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno


WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING process_terminated .

ENDMETHOD . "constructor
METHOD free .
tech_presets_dt_save( ) .

IF r_appltoolbar IS BOUND .
r_appltoolbar->free( ) .
FREE r_appltoolbar .
ENDIF .
IF r_excelole IS BOUND .
r_excelole->free( ) .
FREE r_excelole .
ENDIF .
IF r_formtree IS BOUND .
r_formtree->free( ) .
FREE r_formtree .
ENDIF .
IF r_protab IS BOUND .
r_protab->free( ) .
FREE r_protab .
ENDIF .
ENDMETHOD . "free
METHOD action_edit .
IF iv_formname IS INITIAL .
MESSAGE s000(lp) WITH v_text-t013 " text: Specify a name of the form
RAISING process_terminated .

ELSEIF lcl_form=>get_devclass( iv_formname ) IS INITIAL .


MESSAGE i000(lp)
WITH v_text-t016 " text: Form is not found
':' iv_formname
RAISING process_terminated .
ENDIF .

CREATE OBJECT r_formtemplate


EXPORTING
iv_formname = iv_formname
iv_create_new = space
iv_editor = abap_on
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
RAISE process_terminated .
ENDIF .

ENDMETHOD . "action_edit
METHOD action_create .
IF iv_formname IS INITIAL .
MESSAGE s000(lp) WITH v_text-t013 " text: Specify a name of the form
RAISING process_terminated .

ELSEIF lcl_form=>get_devclass( iv_formname ) IS NOT INITIAL .


MESSAGE i000(lp)
WITH v_text-t014 " text: A form already exists with the
name
iv_formname
RAISING process_terminated .
ENDIF .

DATA lv_template_path TYPE string .


IF iv_with_template IS NOT INITIAL .
lv_template_path = popup_file_select( v_text-t209 ) . " text: Upload XLSX-
template from frontend
IF lv_template_path IS INITIAL .
MESSAGE s000(lp) WITH v_text-t100 " text: Operation was terminated by the
user
RAISING process_terminated .
ENDIF .
ENDIF .

CREATE OBJECT r_formtemplate


EXPORTING
iv_formname = iv_formname
iv_create_new = abap_on
iv_editor = abap_on
iv_template_path = lv_template_path
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
RAISE process_terminated .
ENDIF .

r_formtemplate->autostructure_create( ) .
ENDMETHOD . "action_create
METHOD action_copy .
IF iv_formname IS INITIAL .
MESSAGE s000(lp) WITH v_text-t013 " text: Specify a name of the form
RAISING process_terminated .

ELSEIF lcl_form=>get_devclass( iv_formname ) IS INITIAL .


MESSAGE i000(lp)
WITH v_text-t016 " text: Form is not found
':' iv_formname
RAISING process_terminated .
ENDIF .

DATA:
ls_oldkey TYPE wwwdatatab ,
ls_newkey TYPE wwwdatatab ,
lv_formname_new TYPE ty_char30 ,
lv_cancel TYPE flag .

popup_to_get_value(
EXPORTING iv_title = v_text-t166 " text: Save as...
iv_tabname = 'MASSD_F4_ATT'
iv_fieldname = 'TABNAME'
iv_fieldtext = v_text-t167 " text: New form name
iv_obligatory = abap_on
IMPORTING ev_cancel = lv_cancel
CHANGING cv_value = lv_formname_new ) .

CHECK lv_cancel IS INITIAL .

IF lv_formname_new EQ iv_formname .
MESSAGE i000(lp) WITH v_text-t168 " text: Specify another form name
RAISING process_terminated .
ENDIF .

IF lcl_form=>get_devclass( lv_formname_new ) IS NOT INITIAL .


MESSAGE i000(lp)
WITH v_text-t014 " text: A form already exists with the
name
lv_formname_new
RAISING process_terminated .
ENDIF .

ls_oldkey-relid = lcl_form=>c_relid .
ls_oldkey-objid = lcl_form=>conv_formname_ei( iv_formname ) .

ls_newkey-relid = lcl_form=>c_relid .
ls_newkey-objid = lcl_form=>conv_formname_ei( lv_formname_new ) .

CALL FUNCTION 'COPY_WEB_OBJECT'


EXPORTING
oldkey = ls_oldkey
newkey = ls_newkey.

* return new form name to parameter of initial screen


new_formname_to_selscreen( lv_formname_new ) .

ENDMETHOD . "action_copy
METHOD action_delete .
IF iv_formname IS INITIAL .
MESSAGE s000(lp) WITH v_text-t013 " text: Specify a name of the form
RAISING process_terminated .

ELSEIF lcl_form=>get_devclass( iv_formname ) IS INITIAL .


MESSAGE i000(lp)
WITH v_text-t016 " text: Form is not found
':' iv_formname
RAISING process_terminated .
ENDIF .

DATA ls_key TYPE wwwdatatab .


DATA lv_text TYPE ty_char100 .

IF abap_on EQ lcl_form=>enq_check( iv_formname ) .


MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING process_terminated .
ENDIF .

CONCATENATE v_text-t101 " text: Delete form


'?' iv_formname
INTO lv_text SEPARATED BY space .
CHECK abap_on EQ popup_to_confirm( iv_text = lv_text ) .

ls_key-relid = lcl_form=>c_relid .
ls_key-objid = lcl_form=>conv_formname_ei( iv_formname ) .

CALL FUNCTION 'DELETE_WEB_OBJECT'


EXPORTING
key = ls_key
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
IF sy-subrc EQ 0 .
MESSAGE i000(lp)
WITH v_text-t017 " text: Form
iv_formname
v_text-t102 . " text: was deleted
ELSE .
MESSAGE i000(lp)
WITH v_text-t016 " text: Form is not found
':' iv_formname
RAISING process_terminated .
ENDIF .

ENDMETHOD . "action_delete
METHOD action_export .
IF iv_formname IS INITIAL .
MESSAGE s000(lp) WITH v_text-t013 " text: Specify a name of the form
RAISING process_terminated .

ELSEIF lcl_form=>get_devclass( iv_formname ) IS INITIAL .


MESSAGE i000(lp)
WITH v_text-t016 " text: Form is not found
':' iv_formname
RAISING process_terminated .
ENDIF .

DATA:
ls_key TYPE wwwdatatab ,
lt_mime TYPE STANDARD TABLE OF w3mime ,
lv_fullpath TYPE string ,
lv_directory TYPE string ,
lv_filename TYPE string ,
lv_fileseparator TYPE ty_char1 ,
lv_filesize TYPE ty_char10 ,
lv_filesize_i TYPE i .

* get full path for saving file


cl_gui_frontend_services=>directory_browse(
CHANGING selected_folder = lv_directory
EXCEPTIONS OTHERS = 4 ) .
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING process_terminated .
ENDIF .
CHECK lv_directory IS NOT INITIAL .

cl_gui_frontend_services=>get_file_separator(
CHANGING file_separator = lv_fileseparator
EXCEPTIONS OTHERS = 4 ) .
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING process_terminated .
ENDIF .

CONCATENATE iv_formname c_extension_xlsx


INTO lv_filename .

CONCATENATE lv_directory
lv_fileseparator
lv_filename
INTO lv_fullpath .

* get content
ls_key-relid = lcl_form=>c_relid .
ls_key-objid = lcl_form=>conv_formname_ei( iv_formname ) .

CALL FUNCTION 'WWWDATA_IMPORT'


EXPORTING
key = ls_key
TABLES
mime = lt_mime
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING process_terminated .
ENDIF .

CALL FUNCTION 'WWWPARAMS_READ'


EXPORTING
relid = ls_key-relid
objid = ls_key-objid
name = 'filesize'
IMPORTING
value = lv_filesize.
CHECK lv_filesize GT 0 .
lv_filesize_i = lv_filesize .
* save content as file with specified full path
cl_gui_frontend_services=>gui_download(
EXPORTING filename = lv_fullpath
filetype = 'BIN'
bin_filesize = lv_filesize_i
CHANGING data_tab = lt_mime
EXCEPTIONS OTHERS = 24 ) .
IF sy-subrc EQ 0 .
MESSAGE i000(lp)
WITH v_text-t256 " text: File
lv_filename
v_text-t257 " text: is saved in the directory
lv_directory .
ELSE .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING process_terminated .
ENDIF .

ENDMETHOD . "action_export
METHOD action_import .

DATA:
ls_key TYPE wwwdatatab ,
lv_formname TYPE massd_f4_att-tabname ,
lv_formdescr TYPE wwwdatatab-text .
DATA:
lv_cancel TYPE flag .

* popup to get Form name and Description


popup_to_get_value(
EXPORTING iv_title = v_text-t013 " text: Specify a name of the
form
iv_tabname = 'MASSD_F4_ATT'
iv_fieldname = 'TABNAME'
iv_fieldtext = v_text-t167 " text: New form name
iv_obligatory = abap_on
iv_2tabname = 'WWWDATATAB'
iv_2fieldname = 'TEXT'
iv_2fieldtext = v_text-t058 " text: Description
iv_2obligatory = space
IMPORTING ev_cancel = lv_cancel
CHANGING cv_value = lv_formname
cv_2value = lv_formdescr ) .
CHECK lv_cancel IS INITIAL .

* check existence
IF lcl_form=>get_devclass( lv_formname ) IS NOT INITIAL .
MESSAGE i000(lp)
WITH v_text-t014 " text: A form already exists with the
name
lv_formname
RAISING process_terminated .
ENDIF .

* lock an object
IF lcl_form=>enq_lock( iv_formname = lv_formname ) IS NOT INITIAL .
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING process_terminated .
ENDIF .

* upload file
ls_key-relid = lcl_form=>c_relid .
ls_key-objid = lcl_form=>conv_formname_ei( lv_formname ) .
ls_key-text = lv_formdescr .

CALL FUNCTION 'UPLOAD_WEB_OBJECT'


EXPORTING
key = ls_key.

* unlock the object


lcl_form=>enq_unlock( iv_formname = lv_formname ) .

* return new form name to parameter of initial screen


new_formname_to_selscreen( lv_formname ) .

ENDMETHOD . "action_import
METHOD new_formname_to_selscreen .
* return new form name to parameter of initial screen
DATA:
ls_callstack TYPE abap_callstack_line ,
lt_callstack TYPE abap_callstack ,
lv_form_parname TYPE string .
FIELD-SYMBOLS:
<lv_form> TYPE ANY .

CALL FUNCTION 'SYSTEM_CALLSTACK'


IMPORTING
callstack = lt_callstack[].

READ TABLE lt_callstack INTO ls_callstack


WITH KEY blocktype = 'MODULE (PAI)'
blockname = '%_END_OF_SCREEN'
flag_system = 'X' .
CHECK sy-subrc EQ 0 .

CONCATENATE `(` ls_callstack-mainprogram `)PV_FORM` INTO lv_form_parname .

ASSIGN (lv_form_parname) TO <lv_form> .


CHECK <lv_form> IS ASSIGNED .

CATCH SYSTEM-EXCEPTIONS OTHERS = 0 .


<lv_form> = iv_formname .
ENDCATCH .
ENDMETHOD . "new_formname_to_selscreen
METHOD pbo .
CHECK v_initialized IS INITIAL .
v_initialized = abap_on .

init_containers( ) .
init_appltoolbar( ) .
init_excelole( ) .
init_formtree( ) .
init_protab( ) .
ENDMETHOD . "pbo
METHOD init_containers .
CREATE OBJECT r_cont_root
EXPORTING
lifetime = cntl_lifetime_dynpro
extension = cl_gui_docking_container=>ws_maximizebox
EXCEPTIONS
OTHERS = 6.

CREATE OBJECT r_cont_splitter1


EXPORTING
parent = r_cont_root
rows = 1
columns = 2
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .
r_cont_splitter1->set_row_mode(
EXPORTING mode = cl_gui_splitter_container=>mode_absolute ) .
r_cont_splitter1->set_column_width( id = 1 width = s_presets_dt-leftframe_width
) .

r_cont_4splitter2 = r_cont_splitter1->get_container( row = 1 column = 1 ) .


r_cont_4template = r_cont_splitter1->get_container( row = 1 column = 2 ) .

CREATE OBJECT r_cont_splitter2


EXPORTING
parent = r_cont_4splitter2
rows = 2
columns = 1
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .

r_cont_4formtree = r_cont_splitter2->get_container( row = 1 column = 1 ) .


r_cont_4protab = r_cont_splitter2->get_container( row = 2 column = 1 ) .
ENDMETHOD . "init_containers
METHOD init_appltoolbar .
CREATE OBJECT r_appltoolbar
EXPORTING
iv_mass_processing = v_mass_processing
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .
SET HANDLER hndl_fcode_appl FOR r_appltoolbar .
ENDMETHOD . "init_appltoolbar
METHOD init_excelole .
DATA lv_document_rawdata TYPE xstring .
lv_document_rawdata = r_formtemplate->r_exceltemplate->rawdata_get( ) .
CREATE OBJECT r_excelole
EXPORTING
ir_container = r_cont_4template
iv_document_rawdata = lv_document_rawdata
iv_viewmode = v_oletempl_viewmode " --> inplace/ flow
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .

SET HANDLER hndl_fcode_tmpl FOR r_excelole .

CALL FUNCTION 'FLUSH'


EXCEPTIONS
OTHERS = 0.
cl_gui_cfw=>dispatch( ) .

ENDMETHOD . "init_excelole
METHOD init_formtree .
CREATE OBJECT r_formtree
EXPORTING
ir_container = r_cont_4formtree
ir_formtemplate = r_formtemplate
iv_mass_processing = v_mass_processing
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .

SET HANDLER hndl_fcode_comp FOR r_formtree .


SET HANDLER hndl_comp_move FOR r_formtree .
ENDMETHOD . "init_formtree
METHOD init_protab .
CREATE OBJECT r_protab
EXPORTING
ir_container = r_cont_4protab
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .

SET HANDLER hndl_fcode_ptab FOR r_protab .

r_protab->redraw( ir_formtemplate = r_formtemplate


iv_form_id = r_formtemplate->v_root_id ) .
ENDMETHOD . "init_protab
METHOD tech_template_sync .
msg_init( ) .
r_excelole->application_availability_check( ) .
msg_add( r_excelole ) .
CHECK v_retcode NE c_retcode-error .

DATA:
lt_document_table TYPE tsfmime ,
lv_document_size TYPE i ,
lv_extension TYPE ty_char10 .

IF r_formtemplate->r_exceltemplate IS BOUND .
CASE iv_new_extension .
WHEN space . lv_extension = r_formtemplate->r_exceltemplate->v_extension .
WHEN OTHERS. lv_extension = iv_new_extension .
ENDCASE .
ENDIF .
IF lv_extension IS INITIAL .
lv_extension = c_extension_xlsx .
ENDIF .

r_excelole->rawdata_get_as_table(
EXPORTING iv_extension = lv_extension
IMPORTING et_document_table = lt_document_table
ev_document_size = lv_document_size ) .
IF lt_document_table[] IS INITIAL
OR lv_document_size IS INITIAL .
MESSAGE e000(lp) WITH v_text-t173 INTO v_dummy . " text: an actual data were
not obtained from Excel !
msg_syst_catch( ) .
v_retcode = c_retcode-error .

ELSE .
r_formtemplate->set_template(
EXPORTING it_document_table = lt_document_table
iv_document_size = lv_document_size ) .
IF r_formtemplate->v_retcode EQ c_retcode-error .
MESSAGE e000(lp) WITH v_text-t336 " text: Error while reading
template file
INTO v_dummy .
msg_syst_catch( ) .

MESSAGE e000(lp) WITH v_text-t332 " text: The most probable


reason is
v_text-t333 " text: Your current SAP
GUI version
v_text-t334 " text: does not work
properly with MS Excel.
v_text-t335 " text: Try to update SAP
GUI to latest version .
INTO v_dummy .
msg_syst_catch( ) .
v_retcode = c_retcode-error .
ENDIF .
ENDIF .

CHECK v_retcode NE c_retcode-error .


r_formtemplate->check_subtree( ) .

ENDMETHOD . "tech_template_sync
METHOD tech_fcode_dispatch .
*======================================================================
* preliminary works
*======================================================================
msg_init( ) .

IF iv_form_id IS SUPPLIED
AND iv_form_id IS NOT INITIAL .
DATA ls_links TYPE lcl_wb_formtree=>ty_s_links .
READ TABLE r_formtree->t_links INTO ls_links WITH KEY form_id = iv_form_id .
CHECK sy-subrc EQ 0 .
ENDIF .

CASE iv_fcode .
WHEN lcl_wb_formtree=>c_fcode-comp_selected .
r_excelole->selection_get( ) .
WHEN lcl_wb_formtree=>c_fcode-comp_move_sibling_up
OR lcl_wb_formtree=>c_fcode-comp_move_sibling_down .
WHEN OTHERS .
tech_template_sync( ) .
CHECK msg_check_errors_and_show( me ) IS INITIAL .
ENDCASE .

*======================================================================
* command processing
*======================================================================
DEFINE mk_callmethod .
call method me->&1
exporting
iv_alvtree_nkey = ls_links-alvtree_nkey
iv_form_id = ls_links-form_id.
END-OF-DEFINITION .

DEFINE mk_callmeth_2 .
call method me->&1
exporting
iv_alvtree_nkey = ls_links-alvtree_nkey
iv_form_id = ls_links-form_id
&2 = abap_on.
END-OF-DEFINITION .

CASE iv_fcode .
* ----------->> application
WHEN lcl_wb_appltoolbar=>c_fcode-appl_save . actn_appl_save( ) .
WHEN lcl_wb_appltoolbar=>c_fcode-appl_save_as .
actn_appl_save_as( ) .
WHEN lcl_wb_appltoolbar=>c_fcode-appl_activate . actn_appl_activate( )
.
WHEN lcl_wb_appltoolbar=>c_fcode-appl_actualize .
actn_appl_actualize( ) .
WHEN lcl_wb_appltoolbar=>c_fcode-appl_viewmode . actn_appl_viewmode( )
.
WHEN lcl_wb_appltoolbar=>c_fcode-appl_help .
actn_appl_help( iv_url = v_text-url2 ) .
WHEN lcl_wb_appltoolbar=>c_fcode-appl_presets_designtime .
actn_appl_presets_designtime( ) .
WHEN lcl_wb_appltoolbar=>c_fcode-appl_presets_runtime .
actn_appl_presets_runtime( ) .
WHEN lcl_wb_appltoolbar=>c_fcode-appl_mass_processing .
actn_appl_mass_processing( ) .

* ----------->> ole-template
WHEN lcl_wb_ole=>c_fcode-close_template .
actn_appl_close_template( ) .

* ----------->> components tree


WHEN lcl_wb_formtree=>c_fcode-comp_selected . mk_callmethod:
actn_comp_selected .
WHEN lcl_wb_formtree=>c_fcode-comp_add_child . mk_callmeth_2:
actn_comp_add iv_child .
* actn_comp_add(
* iv_alvtree_nkey = ls_links-alvtree_nkey
* iv_form_id = ls_links-form_id
* iv_child = abap_on ) .
WHEN lcl_wb_formtree=>c_fcode-comp_add_sibling . mk_callmeth_2:
actn_comp_add iv_sibling .
WHEN lcl_wb_formtree=>c_fcode-comp_clone . mk_callmethod:
actn_comp_clone .
WHEN lcl_wb_formtree=>c_fcode-comp_clone_mass . actn_comp_clone_mass(
) .
WHEN lcl_wb_formtree=>c_fcode-comp_delete . mk_callmethod:
actn_comp_delete .
WHEN lcl_wb_formtree=>c_fcode-comp_delete_mass .
actn_comp_delete_mass( ) .
WHEN lcl_wb_formtree=>c_fcode-comp_move_sibling_up . mk_callmethod:
actn_comp_move_sibling_up .
WHEN lcl_wb_formtree=>c_fcode-comp_move_sibling_down . mk_callmethod:
actn_comp_move_sibling_down .
WHEN lcl_wb_formtree=>c_fcode-comp_tbshift_mass .
actn_comp_tbshift_mass( ) .

* ----------->> properties tab


WHEN lcl_wb_protab=>c_fcode-formdescr_change . mk_callmethod:
actn_formdescr_change .
WHEN lcl_wb_protab=>c_fcode-format_change . mk_callmethod:
actn_format_change .
WHEN lcl_wb_protab=>c_fcode-context_change . mk_callmethod:
actn_context_change .
WHEN lcl_wb_protab=>c_fcode-compname_change . mk_callmethod:
actn_compname_change .
WHEN lcl_wb_protab=>c_fcode-cb_loop_from_to . mk_callmethod:
actn_cb_loop_from_to .
WHEN lcl_wb_protab=>c_fcode-cb_relpath_change_mn . mk_callmeth_2:
actn_cb_relpath_change iv_relpath_mn . " -->> manual
WHEN lcl_wb_protab=>c_fcode-cb_relpath_change_f4 . mk_callmethod:
actn_cb_relpath_change .
WHEN lcl_wb_protab=>c_fcode-cb_relpath_delete . mk_callmethod:
actn_cb_relpath_delete .
WHEN lcl_wb_protab=>c_fcode-cb_aprpath_change_mn . mk_callmeth_2:
actn_cb_apr_relpath_change iv_relpath_mn . " -->> manual
WHEN lcl_wb_protab=>c_fcode-cb_aprpath_change_f4 . mk_callmeth_2:
actn_cb_apr_relpath_change iv_relpath_f4 . " -->> search-help
WHEN lcl_wb_protab=>c_fcode-cb_aprchar_change . mk_callmethod:
actn_cb_apr_relpath_change .
WHEN lcl_wb_protab=>c_fcode-cb_aprpath_delete . mk_callmethod:
actn_cb_apr_relpath_delete .

WHEN lcl_wb_protab=>c_fcode-cb_cellrng_change_mn . mk_callmeth_2:


actn_cb_cellrng_relpth_change iv_relpath_mn . " -->> manual
WHEN lcl_wb_protab=>c_fcode-cb_cellrng_change_f4 . mk_callmeth_2:
actn_cb_cellrng_relpth_change iv_relpath_f4 . " -->> search-help
WHEN lcl_wb_protab=>c_fcode-cb_cellrng_change_char . mk_callmethod:
actn_cb_cellrng_relpth_change .
WHEN lcl_wb_protab=>c_fcode-cb_cellrng_delete . mk_callmethod:
actn_cb_cellrng_relpth_delete .

WHEN lcl_wb_protab=>c_fcode-cb_valpath_change_mn . mk_callmeth_2:


actn_cb_val_relpath_change iv_relpath_mn . " -->> manual
WHEN lcl_wb_protab=>c_fcode-cb_valpath_change_f4 . mk_callmeth_2:
actn_cb_val_relpath_change iv_relpath_f4 . " -->> search-help
WHEN lcl_wb_protab=>c_fcode-cb_valpath_sub . mk_callmeth_2:
actn_cb_val_relpath_change iv_sub .
WHEN lcl_wb_protab=>c_fcode-cb_valchar_change . mk_callmeth_2:
actn_cb_val_relpath_change iv_charpos .
WHEN lcl_wb_protab=>c_fcode-cb_valpath_delete . mk_callmethod:
actn_cb_val_relpath_delete .
WHEN lcl_wb_protab=>c_fcode-cb_valconv_change . mk_callmeth_2:
actn_cb_val_relpath_change iv_convertion .
WHEN lcl_wb_protab=>c_fcode-tb_valstring_change . mk_callmethod:
actn_tb_val_layout_change .
WHEN lcl_wb_protab=>c_fcode-tb_valformula_change . mk_callmeth_2:
actn_tb_val_layout_change iv_valformula .
WHEN lcl_wb_protab=>c_fcode-tb_valmatrix_change . mk_callmeth_2:
actn_tb_val_layout_change iv_valmatrix .

WHEN lcl_wb_protab=>c_fcode-cb_valvld_attrpath_change_f4 . mk_callmeth_2:


actn_cb_val_vld_change iv_attrpath_f4 .
WHEN lcl_wb_protab=>c_fcode-cb_valvld_attrpath_change_mn . mk_callmeth_2:
actn_cb_val_vld_change iv_attrpath_mn .
WHEN lcl_wb_protab=>c_fcode-cb_valvld_attrpath_delete . mk_callmeth_2:
actn_cb_val_vld_change iv_attrpath_del .
WHEN lcl_wb_protab=>c_fcode-cb_valvld_for1_template . mk_callmeth_2:
actn_cb_val_vld_change iv_for1_template .
WHEN lcl_wb_protab=>c_fcode-cb_valvld_for1_relpath . mk_callmeth_2:
actn_cb_val_vld_change iv_for1_relpath .
WHEN lcl_wb_protab=>c_fcode-cb_valvld_for1_dataset_id . mk_callmeth_2:
actn_cb_val_vld_change iv_for1_dataset_id .
WHEN lcl_wb_protab=>c_fcode-cb_valvld_for1_dataset_fld . mk_callmeth_2:
actn_cb_val_vld_change iv_for1_dataset_fld .
WHEN lcl_wb_protab=>c_fcode-cb_valvld_for2_template . mk_callmeth_2:
actn_cb_val_vld_change iv_for2_template .
WHEN lcl_wb_protab=>c_fcode-cb_valvld_for2_relpath . mk_callmeth_2:
actn_cb_val_vld_change iv_for2_relpath .

WHEN lcl_wb_protab=>c_fcode-tb_sheetname_change . mk_callmethod:


actn_tb_sheetname_change .
WHEN lcl_wb_protab=>c_fcode-tb_sheetname_delete . mk_callmethod:
actn_tb_sheetname_delete .
WHEN lcl_wb_protab=>c_fcode-tb_sheetstate . mk_callmethod:
actn_tb_sheetstate .
WHEN lcl_wb_protab=>c_fcode-tb_sheetprot_change . mk_callmeth_2:
actn_tb_sheetprotection iv_change .
WHEN lcl_wb_protab=>c_fcode-tb_sheetprot_delete . mk_callmeth_2:
actn_tb_sheetprotection iv_delete .
WHEN lcl_wb_protab=>c_fcode-tb_area_setcells . mk_callmethod:
actn_tb_area_setcells .
WHEN lcl_wb_protab=>c_fcode-tb_area_settextmark . mk_callmethod:
actn_tb_area_settextmark .
WHEN lcl_wb_protab=>c_fcode-tb_area_delete . mk_callmethod:
actn_tb_area_delete .
WHEN lcl_wb_protab=>c_fcode-tb_direction_change . mk_callmethod:
actn_tb_direction_change .
WHEN lcl_wb_protab=>c_fcode-tb_rowprop_change . mk_callmeth_2:
actn_tb_colrow_prop_change iv_rows .
WHEN lcl_wb_protab=>c_fcode-tb_colprop_change . mk_callmeth_2:
actn_tb_colrow_prop_change iv_columns .
WHEN lcl_wb_protab=>c_fcode-tb_rowgroup_change . mk_callmeth_2:
actn_tb_colrow_group_change iv_rows .
WHEN lcl_wb_protab=>c_fcode-tb_colgroup_change . mk_callmeth_2:
actn_tb_colrow_group_change iv_columns .
WHEN lcl_wb_protab=>c_fcode-tb_rowgroup_clp_change .
actn_tb_colrow_group_change(
iv_alvtree_nkey = ls_links-alvtree_nkey
iv_form_id = ls_links-form_id
iv_clp = abap_on
iv_rows = abap_on ) .
WHEN lcl_wb_protab=>c_fcode-tb_colgroup_clp_change .
actn_tb_colrow_group_change(
iv_alvtree_nkey = ls_links-alvtree_nkey
iv_form_id = ls_links-form_id
iv_clp = abap_on
iv_columns = abap_on ) .
WHEN lcl_wb_protab=>c_fcode-tb_drwstflag_change . mk_callmethod:
actn_tb_drwstatflag_change .
WHEN lcl_wb_protab=>c_fcode-tb_drwstname_change . mk_callmeth_2:
actn_tb_drwstatname_change iv_change .
WHEN lcl_wb_protab=>c_fcode-tb_drwstname_delete . mk_callmeth_2:
actn_tb_drwstatname_change iv_delete .
WHEN lcl_wb_protab=>c_fcode-tb_drwsize_fit . mk_callmeth_2:
actn_tb_drwsize_change iv_fit .
WHEN lcl_wb_protab=>c_fcode-tb_drwsize_context . mk_callmeth_2:
actn_tb_drwsize_change iv_context .
WHEN lcl_wb_protab=>c_fcode-tb_drwsize_h_f4 . mk_callmeth_2:
actn_tb_drwsize_change iv_h_f4 .
WHEN lcl_wb_protab=>c_fcode-tb_drwsize_h_mn . mk_callmeth_2:
actn_tb_drwsize_change iv_h_mn .
WHEN lcl_wb_protab=>c_fcode-tb_drwsize_w_f4 . mk_callmeth_2:
actn_tb_drwsize_change iv_w_f4 .
WHEN lcl_wb_protab=>c_fcode-tb_drwsize_w_mn . mk_callmeth_2:
actn_tb_drwsize_change iv_w_mn .
WHEN lcl_wb_protab=>c_fcode-tb_printtitles_rows_change .
actn_tb_printtitles(
iv_alvtree_nkey = ls_links-alvtree_nkey
iv_form_id = ls_links-form_id
iv_rows = abap_on
iv_change = abap_on ) .
WHEN lcl_wb_protab=>c_fcode-tb_printtitles_rows_delete .
actn_tb_printtitles(
iv_alvtree_nkey = ls_links-alvtree_nkey
iv_form_id = ls_links-form_id
iv_rows = abap_on
iv_delete = abap_on ) .
WHEN lcl_wb_protab=>c_fcode-tb_printtitles_cols_change .
actn_tb_printtitles(
iv_alvtree_nkey = ls_links-alvtree_nkey
iv_form_id = ls_links-form_id
iv_cols = abap_on
iv_change = abap_on ) .
WHEN lcl_wb_protab=>c_fcode-tb_printtitles_cols_delete .
actn_tb_printtitles(
iv_alvtree_nkey = ls_links-alvtree_nkey
iv_form_id = ls_links-form_id
iv_cols = abap_on
iv_delete = abap_on ) .
WHEN lcl_wb_protab=>c_fcode-tb_pgbreak_left . mk_callmeth_2:
actn_tb_pgbreak iv_left .
WHEN lcl_wb_protab=>c_fcode-tb_pgbreak_top . mk_callmeth_2:
actn_tb_pgbreak iv_top .
WHEN lcl_wb_protab=>c_fcode-tb_nopgbreak_left .
actn_tb_pgbreak(
iv_alvtree_nkey = ls_links-alvtree_nkey
iv_form_id = ls_links-form_id
iv_left = abap_on
iv_nopgbreak = abap_on ) .
WHEN lcl_wb_protab=>c_fcode-tb_nopgbreak_top .
actn_tb_pgbreak(
iv_alvtree_nkey = ls_links-alvtree_nkey
iv_form_id = ls_links-form_id
iv_top = abap_on
iv_nopgbreak = abap_on ) .
WHEN lcl_wb_protab=>c_fcode-tb_mergecells_change . mk_callmethod:
actn_tb_mergecells_change .
WHEN lcl_wb_protab=>c_fcode-tb_autofitmerged_off .
actn_tb_autofitmerged_change(
iv_alvtree_nkey = ls_links-alvtree_nkey
iv_form_id = ls_links-form_id
iv_rows = abap_off
iv_cols = abap_off ) .
WHEN lcl_wb_protab=>c_fcode-tb_autofitmerged_r .
actn_tb_autofitmerged_change(
iv_alvtree_nkey = ls_links-alvtree_nkey
iv_form_id = ls_links-form_id
iv_rows = abap_on
iv_cols = abap_off ) .
WHEN lcl_wb_protab=>c_fcode-tb_respattern_before .
actn_tb_respattern_place(
iv_alvtree_nkey = ls_links-alvtree_nkey
iv_form_id = ls_links-form_id
iv_before = abap_on ) .
WHEN lcl_wb_protab=>c_fcode-tb_respattern_after .
actn_tb_respattern_place(
iv_alvtree_nkey = ls_links-alvtree_nkey
iv_form_id = ls_links-form_id
iv_after = abap_on ) .
WHEN lcl_wb_protab=>c_fcode-draft_change . mk_callmethod:
actn_draft_change .
WHEN lcl_wb_protab=>c_fcode-tree_layout_rotate . mk_callmeth_2:
actn_tree_layout_change iv_rotate .
WHEN lcl_wb_protab=>c_fcode-tree_layout_exp_coll . mk_callmeth_2:
actn_tree_layout_change iv_stru_exp_coll .
WHEN lcl_wb_protab=>c_fcode-tree_layout_stru . mk_callmeth_2:
actn_tree_layout_change iv_stru .
WHEN lcl_wb_protab=>c_fcode-tree_layout_head . mk_callmeth_2:
actn_tree_layout_change iv_head .
WHEN lcl_wb_protab=>c_fcode-tree_layout_colhier . mk_callmeth_2:
actn_tree_layout_change iv_col_hier .
WHEN lcl_wb_protab=>c_fcode-tree_layout_colhier_after . mk_callmeth_2:
actn_tree_layout_change iv_col_hier_after .
WHEN lcl_wb_protab=>c_fcode-tree_layout_colhier_shift . mk_callmeth_2:
actn_tree_layout_change iv_col_hier_shift .
WHEN lcl_wb_protab=>c_fcode-tree_layout_colother . mk_callmeth_2:
actn_tree_layout_change iv_col_othr .
WHEN lcl_wb_protab=>c_fcode-tree_layout_colother_wdh . mk_callmeth_2:
actn_tree_layout_change iv_col_othr_width .
WHEN lcl_wb_protab=>c_fcode-tree_layout_allowformulas . mk_callmeth_2:
actn_tree_layout_change iv_col_othr_allowformulas .
WHEN lcl_wb_protab=>c_fcode-grid_layout_rotate . mk_callmeth_2:
actn_grid_layout_change iv_rotate .
WHEN lcl_wb_protab=>c_fcode-grid_layout_head . mk_callmeth_2:
actn_grid_layout_change iv_head .
WHEN lcl_wb_protab=>c_fcode-grid_layout_head_titles . mk_callmeth_2:
actn_grid_layout_change iv_head_titles .
WHEN lcl_wb_protab=>c_fcode-grid_fldseq . mk_callmeth_2:
actn_grid_layout_change iv_fldseq .
WHEN lcl_wb_protab=>c_fcode-grid_fldprop . mk_callmeth_2:
actn_grid_layout_change iv_fldprop .
WHEN lcl_wb_protab=>c_fcode-grid_layout_allowformulas . mk_callmeth_2:
actn_grid_layout_change iv_allowformulas .
WHEN lcl_wb_protab=>c_fcode-chart_model_change . mk_callmeth_2:
actn_chart_change iv_model_change .
WHEN lcl_wb_protab=>c_fcode-chart_model_delete . mk_callmeth_2:
actn_chart_change iv_model_delete .
WHEN lcl_wb_protab=>c_fcode-chart_title . mk_callmeth_2:
actn_chart_change iv_title .
WHEN lcl_wb_protab=>c_fcode-chart_title_catax . mk_callmeth_2:
actn_chart_change iv_title_catax .
WHEN lcl_wb_protab=>c_fcode-chart_title_valax . mk_callmeth_2:
actn_chart_change iv_title_valax .
WHEN lcl_wb_protab=>c_fcode-chart_title_series . mk_callmeth_2:
actn_chart_change iv_title_series .
WHEN lcl_wb_protab=>c_fcode-chart_dtset_change . mk_callmeth_2:
actn_chart_change iv_dtset_change .
WHEN lcl_wb_protab=>c_fcode-chart_dtset_delete . mk_callmeth_2:
actn_chart_change iv_dtset_delete .
WHEN lcl_wb_protab=>c_fcode-chart_dtset_series . mk_callmeth_2:
actn_chart_change iv_dtset_series .
WHEN lcl_wb_protab=>c_fcode-postproc_vbs_code . mk_callmeth_2:
actn_postproccessing iv_vbs_code .
WHEN lcl_wb_protab=>c_fcode-postproc_vbs_tables . mk_callmeth_2:
actn_postproccessing iv_vbs_tables .
WHEN lcl_wb_protab=>c_fcode-definednames_dont_remove . mk_callmeth_2:
actn_root_others iv_definednames_dont_remove .
* ----------->>
WHEN OTHERS .
MESSAGE s000(lp) WITH v_text-t104 . " text: Function has not been
processed
ENDCASE .

*======================================================================
* post-processing
*======================================================================
CASE iv_fcode .
WHEN lcl_wb_formtree=>c_fcode-comp_selected .
WHEN OTHERS .
r_formtree->redraw( ir_formtemplate = r_formtemplate ) .
ENDCASE .

ENDMETHOD . "tech_fcode_dispatch
METHOD popup_postprocessing_info .
DATA lv_button_pressed TYPE i .
DATA lv_url(30000) TYPE c .

IF sy-langu EQ 'R' .
CALL FUNCTION 'POPUP_FOR_INTERACTION'
EXPORTING
headline = 'Внимание!'
text1 = 'Данная опция реализована Пост-обработкой OLE/VBScript.'
text2 = 'Применяйте пост-обработку при крайней необходимости,
т.к. :'
text3 = '- она будет игнорироваться в фоновом режиме
выполнения;'
text4 = '- она может существенно замедлить вывод формы;'
button_1 = icon_checked
button_2 = '@0S@ Подробнее'
IMPORTING
button_pressed = lv_button_pressed.
ELSE .
CALL FUNCTION 'POPUP_FOR_INTERACTION'
EXPORTING
headline = 'Notice!'
text1 = 'The option is implemented via OLE/VBScript Post-
processing.'
text2 = 'Use post-processing only when it is quite necessary,
because:'
text3 = '- it will be ignored in background run-time mode;'
text4 = '- it is able to reduce performance;'
button_1 = icon_checked
button_2 = '@0S@ More info about it'
IMPORTING
button_pressed = lv_button_pressed.
ENDIF .
CHECK lv_button_pressed EQ 2 .

lv_url = v_text-url3 .
CALL FUNCTION 'CALL_BROWSER'
EXPORTING
url = lv_url
EXCEPTIONS
OTHERS = 6.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
ENDIF .
ENDMETHOD . "popup_postprocessing_info
METHOD popup_to_confirm .
DATA:
lv_answer TYPE ty_char1 ,
lv_text TYPE ty_char1024 ,
lv_text_button_1 TYPE ty_char1024 ,
lv_icon_button_1 TYPE icon-name ,
lv_text_button_2 TYPE ty_char1024 ,
lv_icon_button_2 TYPE icon-name .
lv_text = iv_text .

IF iv_text_button_1 IS INITIAL .
lv_text_button_1 = v_text-t106 . " text: Continue
ELSE .
lv_text_button_1 = iv_text_button_1 .
ENDIF .
IF iv_icon_button_1 IS INITIAL .
lv_icon_button_1 = 'ICON_OKAY' .
ELSE .
lv_icon_button_1 = iv_icon_button_1 .
ENDIF .
IF iv_text_button_2 IS INITIAL .
lv_text_button_2 = v_text-t107 . " text: Cancel
ELSE .
lv_text_button_2 = iv_text_button_2 .
ENDIF .
IF iv_icon_button_2 IS INITIAL .
lv_icon_button_2 = 'ICON_CANCEL' .
ELSE .
lv_icon_button_2 = iv_icon_button_2 .
ENDIF .

CALL FUNCTION 'POPUP_TO_CONFIRM'


EXPORTING
titlebar = v_text-t105 " text: Notice!
text_question = lv_text
text_button_1 = lv_text_button_1
icon_button_1 = lv_icon_button_1
text_button_2 = lv_text_button_2
icon_button_2 = lv_icon_button_2
default_button = '2'
display_cancel_button = space
IMPORTING
answer = lv_answer
EXCEPTIONS
OTHERS = 0.
IF lv_answer EQ 2 .
rv_answer_okey = abap_off .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
ELSE .
rv_answer_okey = abap_on .
ENDIF .

ENDMETHOD . "popup_to_confirm
METHOD popup_to_get_value .
DATA:
lv_retcode TYPE ty_char1 ,
ls_fields TYPE sval ,
lt_fields TYPE STANDARD TABLE OF sval .

CLEAR ev_cancel .

ls_fields-tabname = iv_tabname .
ls_fields-fieldname = iv_fieldname .
ls_fields-fieldtext = iv_fieldtext .
ls_fields-value = cv_value .
ls_fields-field_obl = iv_obligatory .
APPEND ls_fields TO lt_fields .

IF iv_2tabname IS NOT INITIAL .


ls_fields-tabname = iv_2tabname .
ls_fields-fieldname = iv_2fieldname .
ls_fields-fieldtext = iv_2fieldtext .
ls_fields-value = cv_2value .
ls_fields-field_obl = iv_2obligatory .
APPEND ls_fields TO lt_fields .
ENDIF .

IF iv_3tabname IS NOT INITIAL .


ls_fields-tabname = iv_3tabname .
ls_fields-fieldname = iv_3fieldname .
ls_fields-fieldtext = iv_3fieldtext .
ls_fields-value = cv_3value .
ls_fields-field_obl = iv_3obligatory .
APPEND ls_fields TO lt_fields .
ENDIF .

IF iv_4tabname IS NOT INITIAL .


ls_fields-tabname = iv_4tabname .
ls_fields-fieldname = iv_4fieldname .
ls_fields-fieldtext = iv_4fieldtext .
ls_fields-value = cv_4value .
ls_fields-field_obl = iv_4obligatory .
APPEND ls_fields TO lt_fields .
ENDIF .

CALL FUNCTION 'POPUP_GET_VALUES'


EXPORTING
popup_title = iv_title
IMPORTING
returncode = lv_retcode
TABLES
fields = lt_fields
EXCEPTIONS
OTHERS = 2.
IF sy-subrc NE 0 .
ev_cancel = abap_on .
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .
IF lv_retcode NE space .
ev_cancel = abap_on .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
EXIT .
ENDIF .

LOOP AT lt_fields INTO ls_fields .


CASE sy-tabix .
WHEN 1 . cv_value = ls_fields-value .
WHEN 2 . cv_2value = ls_fields-value .
WHEN 3 . cv_3value = ls_fields-value .
WHEN 4 . cv_4value = ls_fields-value .
ENDCASE .
ENDLOOP .
ENDMETHOD . "popup_to_get_value
METHOD popup_sheetprotection_static .
DATA:
lv_answer TYPE ty_char1 ,
ls_decide_lines TYPE spopli ,
lt_decide_lines TYPE STANDARD TABLE OF spopli .

CLEAR ev_cancel .

ls_decide_lines-selflag = cs_sheetprotection-selectlockedcells .
ls_decide_lines-varoption = v_text-t302 . " text: Select Locked Cells
ls_decide_lines-varoption+64(1) = '`' .
APPEND ls_decide_lines TO lt_decide_lines .

ls_decide_lines-selflag = cs_sheetprotection-selectunlockedcells .
ls_decide_lines-varoption = v_text-t303 . " text: Select Unlocked Cells
APPEND ls_decide_lines TO lt_decide_lines .

ls_decide_lines-selflag = cs_sheetprotection-formatcells .
ls_decide_lines-varoption = v_text-t304 . " text: Format Cells
APPEND ls_decide_lines TO lt_decide_lines .

ls_decide_lines-selflag = cs_sheetprotection-formatcolumns .
ls_decide_lines-varoption = v_text-t305 . " text: Format Columns
APPEND ls_decide_lines TO lt_decide_lines .

ls_decide_lines-selflag = cs_sheetprotection-formatrows .
ls_decide_lines-varoption = v_text-t306 . " text: Format Rows
APPEND ls_decide_lines TO lt_decide_lines .

ls_decide_lines-selflag = cs_sheetprotection-insertcolumns .
ls_decide_lines-varoption = v_text-t307 . " text: Insert Columns
APPEND ls_decide_lines TO lt_decide_lines .

ls_decide_lines-selflag = cs_sheetprotection-insertrows .
ls_decide_lines-varoption = v_text-t308 . " text: Insert Rows
APPEND ls_decide_lines TO lt_decide_lines .

ls_decide_lines-selflag = cs_sheetprotection-inserthyperlinks .
ls_decide_lines-varoption = v_text-t309 . " text: Insert Hyperlinks
APPEND ls_decide_lines TO lt_decide_lines .

ls_decide_lines-selflag = cs_sheetprotection-deletecolumns .
ls_decide_lines-varoption = v_text-t310 . " text: Delete Columns
APPEND ls_decide_lines TO lt_decide_lines .

ls_decide_lines-selflag = cs_sheetprotection-deleterows .
ls_decide_lines-varoption = v_text-t311 . " text: Delete Rows
APPEND ls_decide_lines TO lt_decide_lines .

ls_decide_lines-selflag = cs_sheetprotection-sort .
ls_decide_lines-varoption = v_text-t312 . " text: Sort
APPEND ls_decide_lines TO lt_decide_lines .

ls_decide_lines-selflag = cs_sheetprotection-autofilter .
ls_decide_lines-varoption = v_text-t313 . " text: Auto Filter
APPEND ls_decide_lines TO lt_decide_lines .

ls_decide_lines-selflag = cs_sheetprotection-pivottables .
ls_decide_lines-varoption = v_text-t314 . " text: Pivot Tables
APPEND ls_decide_lines TO lt_decide_lines .

ls_decide_lines-selflag = cs_sheetprotection-objects .
ls_decide_lines-varoption = v_text-t315 . " text: Objects
APPEND ls_decide_lines TO lt_decide_lines .

ls_decide_lines-selflag = cs_sheetprotection-scenarios .
ls_decide_lines-varoption = v_text-t316 . " text: Scenarios
APPEND ls_decide_lines TO lt_decide_lines .

CALL FUNCTION 'POPUP_TO_DECIDE_LIST'


EXPORTING
mark_flag = abap_on "-->> checkbox
mark_max = 0
textline1 = v_text-t317 " text: Allow all users of this
worksheet to:
titel = v_text-t298 " text: Sheet protection
IMPORTING
answer = lv_answer
TABLES
t_spopli = lt_decide_lines
EXCEPTIONS
OTHERS = 0.

CASE lv_answer .
WHEN 'A' .
ev_cancel = abap_on .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
RETURN .

WHEN OTHERS .
LOOP AT lt_decide_lines INTO ls_decide_lines .
CASE sy-tabix .
WHEN 01 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-
selectlockedcells .
WHEN 02 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-
selectunlockedcells .
WHEN 03 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-
formatcells .
WHEN 04 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-
formatcolumns .
WHEN 05 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-
formatrows .
WHEN 06 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-
insertcolumns .
WHEN 07 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-
insertrows .
WHEN 08 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-
inserthyperlinks .
WHEN 09 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-
deletecolumns .
WHEN 10 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-
deleterows .
WHEN 11 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-sort .
WHEN 12 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-
autofilter .
WHEN 13 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-
pivottables .
WHEN 14 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-
objects .
WHEN 15 . MOVE ls_decide_lines-selflag TO cs_sheetprotection-
scenarios .
ENDCASE .
ENDLOOP .
ENDCASE .

ENDMETHOD . "popup_sheetprotection_static
METHOD popup_sheetprotection_password .

* --------------------------
* password | hash-function
* --------------------------
* SAP12345 | EBF1
* QwErTy | DEFB
* Hello555 | E5C7
* %tgb^yhn | 8541
* R$^*h&!19fS | 9922
* DL7!Etj@6$s | C8F6
* R(dkS$9!@Sn | C931
* --------------------------

CLEAR ev_cancel .

DATA:
lv_selected TYPE ty_char1,
lv_text_rb1 TYPE string .

CONCATENATE '@MG@'
v_text-t276 " -->> text: Off
INTO lv_text_rb1 .

CASE cv_password .
WHEN 'EBF1' . lv_selected = '2' .
WHEN 'DEFB' . lv_selected = '3' .
WHEN 'E5C7' . lv_selected = '4' .
WHEN '8541' . lv_selected = '5' .
WHEN '9922' . lv_selected = '6' .
WHEN 'C8F6' . lv_selected = '7' .
WHEN 'C931' . lv_selected = '8' .
WHEN OTHERS . lv_selected = '1' .
ENDCASE .

popup_to_decide( EXPORTING iv_title = v_text-t298 " -->>


text: Sheet protection
iv_text = v_text-t318 " -->>
text: Password to unprotect sheet:
iv_text_rb1 = lv_text_rb1
iv_text_rb2 = 'SAP12345'
iv_text_rb3 = 'QwErTy'
iv_text_rb4 = 'Hello555'
iv_text_rb5 = '%tgb^yhn'
iv_text_rb6 = 'R$^*h&!19fS'
iv_text_rb7 = 'DL7!Etj@6$s'
iv_text_rb8 = 'R(dkS$9!@Sn'
IMPORTING ev_cancel = ev_cancel
CHANGING cv_selected_rb = lv_selected ) .
CHECK ev_cancel IS INITIAL .
CASE lv_selected .
WHEN '1' . cv_password = space .
WHEN '2' . cv_password = 'EBF1' .
WHEN '3' . cv_password = 'DEFB' .
WHEN '4' . cv_password = 'E5C7' .
WHEN '5' . cv_password = '8541' .
WHEN '6' . cv_password = '9922' .
WHEN '7' . cv_password = 'C8F6' .
WHEN '8' . cv_password = 'C931' .
ENDCASE .

ENDMETHOD . "popup_sheetprotection_password
METHOD popup_to_decide .
CLEAR ev_cancel .

DATA:
lv_answer TYPE ty_char1 ,
lv_cursorline TYPE sy-lilli ,
ls_decide_lines TYPE spopli ,
lt_decide_lines TYPE STANDARD TABLE OF spopli .

ls_decide_lines-varoption = iv_text_rb1 .
ls_decide_lines-varoption+64(1) = '`' .
APPEND ls_decide_lines TO lt_decide_lines .
IF iv_text_rb2 IS SUPPLIED .
ls_decide_lines-varoption = iv_text_rb2 .
APPEND ls_decide_lines TO lt_decide_lines .
ENDIF .
IF iv_text_rb3 IS SUPPLIED .
ls_decide_lines-varoption = iv_text_rb3 .
APPEND ls_decide_lines TO lt_decide_lines .
ENDIF .
IF iv_text_rb4 IS SUPPLIED .
ls_decide_lines-varoption = iv_text_rb4 .
APPEND ls_decide_lines TO lt_decide_lines .
ENDIF .
IF iv_text_rb5 IS SUPPLIED .
ls_decide_lines-varoption = iv_text_rb5 .
APPEND ls_decide_lines TO lt_decide_lines .
ENDIF .
IF iv_text_rb6 IS SUPPLIED .
ls_decide_lines-varoption = iv_text_rb6 .
APPEND ls_decide_lines TO lt_decide_lines .
ENDIF .
IF iv_text_rb7 IS SUPPLIED .
ls_decide_lines-varoption = iv_text_rb7 .
APPEND ls_decide_lines TO lt_decide_lines .
ENDIF .
IF iv_text_rb8 IS SUPPLIED .
ls_decide_lines-varoption = iv_text_rb8 .
APPEND ls_decide_lines TO lt_decide_lines .
ENDIF .

lv_cursorline = cv_selected_rb .

CALL FUNCTION 'POPUP_TO_DECIDE_LIST'


EXPORTING
cursorline = lv_cursorline
mark_flag = space "-->> radiobutton
textline1 = iv_text
textline2 = iv_text2
titel = iv_title
IMPORTING
answer = lv_answer
TABLES
t_spopli = lt_decide_lines
EXCEPTIONS
OTHERS = 0.

CASE lv_answer .
WHEN 'A' .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by the
user
ev_cancel = abap_on .

WHEN OTHERS .
cv_selected_rb = lv_answer .
ENDCASE .

ENDMETHOD . "popup_to_decide
METHOD popup_file_select .
DATA:
lv_title TYPE string ,
lv_directory TYPE string ,
lv_directory_char TYPE ty_char255 ,
lv_rc TYPE i ,
lv_user_action TYPE i ,
lt_filetable TYPE filetable .
FIELD-SYMBOLS:
<filetable> TYPE file_table .
CONSTANTS:
lc_idparam_default_directory
TYPE tpara-paramid VALUE 'ZXLWB_DEFDIR_IMP'.

* -->> import default folder from ABAP-memory


GET PARAMETER ID lc_idparam_default_directory FIELD lv_directory_char ."#EC
EXISTS
lv_directory = lv_directory_char .

* -->> get XML-files


lv_title = iv_title .
cl_gui_frontend_services=>file_open_dialog(
EXPORTING window_title = lv_title
default_extension = '*.XLSX'
file_filter = 'XLSX-files (*.XLSX) |*.XLSX|'
initial_directory = lv_directory
multiselection = abap_off
CHANGING file_table = lt_filetable
rc = lv_rc
user_action = lv_user_action
EXCEPTIONS file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5 ).
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .
IF lv_user_action EQ cl_gui_frontend_services=>action_cancel
OR lt_filetable IS INITIAL .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
EXIT .
ENDIF .

READ TABLE lt_filetable ASSIGNING <filetable> INDEX 1 .


CHECK sy-subrc EQ 0 .
rv_fullpath = <filetable>-filename .

* -->> export default folder to ABAP-memory


CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = rv_fullpath
IMPORTING
file_path = lv_directory
EXCEPTIONS
OTHERS = 2.
IF sy-subrc EQ 0 .
lv_directory_char = lv_directory .
SET PARAMETER ID lc_idparam_default_directory FIELD lv_directory_char ."#EC
EXISTS
ENDIF .
ENDMETHOD . "popup_file_select
METHOD popup_compname .
DATA:
lv_fieldtext TYPE sval-fieldtext ,
ls_comp_types TYPE ty_s_comp_types .

CLEAR cv_retcode .

READ TABLE r_formtemplate->t_comp_types INTO ls_comp_types


WITH TABLE KEY comp_type = iv_comp_type .
CHECK sy-subrc EQ 0 .

CONCATENATE ls_comp_types-icon ls_comp_types-description


INTO lv_fieldtext SEPARATED BY space .

popup_to_get_value(
EXPORTING iv_title = v_text-t108 " text: Specify a unique name of
the component
iv_tabname = 'MASSD_F4_ATT'
iv_fieldname = 'TABNAME'
iv_fieldtext = lv_fieldtext
iv_obligatory = abap_on
iv_2tabname = 'WWWDATATAB'
iv_2fieldname = 'TEXT'
IMPORTING ev_cancel = cv_retcode
CHANGING cv_value = cv_comp_name
cv_2value = cv_comp_descr ) .
ENDMETHOD . "popup_compname
METHOD popup_comp_types .
CLEAR ev_cancel .
CLEAR ev_comp_type .
CLEAR ev_wizard_mode .

TYPES:
BEGIN OF ty_s_comp_types_f4 ,
order TYPE i ,
comp_type TYPE ty_comp_type ,
icon TYPE icon_d ,
description TYPE ty_char100 ,
icon2 TYPE icon_d ,
END OF ty_s_comp_types_f4 ,
ty_t_comp_types_f4 TYPE STANDARD TABLE OF ty_s_comp_types_f4 .
DATA:
ls_comp_types TYPE ty_s_comp_types .
DATA:
lv_title TYPE ty_char100 ,
lv_screen_end_line TYPE i ,
ls_fct_f4 TYPE lvc_s_fcat ,
lt_fct_f4 TYPE lvc_t_fcat ,
ls_excl_f4 TYPE lvc_s_excl ,
lt_excl_f4 TYPE lvc_t_excl ,
ls_selfield TYPE slis_selfield ,
lv_exit TYPE flag ,
lv_icon2_flag TYPE flag ,
ls_comp_types_f4 TYPE ty_s_comp_types_f4 ,
lt_comp_types_f4 TYPE ty_t_comp_types_f4 ,
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
ls_form_excp TYPE lcl_form=>ty_s_exceptions ,
lv_cancel TYPE flag ,
lv_cb_fullpath TYPE ty_comp_path ,
ls_comp_paths TYPE ty_s_ctxtmulti ,
lt_comp_paths TYPE ty_t_ctxtmulti .

LOOP AT it_comp_types INTO ls_comp_types .


CLEAR ls_comp_types_f4 .
MOVE-CORRESPONDING ls_comp_types TO ls_comp_types_f4 .
CASE ls_comp_types-comp_type .
WHEN lcl_form=>c_comp_type-sheet . ls_comp_types_f4-order = 1 .
WHEN lcl_form=>c_comp_type-folder . ls_comp_types_f4-order = 2 .
WHEN lcl_form=>c_comp_type-loopstep . ls_comp_types_f4-order = 3 .
WHEN lcl_form=>c_comp_type-pattern . ls_comp_types_f4-order = 4 .
WHEN lcl_form=>c_comp_type-respattern . ls_comp_types_f4-order = 5 .
WHEN lcl_form=>c_comp_type-field .
ls_comp_types_f4-order = 6 .
ls_comp_types_f4-icon2 = icon_wd_custom_controller . " -->> WIZARD
(create fields via context)
lv_icon2_flag = abap_on .
WHEN lcl_form=>c_comp_type-drawing . ls_comp_types_f4-order = 7 .
WHEN lcl_form=>c_comp_type-chart . ls_comp_types_f4-order = 8 .
WHEN lcl_form=>c_comp_type-grid . ls_comp_types_f4-order = 9 .
WHEN lcl_form=>c_comp_type-tree . ls_comp_types_f4-order = 10 .
ENDCASE .
APPEND ls_comp_types_f4 TO lt_comp_types_f4 .
ENDLOOP .
SORT lt_comp_types_f4 BY order .

ls_excl_f4-func = '%SC' . APPEND ls_excl_f4 TO lt_excl_f4 .


ls_excl_f4-func = '&RNT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OL0' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ODN' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OUP' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ILT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ELP' . APPEND ls_excl_f4 TO lt_excl_f4 .

ls_fct_f4-fieldname = 'ICON' .
ls_fct_f4-outputlen = 4 .
APPEND ls_fct_f4 TO lt_fct_f4 .
ls_fct_f4-fieldname = 'DESCRIPTION' .
IF lv_icon2_flag IS NOT INITIAL
AND iv_wizard_mode_allow IS NOT INITIAL .
ls_fct_f4-outputlen = 19 .
APPEND ls_fct_f4 TO lt_fct_f4 .
ls_fct_f4-fieldname = 'ICON2' .
ls_fct_f4-outputlen = 3 .
ELSE .
ls_fct_f4-outputlen = 22 .
ENDIF .
APPEND ls_fct_f4 TO lt_fct_f4 .

CASE iv_title .
WHEN space . lv_title = v_text-t121 . " text: Choose a component
WHEN OTHERS . lv_title = iv_title .
ENDCASE .

lv_screen_end_line = LINES( lt_comp_types_f4 ) + 6 .


IF lv_screen_end_line > 20 .
lv_screen_end_line = 20 .
ENDIF .

CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'


EXPORTING
i_title = lv_title
it_fieldcatalog = lt_fct_f4[]
it_status_excl = lt_excl_f4[]
i_screen_start_column = 10
i_screen_start_line = 5
i_screen_end_column = 40
i_screen_end_line = lv_screen_end_line
IMPORTING
es_selfield = ls_selfield
e_exit = ev_cancel
TABLES
t_outtab = lt_comp_types_f4[].

IF ev_cancel IS NOT INITIAL .


MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
EXIT .
ENDIF .

CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_comp_types_f4 INTO ls_comp_types_f4 INDEX ls_selfield-tabindex .
CHECK sy-subrc EQ 0 .
ev_comp_type = ls_comp_types_f4-comp_type .

IF ls_selfield-fieldname EQ 'ICON2'
AND ls_comp_types_f4-icon2 IS NOT INITIAL .
ev_wizard_mode = abap_on .
ENDIF .

ENDMETHOD . "popup_comp_types
METHOD popup_component .
TYPES:
BEGIN OF ty_s_outtab_f4 ,
id TYPE lcl_form=>ty_s_properties-dataset_id ,
comp_name TYPE lcl_form=>ty_s_properties-comp_name ,
sheet_compname TYPE lcl_form=>ty_s_properties-comp_name ,
END OF ty_s_outtab_f4 ,
ty_t_outtab_f4 TYPE STANDARD TABLE OF ty_s_outtab_f4 .
DATA:
lv_title TYPE ty_char100 ,
ls_fct_f4 TYPE lvc_s_fcat ,
lt_fct_f4 TYPE lvc_t_fcat ,
ls_excl_f4 TYPE lvc_s_excl ,
lt_excl_f4 TYPE lvc_t_excl ,
ls_selfield TYPE slis_selfield ,
ls_outtab_f4 TYPE ty_s_outtab_f4 ,
lt_outtab_f4 TYPE ty_t_outtab_f4 ,
ls_form_prop TYPE lcl_form=>ty_s_properties .
CLEAR:
es_form_prop ,
ev_cancel .

LOOP AT r_formtemplate->t_properties INTO ls_form_prop


WHERE comp_type EQ iv_comp_type .

CLEAR ls_outtab_f4 .
* Component Id / Name
ls_outtab_f4-id = ls_form_prop-id .
ls_outtab_f4-comp_name = ls_form_prop-comp_name .
* Sheet Name
r_formtemplate->node_get_legacy_info( EXPORTING iv_id = ls_form_prop-id
IMPORTING ev_tb_sheet_compname =
ls_outtab_f4-sheet_compname ) .
APPEND ls_outtab_f4 TO lt_outtab_f4 .
ENDLOOP .

CHECK lt_outtab_f4[] IS NOT INITIAL .

ls_excl_f4-func = '%SC' . APPEND ls_excl_f4 TO lt_excl_f4 .


ls_excl_f4-func = '&RNT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OL0' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ODN' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OUP' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ILT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ELP' . APPEND ls_excl_f4 TO lt_excl_f4 .

CLEAR ls_fct_f4 .
ls_fct_f4-fieldname = 'COMP_NAME' .
ls_fct_f4-coltext = v_text-t068 . " text: Component
ls_fct_f4-outputlen = 20 .
ls_fct_f4-hotspot = abap_on .
APPEND ls_fct_f4 TO lt_fct_f4 .
CLEAR ls_fct_f4 .
ls_fct_f4-fieldname = 'SHEET_COMPNAME' .
ls_fct_f4-coltext = v_text-t238 . " text: On the sheet
ls_fct_f4-outputlen = 15 .
ls_fct_f4-emphasize = 'C500' .
APPEND ls_fct_f4 TO lt_fct_f4 .

CASE iv_title .
WHEN space . lv_title = v_text-t068 . " text: Component
WHEN OTHERS . lv_title = iv_title .
ENDCASE .

CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'


EXPORTING
i_title = lv_title
it_fieldcatalog = lt_fct_f4[]
it_status_excl = lt_excl_f4[]
i_screen_start_column = 10
i_screen_start_line = 5
i_screen_end_column = 50
i_screen_end_line = 15
IMPORTING
es_selfield = ls_selfield
e_exit = ev_cancel
TABLES
t_outtab = lt_outtab_f4[].

IF ev_cancel IS NOT INITIAL .


MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
EXIT .
ENDIF .

CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_outtab_f4 INTO ls_outtab_f4 INDEX ls_selfield-tabindex .
CHECK sy-subrc EQ 0 .

READ TABLE r_formtemplate->t_properties INTO es_form_prop WITH KEY id =


ls_outtab_f4-id .

ENDMETHOD . "popup_component
METHOD popup_textmark .
DATA:
lv_fieldtext TYPE sval-fieldtext .

CLEAR cv_retcode .

CONCATENATE icon_fast_entry v_text-t272 " Text: Mark in the text


INTO lv_fieldtext SEPARATED BY space .

popup_to_get_value(
EXPORTING iv_title = v_text-t273 " Text: Char.sequence, which has
to be replaced by the Value
iv_tabname = 'BDCDATA'
iv_fieldname = 'FVAL'
iv_fieldtext = lv_fieldtext
iv_obligatory = abap_on
IMPORTING ev_cancel = cv_retcode
CHANGING cv_value = cv_textmark ) .
ENDMETHOD . "popup_textmark
METHOD popup_ctxtfield .
DATA:
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
ls_ctxt_hier TYPE lcl_context=>ty_s_hierarchy ,
lt_ctxt_hier TYPE lcl_context=>ty_t_hierarchy ,
lv_offset TYPE i ,
lv_exit TYPE flag ,
lv_fullpath TYPE string ,
ls_nodetab TYPE seucomm .

CLEAR popup_ctxtfield_id .
CLEAR popup_ctxtfield_cancel .
CLEAR cv_cancel .

*======================================================================
* get a subtree of relevant context components
*======================================================================
r_formtemplate->r_context->subtree_get(
EXPORTING iv_begin_fullpath = iv_cb_fullpath_parent
iv_f4_strategy = iv_f4_strategy
IMPORTING et_hierarchy = lt_ctxt_hier ) .
IF lt_ctxt_hier[] IS INITIAL .
MESSAGE s000(lp) WITH v_text-t109 . " text: Relevant nodes were not found in
the context .
EXIT .
ENDIF .

CASE iv_manual .
*======================================================================
WHEN space . " display the popup tree of search-help
*======================================================================
CALL FUNCTION 'RS_TREE_SET_CURRENT_TREE'
TABLES
nodeinfo = lt_ctxt_hier.

CALL FUNCTION 'RS_TREE_EXPAND'


EXPORTING
node_id = 1
EXCEPTIONS
OTHERS = 0.

CALL FUNCTION 'RS_TREE_LIST_DISPLAY'


EXPORTING
callback_program = sy-repid
callback_gui_status = 'POPUP_CTXTFIELD_CB_GUI_STATUS'
callback_user_command = 'POPUP_CTXTFIELD_UCOMM'
screen_start_column = 5
screen_start_line = 5
screen_end_column = 70
screen_end_line = 30
use_control = stree_use_control
layout_mode = stree_layout_compressed.

IF popup_ctxtfield_id IS INITIAL
OR popup_ctxtfield_cancel IS NOT INITIAL .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was
terminated by the user
cv_cancel = abap_on .
RETURN .
ELSE .
ls_ctxt_prop = r_formtemplate->r_context-
>node_get( popup_ctxtfield_id ) .
CLEAR popup_ctxtfield_id .

lv_offset = STRLEN( iv_cb_fullpath_parent ) .


cv_cb_relpath = ls_ctxt_prop-comp_fullpath+lv_offset .
SHIFT cv_cb_relpath LEFT DELETING LEADING '-' .
cv_cb_comp_type = ls_ctxt_prop-comp_type .
ENDIF .

*======================================================================
WHEN OTHERS . " display field for manually input of path
*======================================================================
DO .
* popup screen to manual input
popup_to_get_value(
EXPORTING iv_title = v_text-t077 " text: Binding with
context
iv_tabname = 'SYST'
iv_fieldname = 'ULINE'
iv_fieldtext = v_text-t077 " text: Binding with
context
iv_obligatory = abap_on
IMPORTING ev_cancel = cv_cancel
CHANGING cv_value = cv_cb_relpath ) .
IF cv_cancel IS NOT INITIAL .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was
terminated by the user
RETURN .
ENDIF .

* check specified path


CASE iv_cb_fullpath_parent .
WHEN space . lv_fullpath = cv_cb_relpath .
WHEN OTHERS . CONCATENATE iv_cb_fullpath_parent '-' cv_cb_relpath INTO
lv_fullpath .
ENDCASE .

READ TABLE r_formtemplate->r_context->t_properties INTO ls_ctxt_prop


WITH KEY comp_fullpath = lv_fullpath .
IF sy-subrc NE 0 .
MESSAGE s000(lp) WITH v_text-t110 . " text: Component is not allowed
for choice
CONTINUE .
ENDIF .

READ TABLE lt_ctxt_hier INTO ls_ctxt_hier WITH KEY hide = ls_ctxt_prop-id


.
IF sy-subrc NE 0 .
MESSAGE s000(lp) WITH v_text-t110 . " text: Component is not allowed
for choice
CONTINUE .
ENDIF .

MOVE-CORRESPONDING ls_ctxt_hier TO ls_nodetab .


CLEAR lv_exit .
popup_ctxtfield_callback(
EXPORTING is_nodetab = ls_nodetab
iv_uc = 'TRPI'
CHANGING cv_exit = lv_exit
cv_list_refresh = lv_exit ) .
IF lv_exit IS INITIAL .
CONTINUE .
ENDIF .

cv_cb_comp_type = ls_ctxt_prop-comp_type .
RETURN .
ENDDO .
ENDCASE .

ENDMETHOD . "popup_ctxtfield
METHOD popup_ctxtfield_callback .
CHECK iv_uc EQ 'TRPI' .

DATA ls_ctxt_prop TYPE lcl_context=>ty_s_properties .


DATA lv_allow TYPE flag .

ls_ctxt_prop = r_formtemplate->r_context->node_get( is_nodetab-hide ) .

DO 1 TIMES .
lv_allow = abap_off .
CASE r_formtemplate->r_context->v_f4_strategy .
WHEN r_formtemplate->r_context->c_f4_strategy-loopstep
OR r_formtemplate->r_context->c_f4_strategy-grid .
CHECK ls_ctxt_prop-comp_type EQ r_formtemplate->r_context->c_comp_type-
table .
WHEN r_formtemplate->r_context->c_f4_strategy-folder .
CHECK ls_ctxt_prop-comp_type EQ r_formtemplate->r_context->c_comp_type-
struct .
WHEN r_formtemplate->r_context->c_f4_strategy-value .
CHECK ls_ctxt_prop-comp_type EQ r_formtemplate->r_context->c_comp_type-
element
OR ls_ctxt_prop-comp_type EQ r_formtemplate->r_context->c_comp_type-
table .
WHEN r_formtemplate->r_context->c_f4_strategy-apr_relpath .
CHECK ls_ctxt_prop-comp_type EQ r_formtemplate->r_context->c_comp_type-
element .
WHEN r_formtemplate->r_context->c_f4_strategy-tree .
CHECK ls_ctxt_prop-comp_type EQ r_formtemplate->r_context->c_comp_type-
tree
OR ls_ctxt_prop-comp_type EQ r_formtemplate->r_context->c_comp_type-
tree_s .
WHEN OTHERS .
ENDCASE .
lv_allow = abap_on .
ENDDO .

IF lv_allow EQ abap_on .
popup_ctxtfield_id = ls_ctxt_prop-id .
cv_exit = abap_on .
ELSE .
MESSAGE s000(lp) WITH v_text-t110 . " text: Component is not allowed for
choice
ENDIF .
ENDMETHOD . "popup_ctxtfield_callback
METHOD popup_ctxtfield_sub .
* EXPORTING iv_cb_fullpath_parent TYPE any
* iv_cb_relpath TYPE ty_comp_path
* CHANGING cv_cb_val_sub_col TYPE any
* cv_cb_val_sub_row TYPE i
* cv_cancel TYPE flag OPTIONAL ,
TYPES:
BEGIN OF ty_s_outtab_f4 ,
id TYPE snode-id ,
fieldname TYPE ty_char100 ,
END OF ty_s_outtab_f4 ,
ty_t_outtab_f4 TYPE STANDARD TABLE OF ty_s_outtab_f4 .
DATA:
lv_begin_fullpath TYPE ty_comp_path ,
lt_ctxt_hier TYPE lcl_context=>ty_t_hierarchy ,
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
lt_ctxt_prop TYPE lcl_context=>ty_t_properties .
DATA:
lv_title TYPE ty_char100 ,
ls_fct_f4 TYPE lvc_s_fcat ,
lt_fct_f4 TYPE lvc_t_fcat ,
ls_excl_f4 TYPE lvc_s_excl ,
lt_excl_f4 TYPE lvc_t_excl ,
ls_selfield TYPE slis_selfield ,
lv_exit TYPE flag ,
ls_outtab_f4 TYPE ty_s_outtab_f4 ,
lt_outtab_f4 TYPE ty_t_outtab_f4 .

lv_begin_fullpath =
get_fullpath( iv_parent_fullpath = iv_cb_fullpath_parent
iv_relpath = iv_cb_relpath ) .

r_formtemplate->r_context->gridfld_get(
EXPORTING iv_begin_fullpath = lv_begin_fullpath
IMPORTING et_hierarchy = lt_ctxt_hier
et_properties = lt_ctxt_prop ) .

LOOP AT lt_ctxt_prop INTO ls_ctxt_prop


WHERE comp_type EQ r_formtemplate->r_context->c_comp_type-table
AND comp_fullpath NE lv_begin_fullpath .

CONCATENATE ls_ctxt_prop-comp_fullpath '*' INTO ls_ctxt_prop-comp_fullpath .


DELETE lt_ctxt_prop WHERE comp_fullpath CP ls_ctxt_prop-comp_fullpath .
ENDLOOP .

LOOP AT lt_ctxt_prop INTO ls_ctxt_prop


WHERE comp_type EQ lcl_context=>c_comp_type-element .

CLEAR ls_outtab_f4 .
ls_outtab_f4-id = ls_ctxt_prop-id .
CONCATENATE ls_ctxt_prop-comp_name '~~~('
ls_ctxt_prop-comp_shortdescr ')'
INTO ls_outtab_f4-fieldname .
TRANSLATE ls_outtab_f4-fieldname USING '~ ' .
APPEND ls_outtab_f4 TO lt_outtab_f4 .
ENDLOOP .

CHECK lt_outtab_f4[] IS NOT INITIAL .

ls_excl_f4-func = '%SC' . APPEND ls_excl_f4 TO lt_excl_f4 .


ls_excl_f4-func = '&RNT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OL0' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ODN' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OUP' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ILT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ELP' . APPEND ls_excl_f4 TO lt_excl_f4 .

ls_fct_f4-fieldname = 'FIELDNAME' .
ls_fct_f4-outputlen = 50 .
APPEND ls_fct_f4 TO lt_fct_f4 .

lv_title = v_text-t226 . " text: columns

CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'


EXPORTING
i_title = lv_title
it_fieldcatalog = lt_fct_f4[]
it_status_excl = lt_excl_f4[]
i_screen_start_column = 10
i_screen_start_line = 5
i_screen_end_column = 40
i_screen_end_line = 10
IMPORTING
es_selfield = ls_selfield
e_exit = cv_cancel
TABLES
t_outtab = lt_outtab_f4[].

IF cv_cancel IS NOT INITIAL .


MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
EXIT .
ENDIF .

CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_outtab_f4 INTO ls_outtab_f4 INDEX ls_selfield-tabindex .
CHECK sy-subrc EQ 0 .

READ TABLE lt_ctxt_prop INTO ls_ctxt_prop WITH KEY id = ls_outtab_f4-id .


CHECK sy-subrc EQ 0 .

cv_cb_val_sub_col = ls_ctxt_prop-comp_name .
cs_ctxt_prop = ls_ctxt_prop .

DO .
popup_to_get_value(
EXPORTING iv_title = v_text-t126 " -->> text: Specify new value
iv_tabname = 'ALPDBUIALV'
iv_fieldname = 'INDEX'
iv_fieldtext = v_text-t236 " -->> text: Table row
iv_obligatory = abap_on
IMPORTING ev_cancel = cv_cancel
CHANGING cv_value = cv_cb_val_sub_row ) .
CHECK cv_cancel IS NOT INITIAL
OR cv_cb_val_sub_row IS NOT INITIAL .
EXIT . " -->> do
ENDDO .

ENDMETHOD . "popup_ctxtfield_sub
METHOD popup_ctxtmulti .
DATA:
lt_hierarchy TYPE lcl_context=>ty_t_hierarchy ,
lv_offset TYPE i ,
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
ls_marktab TYPE snodetext ,
lt_marktab TYPE STANDARD TABLE OF snodetext ,
ls_comp_paths TYPE ty_s_ctxtmulti .

CLEAR popup_ctxtfield_cancel .
CLEAR ct_comp_paths .

* get a subtree of relevant context components


r_formtemplate->r_context->subtree_get(
EXPORTING iv_begin_fullpath = iv_cb_fullpath_parent
iv_f4_strategy = r_formtemplate->r_context->c_f4_strategy-value
IMPORTING et_hierarchy = lt_hierarchy ) .
IF lt_hierarchy[] IS INITIAL .
MESSAGE s000(lp) WITH v_text-t109 . " text: Relevant nodes were not found in
the context .
EXIT .
ENDIF .

* display the popup tree


CALL FUNCTION 'RS_TREE_SET_CURRENT_TREE'
TABLES
nodeinfo = lt_hierarchy.

CALL FUNCTION 'RS_TREE_EXPAND'


EXPORTING
node_id = 1
EXCEPTIONS
OTHERS = 0.

CALL FUNCTION 'RS_TREE_LIST_DISPLAY'


EXPORTING
callback_program = sy-repid
callback_gui_status = 'POPUP_CTXTMULTI_CB_GUI_STATUS'
callback_user_command = 'POPUP_CTXTMULTI_UCOMM'
screen_start_column = 5
screen_start_line = 5
screen_end_column = 70
screen_end_line = 30
use_control = stree_use_control
layout_mode = stree_layout_compressed.

IF popup_ctxtfield_cancel IS NOT INITIAL


OR sy-ucomm EQ 'CANC' .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by the
user
cv_cancel = abap_on .
ELSE .
CALL FUNCTION 'RS_TREE_GET_MARKED_NODES'
EXPORTING
with_subtree = space
TABLES
marktab = lt_marktab.
LOOP AT lt_marktab INTO ls_marktab .
ls_ctxt_prop = r_formtemplate->r_context->node_get( ls_marktab-hide ) .
CHECK ls_ctxt_prop-comp_type EQ r_formtemplate->r_context->c_comp_type-
element .

CLEAR ls_comp_paths .
ls_comp_paths-comp_type = lcl_form=>c_comp_type-field .
ls_comp_paths-comp_name = ls_ctxt_prop-comp_name .
ls_comp_paths-comp_shortdescr = ls_ctxt_prop-comp_shortdescr .

lv_offset = STRLEN( iv_cb_fullpath_parent ) .


ls_comp_paths-cb_relpath = ls_ctxt_prop-comp_fullpath+lv_offset .
SHIFT ls_comp_paths-cb_relpath LEFT DELETING LEADING '-' .

APPEND ls_comp_paths TO ct_comp_paths .


ENDLOOP .
IF ct_comp_paths[] IS INITIAL .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
cv_cancel = abap_on .
EXIT .
ENDIF .

ENDIF .

ENDMETHOD . "popup_ctxtmulti
METHOD popup_ctxtmulti_callback .

DATA:
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
lt_marktab TYPE STANDARD TABLE OF snodetext ,
ls_node_info TYPE snodetext .

CASE iv_uc .
WHEN 'CANC' .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
popup_ctxtfield_cancel = abap_on .
cv_exit = abap_on .

WHEN 'TRA1' .
CALL FUNCTION 'RS_TREE_GET_MARKED_NODES'
EXPORTING
with_subtree = space
TABLES
marktab = lt_marktab.
IF lt_marktab[] IS INITIAL .
MESSAGE s000(lp) WITH v_text-t181 . " text: Select components to be
added
ELSE .
cv_exit = abap_on .
ENDIF .

WHEN OTHERS .
ls_ctxt_prop = r_formtemplate->r_context->node_get( is_nodetab-hide ) .
IF ls_ctxt_prop-comp_type NE r_formtemplate->r_context->c_comp_type-element
.
MESSAGE s000(lp) WITH v_text-t110 . " text: Component is not allowed
for choice
EXIT .
ENDIF .

MOVE-CORRESPONDING is_nodetab TO ls_node_info .

CASE ls_node_info-nodeicon .
WHEN lcl_context=>c_comp_icon-element .
ls_node_info-nodeicon = icon_okay .
WHEN icon_okay .
ls_node_info-nodeicon = lcl_context=>c_comp_icon-element .
WHEN OTHERS .
ENDCASE.

CALL FUNCTION 'RS_TREE_SET_NODE'


EXPORTING
node_info = ls_node_info
EXCEPTIONS
OTHERS = 0.

CASE ls_node_info-nodeicon .
WHEN lcl_context=>c_comp_icon-element .
CALL FUNCTION 'RS_TREE_RESET_LOCK'
EXPORTING
node_id = ls_node_info-id
with_subtree = space
EXCEPTIONS
OTHERS = 0.

WHEN icon_okay .
CALL FUNCTION 'RS_TREE_SET_LOCK'
EXPORTING
node_id = ls_node_info-id
with_subtree = space
EXCEPTIONS
OTHERS = 0.

WHEN OTHERS .
ENDCASE.

cv_list_refresh = abap_on .
ENDCASE .

ENDMETHOD . "popup_ctxtmulti_callback
METHOD popup_charpos .
DATA:
lv_match TYPE i , "sval-value ,
lv_offset TYPE i , "sval-value ,
lv_title TYPE ty_char100 ,
lv_length TYPE i .

CLEAR cv_cancel .

WRITE iv_length TO lv_title LEFT-JUSTIFIED .


CONCATENATE v_text-t111 " text: Field length
lv_title
INTO lv_title SEPARATED BY space .

DO .
CLEAR lv_offset .
IF cv_offset IS NOT INITIAL .
lv_offset = cv_offset .
ENDIF .

CLEAR lv_match .
IF cv_match IS NOT INITIAL .
lv_match = cv_match .
ENDIF .

popup_to_get_value(
EXPORTING iv_title = lv_title
iv_tabname = 'SYST'
iv_fieldname = 'INDEX'
iv_fieldtext = v_text-t098 " text: from position
iv_2tabname = 'SYST'
iv_2fieldname = 'TABIX'
iv_2fieldtext = v_text-t024 " text: Chars number
IMPORTING ev_cancel = cv_cancel
CHANGING cv_value = lv_offset
cv_2value = lv_match ) .

IF cv_cancel IS NOT INITIAL .


EXIT . " -->> do
ENDIF .

lv_length = lv_offset + lv_match .


IF lv_length GT iv_length .
MESSAGE i000(lp)
WITH v_text-t024 lv_length " text: Chars number
v_text-t025 iv_length . " text: overlap the field length
ELSE .
cv_offset = lv_offset.
cv_match = lv_match .
EXIT . " -->> do
ENDIF .
ENDDO .

ENDMETHOD . "popup_charpos
METHOD popup_matrix_interval .
DATA lv_title TYPE ty_char100 .

CONCATENATE v_text-t216 '.' " text: Matrix (one char per cell)
v_text-t217 " text: Interval:
INTO lv_title SEPARATED BY space .

popup_to_get_value(
EXPORTING iv_title = lv_title
iv_tabname = 'SYST'
iv_fieldname = 'INDEX'
iv_fieldtext = v_text-t162 " text: column(s)
iv_2tabname = 'SYST'
iv_2fieldname = 'TABIX'
iv_2fieldtext = v_text-t163 " text: row(s)
CHANGING cv_value = cv_cols
cv_2value = cv_rows ) .
ENDMETHOD . "popup_matrix_interval
METHOD popup_tbsheet .
TYPES:
BEGIN OF ty_s_sheets_f4 ,
name TYPE ty_char31 ,
END OF ty_s_sheets_f4 ,
ty_t_sheets_f4 TYPE STANDARD TABLE OF ty_s_sheets_f4 .
DATA:
lv_title TYPE ty_char100 ,
ls_fct_f4 TYPE lvc_s_fcat ,
lt_fct_f4 TYPE lvc_t_fcat ,
ls_excl_f4 TYPE lvc_s_excl ,
lt_excl_f4 TYPE lvc_t_excl ,
ls_selfield TYPE slis_selfield ,
lv_exit TYPE flag ,
ls_sheets TYPE lcl_exceltemplate=>ty_s_sheets ,
ls_sheets_f4 TYPE ty_s_sheets_f4 ,
lt_sheets_f4 TYPE ty_t_sheets_f4 .

CLEAR rv_name .

LOOP AT r_formtemplate->r_exceltemplate->s_model-t_sheets INTO ls_sheets .


ls_sheets_f4-name = ls_sheets-name .
APPEND ls_sheets_f4 TO lt_sheets_f4 .
ENDLOOP .
IF lt_sheets_f4[] IS INITIAL .
MESSAGE i000(lp) WITH v_text-t112 . " text: Error while searching sheets in
the template
EXIT .
ENDIF .

ls_excl_f4-func = '%SC' . APPEND ls_excl_f4 TO lt_excl_f4 .


ls_excl_f4-func = '&RNT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OL0' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ODN' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OUP' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ILT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ELP' . APPEND ls_excl_f4 TO lt_excl_f4 .

ls_fct_f4-fieldname = 'NAME' .
ls_fct_f4-outputlen = 35 .
APPEND ls_fct_f4 TO lt_fct_f4 .

lv_title = v_text-t113 . " text: Select a sheet of the template

CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'


EXPORTING
i_title = lv_title
it_fieldcatalog = lt_fct_f4[]
it_status_excl = lt_excl_f4[]
i_screen_start_column = 10
i_screen_start_line = 5
i_screen_end_column = 40
i_screen_end_line = 10
IMPORTING
es_selfield = ls_selfield
e_exit = lv_exit
TABLES
t_outtab = lt_sheets_f4[].

IF lv_exit IS NOT INITIAL .


MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
EXIT .
ENDIF .

CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_sheets_f4 INTO ls_sheets_f4 INDEX ls_selfield-tabindex .
CHECK sy-subrc EQ 0 .

rv_name = ls_sheets_f4-name .
ENDMETHOD . "popup_tbsheet
METHOD popup_tbdrawing .
TYPES:
BEGIN OF ty_s_drawings_f4 ,
name TYPE ty_char100 ,
END OF ty_s_drawings_f4 ,
ty_t_drawings_f4 TYPE STANDARD TABLE OF ty_s_drawings_f4 .
DATA:
lv_title TYPE ty_char100 ,
ls_fct_f4 TYPE lvc_s_fcat ,
lt_fct_f4 TYPE lvc_t_fcat ,
ls_excl_f4 TYPE lvc_s_excl ,
lt_excl_f4 TYPE lvc_t_excl ,
ls_selfield TYPE slis_selfield ,
lv_exit TYPE flag ,
ls_sheets TYPE lcl_exceltemplate=>ty_s_sheets ,
ls_drawings TYPE lcl_exceltemplate=>ty_s_drawings_tmp ,
ls_drawings_f4 TYPE ty_s_drawings_f4 ,
lt_drawings_f4 TYPE ty_t_drawings_f4 .

CLEAR rv_name .
ls_sheets = r_formtemplate->r_exceltemplate->get_sheet( iv_sheetname ) .

LOOP AT ls_sheets-sheetdata_template-t_drawings INTO ls_drawings .


CASE ls_drawings-drawing_type .
WHEN r_formtemplate->r_exceltemplate->c_drawing_type-vector .
CHECK iv_vector IS NOT INITIAL .
WHEN r_formtemplate->r_exceltemplate->c_drawing_type-bitmap .
CHECK iv_bitmap IS NOT INITIAL .
WHEN r_formtemplate->r_exceltemplate->c_drawing_type-chart .
CHECK iv_chart IS NOT INITIAL .
WHEN OTHERS . EXIT .
ENDCASE .

ls_drawings_f4-name = ls_drawings-name .
APPEND ls_drawings_f4 TO lt_drawings_f4 .
ENDLOOP .

IF lt_drawings_f4[] IS INITIAL .
CASE abap_on .
WHEN iv_vector OR iv_bitmap .
MESSAGE i000(lp) WITH v_text-t144 " text: There are no drawings on
the sheet
iv_sheetname .
WHEN iv_chart .
MESSAGE i000(lp) WITH v_text-t240 " text: There are no Charts on the
worksheet
iv_sheetname .
WHEN OTHERS .
ENDCASE .
EXIT .
ENDIF .
ls_excl_f4-func = '%SC' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&RNT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OL0' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ODN' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OUP' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ILT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ELP' . APPEND ls_excl_f4 TO lt_excl_f4 .

ls_fct_f4-fieldname = 'NAME' .
ls_fct_f4-outputlen = 35 .
APPEND ls_fct_f4 TO lt_fct_f4 .

CONCATENATE v_text-t143 " text: Select a drawing on the sheet


iv_sheetname
INTO lv_title SEPARATED BY space .

CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'


EXPORTING
i_title = lv_title
it_fieldcatalog = lt_fct_f4[]
it_status_excl = lt_excl_f4[]
i_screen_start_column = 10
i_screen_start_line = 5
i_screen_end_column = 40
i_screen_end_line = 10
IMPORTING
es_selfield = ls_selfield
e_exit = lv_exit
TABLES
t_outtab = lt_drawings_f4[].

IF lv_exit IS NOT INITIAL .


MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
EXIT .
ENDIF .

CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_drawings_f4 INTO ls_drawings_f4 INDEX ls_selfield-tabindex .
CHECK sy-subrc EQ 0 .

rv_name = ls_drawings_f4-name .
ENDMETHOD . "popup_tbdrawing
METHOD popup_dataset_id .
TYPES:
BEGIN OF ty_s_outtab_f4 ,
grid_id TYPE lcl_form=>ty_s_properties-dataset_id ,
grid_compname TYPE lcl_form=>ty_s_properties-comp_name ,
sheet_compname TYPE lcl_form=>ty_s_properties-comp_name ,
END OF ty_s_outtab_f4 ,
ty_t_outtab_f4 TYPE STANDARD TABLE OF ty_s_outtab_f4 .
DATA:
lv_title TYPE ty_char100 ,
ls_fct_f4 TYPE lvc_s_fcat ,
lt_fct_f4 TYPE lvc_t_fcat ,
ls_excl_f4 TYPE lvc_s_excl ,
lt_excl_f4 TYPE lvc_t_excl ,
ls_selfield TYPE slis_selfield ,
lv_exit TYPE flag ,
ls_outtab_f4 TYPE ty_s_outtab_f4 ,
lt_outtab_f4 TYPE ty_t_outtab_f4 ,
ls_datasets TYPE ty_s_nodetab ,
lt_datasets TYPE ty_t_nodetab ,
ls_form_prop TYPE lcl_form=>ty_s_properties .

r_formtemplate->get_relevant_datasets(
EXPORTING iv_id = iv_id
iv_same_sheet = iv_same_sheet
RECEIVING rt_datasets = lt_datasets ) .
IF lt_datasets[] IS INITIAL .
MESSAGE s000(lp) WITH v_text-t120 . " text: Relevant components are
missing
EXIT .
ENDIF .

LOOP AT lt_datasets INTO ls_datasets .


CLEAR ls_outtab_f4 .
* Grid (ie dataset) Id
ls_outtab_f4-grid_id = ls_datasets-id .
* Grid (ie dataset) Name
CLEAR ls_form_prop .
ls_form_prop = r_formtemplate->node_get_properties( ls_datasets-id ) .
ls_outtab_f4-grid_compname = ls_form_prop-comp_name .
* Sheet Name
r_formtemplate->node_get_legacy_info( EXPORTING iv_id = ls_datasets-id
IMPORTING ev_tb_sheet_compname =
ls_outtab_f4-sheet_compname ) .
APPEND ls_outtab_f4 TO lt_outtab_f4 .
ENDLOOP .

ls_excl_f4-func = '%SC' . APPEND ls_excl_f4 TO lt_excl_f4 .


ls_excl_f4-func = '&RNT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OL0' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ODN' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OUP' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ILT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ELP' . APPEND ls_excl_f4 TO lt_excl_f4 .

CLEAR ls_fct_f4 .
ls_fct_f4-fieldname = 'GRID_COMPNAME' .
ls_fct_f4-coltext = v_text-t225 . " text: Grid
ls_fct_f4-outputlen = 20 .
ls_fct_f4-hotspot = abap_on .
APPEND ls_fct_f4 TO lt_fct_f4 .
CLEAR ls_fct_f4 .
ls_fct_f4-fieldname = 'SHEET_COMPNAME' .
ls_fct_f4-coltext = v_text-t238 . " text: On the sheet
ls_fct_f4-outputlen = 15 .
ls_fct_f4-emphasize = 'C500' .
APPEND ls_fct_f4 TO lt_fct_f4 .

lv_title = v_text-t234 . " text: Dataset

CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'


EXPORTING
i_title = lv_title
it_fieldcatalog = lt_fct_f4[]
it_status_excl = lt_excl_f4[]
i_screen_start_column = 10
i_screen_start_line = 5
i_screen_end_column = 50
i_screen_end_line = 15
IMPORTING
es_selfield = ls_selfield
e_exit = lv_exit
TABLES
t_outtab = lt_outtab_f4[].

IF lv_exit IS NOT INITIAL .


MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
EXIT .
ENDIF .

CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_outtab_f4 INTO ls_outtab_f4 INDEX ls_selfield-tabindex .
CHECK sy-subrc EQ 0 .

cv_dataset_id = ls_outtab_f4-grid_id .
ENDMETHOD . "popup_dataset_id
METHOD popup_dataset_series .
TYPES:
BEGIN OF ty_s_outtab_dtsfld ,
dtsfld TYPE string ,
dtsfld_text TYPE ty_char100 ,
END OF ty_s_outtab_dtsfld ,
ty_t_outtab_dtsfld TYPE STANDARD TABLE OF ty_s_outtab_dtsfld .
TYPES:
BEGIN OF ty_s_outtab_link ,
seridx TYPE string ,
sercap TYPE string ,
dtsfld TYPE string ,
sernum TYPE ty_char100 ,
dtsfld_text TYPE ty_char100 ,
status TYPE icon_d ,
END OF ty_s_outtab_link ,
ty_t_outtab_link TYPE STANDARD TABLE OF ty_s_outtab_link .
DATA:
ls_form_prop_ds TYPE lcl_form=>ty_s_properties ,
ls_ctxt_prop_ds TYPE lcl_context=>ty_s_properties ,
lt_ctxt_prop_ds TYPE lcl_context=>ty_t_properties ,
ls_fldseq TYPE lcl_form=>ty_s_grid_fldseq ,
lt_fldseq TYPE lcl_form=>ty_t_grid_fldseq ,
ls_drawings TYPE lcl_excel=>ty_s_drawings_tmp ,
ls_chart_series TYPE lcl_excel=>ty_s_chart_series ,
ls_dataset_series_tab TYPE ty_s_dataset_series_tab ,
lt_dataset_series_tab TYPE ty_t_dataset_series_tab ,
lv_tb_sheetname TYPE lcl_form=>ty_s_properties-tb_sheetname .
DATA:
lv_title_link TYPE ty_char100 ,
lv_title_dtsfld TYPE ty_char100 ,
lv_exit_link TYPE flag ,
lv_exit_dtsfld TYPE flag ,
ls_fct TYPE lvc_s_fcat ,
lt_fct_link TYPE lvc_t_fcat ,
lt_fct_dtsfld TYPE lvc_t_fcat ,
ls_excl TYPE lvc_s_excl ,
lt_excl_link TYPE lvc_t_excl ,
lt_excl_dtsfld TYPE lvc_t_excl ,
ls_selfield TYPE slis_selfield ,
lt_outtab_link TYPE ty_t_outtab_link ,
lt_outtab_dtsfld TYPE ty_t_outtab_dtsfld .
FIELD-SYMBOLS:
<outtab_link> TYPE ty_s_outtab_link ,
<outtab_dtsfld> TYPE ty_s_outtab_dtsfld .

CHECK cs_form_prop-dataset_id IS NOT INITIAL .


CHECK cs_form_prop-tb_drwstat_name IS NOT INITIAL .

* chart: Sheet
r_formtemplate->node_get_legacy_info( EXPORTING iv_id = cs_form_prop-id
IMPORTING ev_tb_sheetname =
lv_tb_sheetname ) .
CHECK lv_tb_sheetname IS NOT INITIAL .

* chart: Model (series)


ls_drawings = r_formtemplate->r_exceltemplate->get_drawing_static(
iv_sheetname = lv_tb_sheetname
iv_drwstat_name = cs_form_prop-tb_drwstat_name ) .
CHECK ls_drawings-chart_series[] IS NOT INITIAL .

* dataset: Properties
ls_form_prop_ds = r_formtemplate->node_get_properties( cs_form_prop-
dataset_id ) .

* dataset: Available fields


r_formtemplate->get_grid_fldseqprop(
EXPORTING iv_id = ls_form_prop_ds-id
IMPORTING et_ctxt_prop = lt_ctxt_prop_ds[]
et_fldseq = lt_fldseq[] ) .
CHECK lt_ctxt_prop_ds[] IS NOT INITIAL .

* dataset: Link between Chart series and Dataset fields


lt_dataset_series_tab[] = r_formtemplate->conv_dataset_series_st( cs_form_prop-
dataset_series ) .

* popup parameters: Common


ls_excl-func = '%SC' . APPEND ls_excl TO: lt_excl_link , lt_excl_dtsfld .
ls_excl-func = '&RNT' . APPEND ls_excl TO: lt_excl_link , lt_excl_dtsfld .
ls_excl-func = '&OL0' . APPEND ls_excl TO: lt_excl_link , lt_excl_dtsfld .
ls_excl-func = '&ODN' . APPEND ls_excl TO: lt_excl_link , lt_excl_dtsfld .
ls_excl-func = '&OUP' . APPEND ls_excl TO: lt_excl_link , lt_excl_dtsfld .
ls_excl-func = '&ILT' . APPEND ls_excl TO: lt_excl_link , lt_excl_dtsfld .
ls_excl-func = '&ELP' . APPEND ls_excl TO: lt_excl_link , lt_excl_dtsfld .
ls_excl-func = '&ONT' . APPEND ls_excl TO: lt_excl_link .

* popup parameters: Dataset fields


* ->> Title
lv_title_dtsfld = v_text-t227 . " text: available columns set

* ->> Fieldcatalog
CLEAR ls_fct .
ls_fct-fieldname = 'DTSFLD_TEXT' .
ls_fct-outputlen = 25 .
ls_fct-hotspot = abap_on .
CONCATENATE v_text-t226 " text: columns
'(' v_text-t234 ')' " text: Dataset
INTO ls_fct-coltext SEPARATED BY space .
APPEND ls_fct TO lt_fct_dtsfld .

* ->> Output table


LOOP AT lt_fldseq INTO ls_fldseq .
READ TABLE lt_ctxt_prop_ds INTO ls_ctxt_prop_ds
WITH KEY comp_fullpath = ls_fldseq-field
comp_type = lcl_context=>c_comp_type-element .
CHECK sy-subrc EQ 0 .

APPEND INITIAL LINE TO lt_outtab_dtsfld ASSIGNING <outtab_dtsfld> .


<outtab_dtsfld>-dtsfld = ls_fldseq-field .
CONCATENATE ls_ctxt_prop_ds-comp_name '~~~('
ls_ctxt_prop_ds-comp_shortdescr ')'
INTO <outtab_dtsfld>-dtsfld_text .
TRANSLATE <outtab_dtsfld>-dtsfld_text USING '~ ' .
ENDLOOP .

* popup parameters: Link


* ->> Title
lv_title_link = v_text-t245 . " text: Link between Chart series and Dataset
fields

* ->> Fieldcatalog
CLEAR ls_fct .
ls_fct-fieldname = 'SERNUM' .
ls_fct-coltext = v_text-t235 . " text: Series
ls_fct-outputlen = 6 .
ls_fct-emphasize = 'C500' .
APPEND ls_fct TO lt_fct_link .

CLEAR ls_fct .
ls_fct-fieldname = 'SERCAP' .
ls_fct-outputlen = 35 .
ls_fct-emphasize = 'C500' .
CONCATENATE v_text-t235 " text: Series
'(' v_text-t232 ')' " text: Chart
INTO ls_fct-coltext SEPARATED BY space .
APPEND ls_fct TO lt_fct_link .

CLEAR ls_fct .
ls_fct-fieldname = 'STATUS' .
ls_fct-coltext = v_text-t056 . " text: Status
ls_fct-outputlen = 3 .
ls_fct-emphasize = 'C510' .
ls_fct-icon = abap_on .
APPEND ls_fct TO lt_fct_link .

CLEAR ls_fct .
ls_fct-fieldname = 'DTSFLD_TEXT' .
ls_fct-outputlen = 40 .
ls_fct-hotspot = abap_on .
CONCATENATE v_text-t226 " text: columns
'(' v_text-t234 ')' " text: Dataset
INTO ls_fct-coltext SEPARATED BY space .
APPEND ls_fct TO lt_fct_link .
* ->> Output table
SORT ls_drawings-chart_series BY idx .

CLEAR ls_chart_series .
ls_chart_series-idx = c_chart_category_idx .
ls_chart_series-caption = v_text-t250 . " text: Horizontal (Category)
axis labels
APPEND ls_chart_series TO ls_drawings-chart_series .

LOOP AT ls_drawings-chart_series INTO ls_chart_series .


APPEND INITIAL LINE TO lt_outtab_link ASSIGNING <outtab_link> .
<outtab_link>-seridx = ls_chart_series-idx .
<outtab_link>-sercap = ls_chart_series-caption .
IF ls_chart_series-idx EQ c_chart_category_idx .
<outtab_link>-sernum = icon_draw_arrow .
ELSE .
<outtab_link>-sernum = sy-tabix . CONDENSE <outtab_link>-sernum .
ENDIF .
<outtab_link>-status = icon_absence .
<outtab_link>-dtsfld_text = v_text-t074 . " text: <...not assigned...>

READ TABLE lt_dataset_series_tab INTO ls_dataset_series_tab


WITH KEY seridx = <outtab_link>-seridx .
CHECK sy-subrc EQ 0
AND ls_dataset_series_tab-dtsfld IS NOT INITIAL .
<outtab_link>-status = icon_alert ."icon_message_error_small .
<outtab_link>-dtsfld = ls_dataset_series_tab-dtsfld .

READ TABLE lt_ctxt_prop_ds INTO ls_ctxt_prop_ds


WITH KEY comp_fullpath = <outtab_link>-dtsfld .
CHECK sy-subrc EQ 0 .

CONCATENATE ls_ctxt_prop_ds-comp_name '~~~('


ls_ctxt_prop_ds-comp_shortdescr ')'
INTO <outtab_link>-dtsfld_text .
TRANSLATE <outtab_link>-dtsfld_text USING '~ ' .

READ TABLE lt_outtab_dtsfld ASSIGNING <outtab_dtsfld>


WITH KEY dtsfld = ls_dataset_series_tab-dtsfld .
CHECK sy-subrc EQ 0 .
<outtab_link>-status = icon_presence .
ENDLOOP .

DO .
* popup display: Link
CLEAR lv_exit_link .
CLEAR ls_selfield .
CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'
EXPORTING
i_title = lv_title_link
it_fieldcatalog = lt_fct_link[]
it_status_excl = lt_excl_link[]
i_screen_start_column = 10
i_screen_start_line = 5
i_screen_end_column = 100
i_screen_end_line = 15
IMPORTING
es_selfield = ls_selfield
e_exit = lv_exit_link
TABLES
t_outtab = lt_outtab_link[].
IF lv_exit_link IS NOT INITIAL .
EXIT . " -->> do
ENDIF .

CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_outtab_link ASSIGNING <outtab_link> INDEX ls_selfield-
tabindex .
CHECK sy-subrc EQ 0 .

* popup display: Dataset fields


CLEAR lv_exit_dtsfld .
CLEAR ls_selfield .
CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'
EXPORTING
i_title = lv_title_dtsfld
it_fieldcatalog = lt_fct_dtsfld[]
it_status_excl = lt_excl_dtsfld[]
i_screen_start_column = 10
i_screen_start_line = 5
i_screen_end_column = 50
i_screen_end_line = 15
IMPORTING
es_selfield = ls_selfield
e_exit = lv_exit_dtsfld
TABLES
t_outtab = lt_outtab_dtsfld[].
IF lv_exit_dtsfld IS NOT INITIAL .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was
terminated by the user
CHECK 1 = 2 .
ENDIF .

CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_outtab_dtsfld ASSIGNING <outtab_dtsfld> INDEX ls_selfield-
tabindex .
CHECK sy-subrc EQ 0 .
<outtab_link>-dtsfld = <outtab_dtsfld>-dtsfld .
<outtab_link>-dtsfld_text = <outtab_dtsfld>-dtsfld_text .
<outtab_link>-status = icon_presence .
ENDDO .

* convert ALV-outtab to result table


CLEAR lt_dataset_series_tab[] .
LOOP AT lt_outtab_link ASSIGNING <outtab_link> .
CLEAR ls_dataset_series_tab .
MOVE-CORRESPONDING <outtab_link> TO ls_dataset_series_tab .
APPEND ls_dataset_series_tab TO lt_dataset_series_tab .
ENDLOOP .

* return result
cs_form_prop-dataset_series = r_formtemplate-
>conv_dataset_series_ts( lt_dataset_series_tab[] ) .

ENDMETHOD . "popup_dataset_series
METHOD popup_dataset_field .
TYPES:
BEGIN OF ty_s_outtab_dtsfld ,
dtsfld TYPE string ,
dtsfld_text TYPE ty_char100 ,
END OF ty_s_outtab_dtsfld ,
ty_t_outtab_dtsfld TYPE STANDARD TABLE OF ty_s_outtab_dtsfld .
DATA:
ls_form_prop_ds TYPE lcl_form=>ty_s_properties ,
ls_ctxt_prop_ds TYPE lcl_context=>ty_s_properties ,
lt_ctxt_prop_ds TYPE lcl_context=>ty_t_properties ,
ls_fldseq TYPE lcl_form=>ty_s_grid_fldseq ,
lt_fldseq TYPE lcl_form=>ty_t_grid_fldseq .
DATA:
lv_title_dtsfld TYPE ty_char100 ,
lv_exit_dtsfld TYPE flag ,
ls_fct TYPE lvc_s_fcat ,
lt_fct_dtsfld TYPE lvc_t_fcat ,
ls_excl TYPE lvc_s_excl ,
lt_excl_dtsfld TYPE lvc_t_excl ,
ls_selfield TYPE slis_selfield ,
lt_outtab_dtsfld TYPE ty_t_outtab_dtsfld .
FIELD-SYMBOLS:
<outtab_dtsfld> TYPE ty_s_outtab_dtsfld .

CHECK iv_dataset_id IS NOT INITIAL .

* dataset: Properties
ls_form_prop_ds = r_formtemplate->node_get_properties( iv_dataset_id ) .

* dataset: Available fields


r_formtemplate->get_grid_fldseqprop(
EXPORTING iv_id = ls_form_prop_ds-id
IMPORTING et_ctxt_prop = lt_ctxt_prop_ds[]
et_fldseq = lt_fldseq[] ) .
CHECK lt_ctxt_prop_ds[] IS NOT INITIAL .

* popup parameters: Common


ls_excl-func = '%SC' . APPEND ls_excl TO: lt_excl_dtsfld .
ls_excl-func = '&RNT' . APPEND ls_excl TO: lt_excl_dtsfld .
ls_excl-func = '&OL0' . APPEND ls_excl TO: lt_excl_dtsfld .
ls_excl-func = '&ODN' . APPEND ls_excl TO: lt_excl_dtsfld .
ls_excl-func = '&OUP' . APPEND ls_excl TO: lt_excl_dtsfld .
ls_excl-func = '&ILT' . APPEND ls_excl TO: lt_excl_dtsfld .
ls_excl-func = '&ELP' . APPEND ls_excl TO: lt_excl_dtsfld .

* ->> Title
lv_title_dtsfld = v_text-t227 . " text: available columns set

* ->> Fieldcatalog
CLEAR ls_fct .
ls_fct-fieldname = 'DTSFLD_TEXT' .
ls_fct-outputlen = 25 .
ls_fct-hotspot = abap_on .
CONCATENATE v_text-t226 " text: columns
'(' v_text-t234 ')' " text: Dataset
INTO ls_fct-coltext SEPARATED BY space .
APPEND ls_fct TO lt_fct_dtsfld .

* ->> Output table


LOOP AT lt_fldseq INTO ls_fldseq .
READ TABLE lt_ctxt_prop_ds INTO ls_ctxt_prop_ds
WITH KEY comp_fullpath = ls_fldseq-field
comp_type = lcl_context=>c_comp_type-element .
CHECK sy-subrc EQ 0 .

APPEND INITIAL LINE TO lt_outtab_dtsfld ASSIGNING <outtab_dtsfld> .


<outtab_dtsfld>-dtsfld = ls_fldseq-field .
CONCATENATE ls_ctxt_prop_ds-comp_name '~~~('
ls_ctxt_prop_ds-comp_shortdescr ')'
INTO <outtab_dtsfld>-dtsfld_text .
TRANSLATE <outtab_dtsfld>-dtsfld_text USING '~ ' .
ENDLOOP .

* popup display: Dataset fields


CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'
EXPORTING
i_title = lv_title_dtsfld
it_fieldcatalog = lt_fct_dtsfld[]
it_status_excl = lt_excl_dtsfld[]
i_screen_start_column = 10
i_screen_start_line = 5
i_screen_end_column = 50
i_screen_end_line = 15
IMPORTING
es_selfield = ls_selfield
e_exit = lv_exit_dtsfld
TABLES
t_outtab = lt_outtab_dtsfld[].
IF lv_exit_dtsfld IS NOT INITIAL .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
RETURN .
ENDIF .

CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_outtab_dtsfld ASSIGNING <outtab_dtsfld> INDEX ls_selfield-
tabindex .
CHECK sy-subrc EQ 0 .
cv_fieldname = <outtab_dtsfld>-dtsfld .

ENDMETHOD . "popup_dataset_field
METHOD popup_formname_f4 .

*=======================================================================
* prepare selection criteria
*=======================================================================
DATA:
so_objid TYPE RANGE OF wwwdatatab-objid ,
so_text TYPE RANGE OF wwwdatatab-text ,
so_devcl TYPE RANGE OF tadir-devclass ,
lv_title TYPE ty_char100 ,
lv_back TYPE ty_char1 .
FIELD-SYMBOLS:
<objid> LIKE LINE OF so_objid .

* call report with additional parameters


lv_title = lcl_root=>v_text-t136 . " text: Search the XLSX-form
FREE MEMORY ID 'webrfc' .
IF cv_formname IS NOT INITIAL .
APPEND INITIAL LINE TO so_objid ASSIGNING <objid> .
<objid>-sign = 'I' .
<objid>-option = 'EQ' .
<objid>-low = cv_formname .
FIND FIRST OCCURRENCE OF '*' IN cv_formname .
IF sy-subrc EQ 0 .
<objid>-option = 'CP' .
ELSE .
FIND FIRST OCCURRENCE OF '+' IN cv_formname .
IF sy-subrc EQ 0 .
<objid>-option = 'CP' .
ENDIF .
ENDIF .
ENDIF .

SUBMIT rswwwshw VIA SELECTION-SCREEN


WITH r_relid EQ lcl_form=>c_relid
WITH r_title EQ lv_title
WITH so_objid IN so_objid
AND RETURN .

* r_back is space -> F3 pressed else r_back = N


IMPORT back TO lv_back FROM MEMORY ID 'webrfc' .
CHECK lv_back EQ 'N' .

* retrieve and process selection criteria


IMPORT so_objid TO so_objid
so_text TO so_text
so_devcl TO so_devcl FROM MEMORY ID '%_RSWWWSHW_SEL' .
IF so_objid IS INITIAL .
APPEND INITIAL LINE TO so_objid ASSIGNING <objid> .
<objid>-sign = 'I' .
<objid>-option = 'CP' .
<objid>-low = '*' .
ENDIF .

LOOP AT so_objid ASSIGNING <objid> .


<objid>-low = lcl_form=>conv_formname_ei( <objid>-low ) .
ENDLOOP .

*=======================================================================
* prepare the output dataset
*=======================================================================
DATA lt_outtab TYPE STANDARD TABLE OF wwwdatatab .
FIELD-SYMBOLS <outtab> TYPE wwwdatatab .

SELECT *
FROM wwwdata AS f
INNER JOIN tadir AS p
ON f~objid EQ p~obj_name
INTO CORRESPONDING FIELDS OF TABLE lt_outtab
WHERE f~text IN so_text
AND f~srtf2 EQ 0
AND f~relid EQ lcl_form=>c_relid
AND p~pgmid EQ lcl_form=>c_pgmid
AND p~object EQ lcl_form=>c_object
AND p~devclass IN so_devcl
AND p~obj_name IN so_objid .

IF lt_outtab[] IS INITIAL .
MESSAGE s000(lp) WITH lcl_root=>v_text-t137 . " text: Data was not found.
EXIT .
ENDIF .
SORT lt_outtab BY devclass objid ASCENDING .

LOOP AT lt_outtab ASSIGNING <outtab> .


<outtab>-objid = lcl_form=>conv_formname_ie( <outtab>-objid ) .
ENDLOOP .

*=======================================================================
* display the grid
*=======================================================================
DATA:
lt_fct_f4 TYPE lvc_t_fcat ,
ls_excl_f4 TYPE lvc_s_excl ,
lt_excl_f4 TYPE lvc_t_excl ,
ls_selfield TYPE slis_selfield ,
lv_exit TYPE flag .
FIELD-SYMBOLS:
<fct_f4> TYPE lvc_s_fcat .

* prepare fieldcatalog
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'WWWDATATAB'
i_bypassing_buffer = abap_off
CHANGING
ct_fieldcat = lt_fct_f4
EXCEPTIONS
OTHERS = 3.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .
LOOP AT lt_fct_f4 ASSIGNING <fct_f4> .
CASE <fct_f4>-fieldname .
WHEN 'OBJID' . <fct_f4>-col_pos = 1 . <fct_f4>-outputlen = 20 .
<fct_f4>-emphasize = 'C500' .
WHEN 'TEXT' . <fct_f4>-col_pos = 2 . <fct_f4>-outputlen = 20 .
WHEN 'DEVCLASS' . <fct_f4>-col_pos = 3 . <fct_f4>-outputlen = 15 .
WHEN 'TDATE' . <fct_f4>-col_pos = 4 .
WHEN 'TTIME' . <fct_f4>-col_pos = 5 .
WHEN OTHERS. <fct_f4>-tech = abap_on .
ENDCASE .
ENDLOOP .

* exclude some buttons


ls_excl_f4-func = '%SC' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&RNT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OL0' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ODN' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OUP' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ILT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ONT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ELP' . APPEND ls_excl_f4 TO lt_excl_f4 .
* popup list
CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'
EXPORTING
i_title = lv_title
it_fieldcatalog = lt_fct_f4[]
it_status_excl = lt_excl_f4[]
IMPORTING
es_selfield = ls_selfield
e_exit = lv_exit
TABLES
t_outtab = lt_outtab[].
CHECK lv_exit IS INITIAL .

*=======================================================================
* result
*=======================================================================
CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_outtab ASSIGNING <outtab> INDEX ls_selfield-tabindex .
CHECK sy-subrc EQ 0 .

cv_formname = <outtab>-objid .
ENDMETHOD . "popup_formname_f4
METHOD popup_devclass .
CLEAR rv_devclass .

DATA ls_tadir TYPE tadir .


ls_tadir-pgmid = lcl_form=>c_pgmid .
ls_tadir-object = lcl_form=>c_object .
ls_tadir-obj_name = iv_objid .
ls_tadir-srcsystem = sy-sysid .
ls_tadir-author = sy-uname .
ls_tadir-masterlang = sy-langu .

CALL FUNCTION 'TRINT_TADIR_POPUP'


EXPORTING
wi_existence_check = abap_on
wi_message_enter_devclass = abap_on
wi_tadir = ls_tadir
wi_no_tadir = abap_on
wi_no_tdevc = abap_on
wi_no_delete_function = abap_on
IMPORTING
we_tadir_new = ls_tadir
EXCEPTIONS
display_mode = 1
exit = 2
OTHERS = 15.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
ENDIF .
rv_devclass = ls_tadir-devclass .
ENDMETHOD . "popup_devclass
METHOD popup_pgbrk .

DATA:
lv_fieldtext TYPE sval-fieldtext ,
lv_value TYPE sval-value ,
lv_cancel TYPE flag .

IF iv_top IS NOT INITIAL .


lv_fieldtext = v_text-t163 . " text: row(s)
ELSEIF iv_left IS NOT INITIAL .
lv_fieldtext = v_text-t162 . " text: column(s)
ENDIF .
IF cv_shift IS NOT INITIAL .
lv_value = cv_shift .
ENDIF .

popup_to_get_value(
EXPORTING iv_title = v_text-t156 " -->> text: Extend unbroken area
iv_tabname = 'SYST'
iv_fieldname = 'INDEX'
iv_fieldtext = lv_fieldtext
IMPORTING ev_cancel = lv_cancel
CHANGING cv_value = lv_value ) .

CHECK lv_cancel IS INITIAL .


cv_shift = lv_value .

ENDMETHOD . "popup_pgbrk
METHOD popup_printtitles .

TYPES:
BEGIN OF ty_s_patterns_f4 ,
id TYPE lcl_form=>ty_s_properties-id ,
comp_name TYPE lcl_form=>ty_s_properties-comp_name,
comp_descr TYPE lcl_form=>ty_s_properties-comp_descr,
END OF ty_s_patterns_f4 ,
ty_t_patterns_f4 TYPE STANDARD TABLE OF ty_s_patterns_f4 .
DATA:
lv_title TYPE ty_char100 ,
ls_fct_f4 TYPE lvc_s_fcat ,
lt_fct_f4 TYPE lvc_t_fcat ,
ls_excl_f4 TYPE lvc_s_excl ,
lt_excl_f4 TYPE lvc_t_excl ,
ls_selfield TYPE slis_selfield ,
lv_exit TYPE flag ,
ls_form_prop TYPE lcl_form=>ty_s_properties ,
ls_patternarea TYPE lcl_form=>ty_s_patternarea ,
ls_patterns_f4 TYPE ty_s_patterns_f4 ,
lt_patterns_f4 TYPE ty_t_patterns_f4 .

LOOP AT r_formtemplate->t_patternarea INTO ls_patternarea


WHERE sheetname EQ iv_sheetname .

ls_form_prop = r_formtemplate->node_get_properties( ls_patternarea-areaid ) .


CHECK r_formtemplate->v_retcode EQ c_retcode-okey .

CLEAR ls_patterns_f4 .
ls_patterns_f4-id = ls_form_prop-id .
ls_patterns_f4-comp_name = ls_form_prop-comp_name .
ls_patterns_f4-comp_descr = ls_form_prop-comp_descr .
APPEND ls_patterns_f4 TO lt_patterns_f4 .
ENDLOOP .

IF lt_patterns_f4[] IS INITIAL .
MESSAGE i000(lp) WITH v_text-t164 . " text: Patterns are not found
EXIT .
ENDIF .

ls_excl_f4-func = '%SC' . APPEND ls_excl_f4 TO lt_excl_f4 .


ls_excl_f4-func = '&RNT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OL0' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ODN' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&OUP' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ILT' . APPEND ls_excl_f4 TO lt_excl_f4 .
ls_excl_f4-func = '&ELP' . APPEND ls_excl_f4 TO lt_excl_f4 .

ls_fct_f4-fieldname = 'COMP_NAME' .
ls_fct_f4-outputlen = 30 .
APPEND ls_fct_f4 TO lt_fct_f4 .
ls_fct_f4-fieldname = 'COMP_DESCR' .
ls_fct_f4-outputlen = 35 .
APPEND ls_fct_f4 TO lt_fct_f4 .

lv_title = v_text-t165 . " text: Select a pattern

CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'


EXPORTING
i_title = lv_title
it_fieldcatalog = lt_fct_f4[]
it_status_excl = lt_excl_f4[]
i_screen_start_column = 10
i_screen_start_line = 5
i_screen_end_column = 80
i_screen_end_line = 10
IMPORTING
es_selfield = ls_selfield
e_exit = lv_exit
TABLES
t_outtab = lt_patterns_f4[].

IF lv_exit IS NOT INITIAL .


MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
EXIT .
ENDIF .

CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_patterns_f4 INTO ls_patterns_f4 INDEX ls_selfield-tabindex .
CHECK sy-subrc EQ 0 .

cv_comp_id = ls_patterns_f4-id .

ENDMETHOD . "popup_printtitles
METHOD popup_grid_fldseq .
DATA:
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
lt_ctxt_prop TYPE lcl_context=>ty_t_properties ,
ls_fldseq TYPE lcl_form=>ty_s_grid_fldseq ,
lt_fldseq TYPE lcl_form=>ty_t_grid_fldseq ,
ls_fields TYPE lvc_s_objs ,
lt_fields TYPE lvc_t_objs ,
lt_fields_included TYPE STANDARD TABLE OF lvc_s_objs ,
lt_fields_excluded TYPE STANDARD TABLE OF lvc_s_objs ,
lv_title_left TYPE sy-title ,
lv_title_right TYPE sy-title ,
lv_popup_title TYPE sy-title ,
ls_layout TYPE lvc_s_daly ,
lv_exit TYPE flag .

r_formtemplate->get_grid_fldseqprop(
EXPORTING iv_id = cs_form_prop-id
IMPORTING et_ctxt_prop = lt_ctxt_prop[]
et_fldseq = lt_fldseq[] ) .

CHECK lt_ctxt_prop[] IS NOT INITIAL .

LOOP AT lt_ctxt_prop INTO ls_ctxt_prop


WHERE comp_type EQ lcl_context=>c_comp_type-element .

CLEAR ls_fields .
ls_fields-id = ls_ctxt_prop-id .
CONCATENATE ls_ctxt_prop-comp_name '~~~('
ls_ctxt_prop-comp_shortdescr ')'
INTO ls_fields-text .
TRANSLATE ls_fields-text USING '~ ' .
APPEND ls_fields TO lt_fields .
ENDLOOP .

lt_fields_excluded[] = lt_fields[] .

LOOP AT lt_fldseq INTO ls_fldseq .


READ TABLE lt_ctxt_prop INTO ls_ctxt_prop WITH KEY comp_fullpath = ls_fldseq-
field .
CHECK sy-subrc EQ 0 .
READ TABLE lt_fields INTO ls_fields WITH KEY id = ls_ctxt_prop-id .
CHECK sy-subrc EQ 0 .
APPEND ls_fields TO lt_fields_included .
DELETE lt_fields_excluded WHERE id EQ ls_ctxt_prop-id .
ENDLOOP .

* popup to select fields


lv_popup_title = v_text-t228 . " -->> text: Setting up columns in the
output table
lv_title_left = v_text-t226 . " -->> text: columns
lv_title_right = v_text-t227 . " -->> text: available columns set
ls_layout-no_icons = abap_on .

CALL FUNCTION 'REUSE_DOUBLE_ALV'


EXPORTING
i_title_left = lv_title_left
i_title_right = lv_title_right
i_popup_title = lv_popup_title
is_layout_double_alv = ls_layout
IMPORTING
e_cancelled = lv_exit
TABLES
t_leftx = lt_fields_included
t_rightx = lt_fields_excluded.

IF lv_exit IS NOT INITIAL


OR lt_fields_included[] IS INITIAL .
MESSAGE s000(lp) WITH v_text-t100 . " -->> text: Operation was terminated by
the user
EXIT .
ENDIF .

* return value
CLEAR lt_fldseq .

LOOP AT lt_fields_included INTO ls_fields .


READ TABLE lt_ctxt_prop INTO ls_ctxt_prop WITH KEY id = ls_fields-id .
CHECK sy-subrc EQ 0 .
ls_fldseq-field = ls_ctxt_prop-comp_fullpath .
APPEND ls_fldseq TO lt_fldseq .
ENDLOOP .
cs_form_prop-grid_fldseq = r_formtemplate->conv_grid_fldseq_ts( lt_fldseq ) .

ENDMETHOD . "popup_grid_fldseq
METHOD popup_grid_fldprop .
TYPES:
BEGIN OF ty_s_outtab ,
field TYPE string ,
field_text TYPE ty_char255 ,
marker TYPE icon_d ,
autofitmerged TYPE icon_d ,
END OF ty_s_outtab ,
ty_t_outtab TYPE STANDARD TABLE OF ty_s_outtab .
DATA:
lt_fldprop TYPE lcl_form=>ty_t_grid_fldprop ,
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
lt_ctxt_prop TYPE lcl_context=>ty_t_properties .
DATA:
lv_title TYPE ty_char100 ,
lv_exit TYPE flag ,
ls_fct TYPE lvc_s_fcat ,
lt_fct TYPE lvc_t_fcat ,
ls_excl TYPE lvc_s_excl ,
lt_excl TYPE lvc_t_excl ,
ls_selfield TYPE slis_selfield ,
lt_outtab TYPE ty_t_outtab ,
lv_selected TYPE ty_char1 ,
lv_info_flag TYPE flag .
FIELD-SYMBOLS:
<outtab> TYPE ty_s_outtab ,
<fldprop> TYPE lcl_form=>ty_s_grid_fldprop .

r_formtemplate->get_grid_fldseqprop(
EXPORTING iv_id = cs_form_prop-id
IMPORTING et_ctxt_prop = lt_ctxt_prop[]
et_fldprop = lt_fldprop[] ) .

CHECK lt_fldprop[] IS NOT INITIAL .

* popup parameters:
* ->> Excluded functions
ls_excl-func = '%SC' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&RNT' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&OL0' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&ODN' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&OUP' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&ILT' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&ELP' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&ONT' . APPEND ls_excl TO lt_excl .
* ->> Title
lv_title = v_text-t279 . " text: Properties of the Grid columns

* ->> Fieldcatalog
CLEAR ls_fct .
ls_fct-fieldname = 'MARKER' .
ls_fct-outputlen = 2 .
ls_fct-icon = abap_on .
APPEND ls_fct TO lt_fct .
CLEAR ls_fct .
ls_fct-fieldname = 'FIELD_TEXT' .
ls_fct-outputlen = 70 .
ls_fct-coltext = v_text-t227 . " text: available columns set
APPEND ls_fct TO lt_fct .
CLEAR ls_fct .
ls_fct-fieldname = 'AUTOFITMERGED' .
ls_fct-outputlen = 7 .
ls_fct-coltext = 'AutoFit' .
ls_fct-tooltip = v_text-t275 . " text: AutoFit for merged cells
ls_fct-icon = abap_on .
ls_fct-hotspot = abap_on .
ls_fct-emphasize = 'C500' .
APPEND ls_fct TO lt_fct .

* ->> Output table


LOOP AT lt_fldprop ASSIGNING <fldprop> .
READ TABLE lt_ctxt_prop INTO ls_ctxt_prop
WITH KEY comp_fullpath = <fldprop>-field
comp_type = lcl_context=>c_comp_type-element .
CHECK sy-subrc EQ 0 .

* field
APPEND INITIAL LINE TO lt_outtab ASSIGNING <outtab> .
<outtab>-field = <fldprop>-field .

* field text
format_path( EXPORTING iv_source = ls_ctxt_prop-comp_name
CHANGING cv_formatted = <outtab>-field_text ) .
CONCATENATE <outtab>-field_text '~~~('
ls_ctxt_prop-comp_shortdescr ')'
INTO <outtab>-field_text .
TRANSLATE <outtab>-field_text USING '~ ' .

* marker
IF <fldprop>-autofitmerged_r IS INITIAL
AND <fldprop>-autofitmerged_c IS INITIAL .
<outtab>-marker = icon_rating_neutral .
ELSE .
<outtab>-marker = icon_rating_positive .
ENDIF .

* 'autofit merged cells' property


<outtab>-autofitmerged = icon_distribute_configuration .
ENDLOOP .

DO .
* popup display: column list
CLEAR lv_exit .
CLEAR ls_selfield .
CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'
EXPORTING
i_title = lv_title
it_fieldcatalog = lt_fct[]
it_status_excl = lt_excl[]
i_screen_start_column = 10
i_screen_start_line = 5
i_screen_end_column = 100
i_screen_end_line = 15
IMPORTING
es_selfield = ls_selfield
e_exit = lv_exit
TABLES
t_outtab = lt_outtab[].
IF lv_exit IS NOT INITIAL .
EXIT . " -->> do
ENDIF .

CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_outtab ASSIGNING <outtab> INDEX ls_selfield-tabindex .
CHECK sy-subrc EQ 0 .

READ TABLE lt_fldprop ASSIGNING <fldprop> WITH KEY field = <outtab>-field .


CHECK sy-subrc EQ 0 .

CASE ls_selfield-fieldname .
WHEN 'AUTOFITMERGED' .
IF <fldprop>-autofitmerged_r IS NOT INITIAL .
lv_selected = 2 .
ELSEIF <fldprop>-autofitmerged_c IS NOT INITIAL .
lv_selected = 3 .
ELSE .
lv_selected = 1 .
ENDIF .

popup_to_decide( EXPORTING iv_title = <outtab>-field_text


iv_text = v_text-t275 "
-->> text: AutoFit for merged cells
iv_text_rb1 = v_text-t276 "
-->> text: Off
iv_text_rb2 = v_text-t277 "
-->> text: Row height
iv_text_rb3 = v_text-t278 "
-->> text: Col.width
CHANGING cv_selected_rb = lv_selected ) .
CASE lv_selected .
WHEN '1' . <fldprop>-autofitmerged_r = abap_off . <fldprop>-
autofitmerged_c = abap_off .
WHEN '2' . <fldprop>-autofitmerged_r = abap_on . <fldprop>-
autofitmerged_c = abap_off .
WHEN '3' . <fldprop>-autofitmerged_r = abap_off . <fldprop>-
autofitmerged_c = abap_on .
WHEN 'A' .
ENDCASE .
IF <fldprop>-autofitmerged_r IS INITIAL
AND <fldprop>-autofitmerged_c IS INITIAL .
<outtab>-marker = icon_rating_neutral .
ELSE .
<outtab>-marker = icon_rating_positive .

IF lv_info_flag IS INITIAL .
lv_info_flag = abap_on .
popup_postprocessing_info( ) .
ENDIF .
ENDIF .

WHEN OTHERS .

ENDCASE .
ENDDO .

* return result
cs_form_prop-grid_fldprop = r_formtemplate-
>conv_grid_fldprop_ts( lt_fldprop ) .

ENDMETHOD . "popup_grid_fldprop
METHOD popup_vbs_code_editor .
TYPES:
ty_v_content TYPE c LENGTH 255 .
DATA:
lv_content TYPE ty_v_content ,
lt_content TYPE STANDARD TABLE OF ty_v_content,
lv_changed TYPE s38e-buf_varied ,
lv_subrc TYPE sy-subrc ,
lv_vbs_code_tmp TYPE string ,
lv_vbs_code_before TYPE string .

cv_cancel = abap_on .
lv_vbs_code_before = cv_vbs_code .

IF cv_vbs_code IS INITIAL .
popup_postprocessing_info( ) .

cv_vbs_code = r_formtemplate->vbs_code_default_get( ) .
ENDIF .

SPLIT cv_vbs_code
AT cl_abap_char_utilities=>cr_lf
INTO TABLE lt_content .

CALL FUNCTION 'EDITOR_TABLE'


IMPORTING
changed = lv_changed
subrc = lv_subrc
TABLES
content = lt_content.
IF lv_subrc NE 0 .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by
the user
RETURN .
ELSEIF lv_changed IS INITIAL .
MESSAGE s000(lp) WITH v_text-t289 . " text: There are no changes
RETURN .
ENDIF .

CLEAR cv_vbs_code .
CLEAR cv_cancel .

LOOP AT lt_content INTO lv_content .


CASE sy-tabix .
WHEN 1 .
cv_vbs_code = lv_content .
WHEN OTHERS .
CONCATENATE cv_vbs_code lv_content
INTO cv_vbs_code
SEPARATED BY cl_abap_char_utilities=>cr_lf .
ENDCASE .
ENDLOOP .

r_formtemplate->vbs_code_validate( CHANGING cv_vbs_code = cv_vbs_code ) .

IF cv_vbs_code NE lv_vbs_code_before .
CLEAR cv_cancel .
ENDIF .

ENDMETHOD . "popup_vbs_code_editor
METHOD popup_vbs_tables .
TYPES:
BEGIN OF ty_s_outtab ,
icon_checkbox TYPE icon_d ,
table_name TYPE string ,
cb_relpath TYPE string ,
cb_relpath_out TYPE ty_char255 ,
cb_shortdescr TYPE ty_char255 ,
END OF ty_s_outtab ,
ty_t_outtab TYPE STANDARD TABLE OF ty_s_outtab .
DATA:
lt_vbs_tables_tab_r TYPE ty_t_vbs_tables_tab ,
lt_vbs_tables_tab_s TYPE ty_t_vbs_tables_tab .
DATA:
lv_title TYPE ty_char100 ,
lv_exit TYPE flag ,
ls_fct TYPE lvc_s_fcat ,
lt_fct TYPE lvc_t_fcat ,
ls_excl TYPE lvc_s_excl ,
lt_excl TYPE lvc_t_excl ,
ls_selfield TYPE slis_selfield ,
lt_outtab TYPE ty_t_outtab ,
lv_selected TYPE ty_char1 ,
lv_vbs_tables_before TYPE string .
FIELD-SYMBOLS:
<ls_vbs_tables_tab_r> TYPE ty_s_vbs_tables_tab ,
<ls_vbs_tables_tab_s> TYPE ty_s_vbs_tables_tab ,
<ls_outtab> TYPE ty_s_outtab .

cv_cancel = abap_on .
lv_vbs_tables_before = cv_vbs_tables .

*------ get relevant context nested tables (on root level)


lt_vbs_tables_tab_r = r_formtemplate->get_relevant_vbs_tables( ) .

*------ get chosen tables list


lt_vbs_tables_tab_s = r_formtemplate->conv_vbs_tables_st( cv_vbs_tables ) .

*------ convert tables list to output table


LOOP AT lt_vbs_tables_tab_r ASSIGNING <ls_vbs_tables_tab_r> .

APPEND INITIAL LINE TO lt_outtab ASSIGNING <ls_outtab> .


<ls_outtab>-cb_relpath = <ls_vbs_tables_tab_r>-cb_relpath .
<ls_outtab>-cb_shortdescr = <ls_vbs_tables_tab_r>-cb_shortdescr .

format_path( EXPORTING iv_source = <ls_outtab>-cb_relpath


CHANGING cv_formatted = <ls_outtab>-cb_relpath_out ) .

READ TABLE lt_vbs_tables_tab_s ASSIGNING <ls_vbs_tables_tab_s>


WITH KEY cb_relpath = <ls_outtab>-cb_relpath .
CASE sy-subrc .
WHEN 0 .
<ls_outtab>-table_name = <ls_vbs_tables_tab_s>-table_name .
<ls_outtab>-icon_checkbox = icon_checkbox .
WHEN OTHERS .
<ls_outtab>-icon_checkbox = icon_wd_iframe .
ENDCASE .
ENDLOOP .

*------ prepare popup parameters:


* ->> Excluded functions
ls_excl-func = '%SC' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&RNT' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&OL0' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&ODN' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&OUP' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&ILT' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&ELP' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&ONT' . APPEND ls_excl TO lt_excl .
* ->> Title
lv_title = v_text-t291 . " text: Tables for transferring data to Final
VBScript post-processing

* ->> Fieldcatalog
CLEAR ls_fct .
ls_fct-fieldname = 'ICON_CHECKBOX' .
ls_fct-outputlen = 5 .
ls_fct-icon = abap_on .
ls_fct-hotspot = abap_on .
ls_fct-emphasize = 'C500' .
APPEND ls_fct TO lt_fct .
CLEAR ls_fct .
ls_fct-fieldname = 'CB_RELPATH_OUT' .
ls_fct-outputlen = 40 .
ls_fct-coltext = v_text-t077 . " text: Binding with context
APPEND ls_fct TO lt_fct .
CLEAR ls_fct .
ls_fct-fieldname = 'CB_SHORTDESCR' .
ls_fct-outputlen = 30 .
ls_fct-coltext = v_text-t058 . " text: Description
APPEND ls_fct TO lt_fct .
CLEAR ls_fct .
ls_fct-fieldname = 'TABLE_NAME' .
ls_fct-outputlen = 30 .
ls_fct-coltext = v_text-t294 . " text: Table name
ls_fct-hotspot = abap_on .
ls_fct-emphasize = 'C500' .
APPEND ls_fct TO lt_fct .
DO .
*------ display popup-list
CLEAR lv_exit .
CLEAR ls_selfield .
CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'
EXPORTING
i_title = lv_title
it_fieldcatalog = lt_fct[]
it_status_excl = lt_excl[]
i_screen_start_column = 10
i_screen_start_line = 5
i_screen_end_column = 130
i_screen_end_line = 15
IMPORTING
es_selfield = ls_selfield
e_exit = lv_exit
TABLES
t_outtab = lt_outtab[].
IF lv_exit IS NOT INITIAL .
EXIT . " -->> do
ENDIF .

*------ interaction
CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_outtab ASSIGNING <ls_outtab> INDEX ls_selfield-tabindex .
CHECK sy-subrc EQ 0 .

CASE ls_selfield-fieldname .
WHEN 'ICON_CHECKBOX' .
CASE <ls_outtab>-icon_checkbox .
WHEN icon_checkbox .
<ls_outtab>-table_name = space .
<ls_outtab>-icon_checkbox = icon_wd_iframe .

WHEN icon_wd_iframe .
popup_to_get_value(
EXPORTING iv_title = <ls_outtab>-cb_relpath_out
iv_tabname = 'MASSD_F4_ATT'
iv_fieldname = 'TABNAME'
iv_fieldtext = v_text-t292 " text: Specify
Table name
iv_obligatory = abap_on
CHANGING cv_value = <ls_outtab>-table_name ) .

CHECK <ls_outtab>-table_name IS NOT INITIAL .


<ls_outtab>-icon_checkbox = icon_checkbox .
ENDCASE .

WHEN 'TABLE_NAME' .
popup_to_get_value(
EXPORTING iv_title = <ls_outtab>-cb_relpath_out
iv_tabname = 'MASSD_F4_ATT'
iv_fieldname = 'TABNAME'
iv_fieldtext = v_text-t292 " text: Specify
Table name
iv_obligatory = abap_on
CHANGING cv_value = <ls_outtab>-table_name ) .
ENDCASE .
ENDDO .

*------ convert output table to tab.list format


CLEAR lt_vbs_tables_tab_s .
LOOP AT lt_outtab ASSIGNING <ls_outtab>
WHERE icon_checkbox EQ icon_checkbox .
APPEND INITIAL LINE TO lt_vbs_tables_tab_s ASSIGNING <ls_vbs_tables_tab_s> .

<ls_vbs_tables_tab_s>-table_name = <ls_outtab>-table_name .
<ls_vbs_tables_tab_s>-cb_relpath = <ls_outtab>-cb_relpath .
ENDLOOP .

*------ set tables list


cv_vbs_tables = r_formtemplate->conv_vbs_tables_ts( lt_vbs_tables_tab_s ) .
IF cv_vbs_tables NE lv_vbs_tables_before .
CLEAR cv_cancel .
ENDIF .

ENDMETHOD . "popup_vbs_tables
METHOD hndl_fcode_appl .
tech_fcode_dispatch( iv_fcode = ev_fcode ) .
ENDMETHOD . "hndl_fcode_appl
METHOD hndl_fcode_ptab .
tech_fcode_dispatch( iv_fcode = ev_fcode
iv_form_id = ev_form_id ) .
ENDMETHOD . "hndl_fcode_ptab
METHOD hndl_fcode_tmpl .
tech_fcode_dispatch( iv_fcode = ev_fcode ).
ENDMETHOD. "hndl_fcode_tmpl
METHOD hndl_fcode_comp .
tech_fcode_dispatch( iv_fcode = ev_fcode
iv_form_id = ev_form_id ) .
ENDMETHOD . "hndl_fcode_comp
METHOD hndl_comp_move .
msg_init( ) .

DATA:
lr_dragdrop_data TYPE REF TO lcl_wb_formtree_drgdrpdata .

CATCH SYSTEM-EXCEPTIONS move_cast_error = 1 .


lr_dragdrop_data ?= ev_drag_drop_object->object .
ENDCATCH .
IF sy-subrc NE 0 .
lr_dragdrop_data->v_terminated = abap_on .
EXIT .
ENDIF .

*------ syncronize template with buffer


tech_template_sync( ) .
IF v_retcode EQ c_retcode-error .
lr_dragdrop_data->v_terminated = abap_on .
msg_check_errors_and_show( me ) .
EXIT .
ENDIF .

*------ request a user confirmation


IF space EQ popup_to_confirm( iv_text = v_text-t119 ) . " text: Moving of the
component
lr_dragdrop_data->v_terminated = abap_on .
EXIT .
ENDIF .

*------ move in buffer


r_formtemplate->node_move(
iv_id_source = lr_dragdrop_data->v_source_form_id
iv_id_target = lr_dragdrop_data->v_target_form_id ) .
IF r_formtemplate->v_retcode EQ r_formtemplate->c_retcode-error .
lr_dragdrop_data->v_terminated = abap_on .
msg_check_errors_and_show( EXPORTING iv_any = r_formtemplate ) .
EXIT .
ENDIF .

lr_dragdrop_data->r_formtemplate = r_formtemplate .

*------ redraw controls


r_protab->redraw( iv_form_id = lr_dragdrop_data->v_source_form_id
ir_formtemplate = r_formtemplate ) .

ENDMETHOD . "hndl_comp_move
METHOD actn_comp_selected .
msg_init( ) .

DATA ls_form_prop TYPE lcl_form=>ty_s_properties .


DATA ls_form_excp TYPE lcl_form=>ty_s_exceptions .
DATA lv_tb_sheetname TYPE ty_char31 .
DATA lv_sheet_only TYPE flag .
DATA lv_sheet_not_found TYPE flag .

r_protab->redraw( iv_form_id = iv_form_id


ir_formtemplate = r_formtemplate ) .

ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .


CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = iv_form_id
IMPORTING es_exceptions = ls_form_excp
ev_tb_sheetname = lv_tb_sheetname ) .

IF ls_form_prop-comp_type EQ lcl_form=>c_comp_type-field
AND ls_form_prop-tb_area_textmark IS NOT INITIAL .
ls_form_prop-id = r_formtemplate->node_get_parent( ls_form_prop-id ) . " -->>
get parent PATTERN

ls_form_prop = r_formtemplate->node_get_properties( ls_form_prop-id ) .


CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .
ENDIF .

CASE ls_form_prop-comp_type .
WHEN r_formtemplate->c_comp_type-pattern
OR r_formtemplate->c_comp_type-respattern
OR r_formtemplate->c_comp_type-field
OR r_formtemplate->c_comp_type-drawing
OR r_formtemplate->c_comp_type-chart
OR r_formtemplate->c_comp_type-tree
OR r_formtemplate->c_comp_type-grid .
lv_sheet_only = abap_off .
WHEN OTHERS.
lv_sheet_only = abap_on .
ENDCASE.

lv_sheet_not_found =
r_excelole->selection_set( iv_sheet = lv_tb_sheetname
iv_sheet_only = lv_sheet_only
iv_area_top = ls_form_prop-tb_area_top
iv_area_left = ls_form_prop-tb_area_left
iv_area_rows = ls_form_prop-tb_area_rows
iv_area_columns = ls_form_prop-tb_area_columns ) .
IF lv_sheet_not_found IS NOT INITIAL
AND ls_form_excp-tb_sheetname EQ c_retcode-okey .
tech_template_sync( ) .
CHECK msg_check_errors_and_show( me ) IS INITIAL .
r_formtree->redraw( r_formtemplate ) .
ENDIF .

ENDMETHOD . "actn_comp_selected
METHOD actn_comp_add .
msg_init( ) .

DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties ,
ls_new_form_prop TYPE lcl_form=>ty_s_properties ,
ls_comp_types TYPE ty_s_comp_types ,
lt_comp_types TYPE ty_t_comp_types .
DATA:
lv_form_id_parent TYPE snode-id ,
lv_form_id_sibling TYPE snode-id ,
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
ls_form_excp TYPE lcl_form=>ty_s_exceptions ,
lv_cancel TYPE flag ,
lv_wizard_mode TYPE flag ,
lv_cb_fullpath TYPE ty_comp_path ,
ls_comp_paths TYPE ty_s_ctxtmulti ,
lt_comp_paths TYPE ty_t_ctxtmulti .

*------------ read an actual node


CASE abap_on .
WHEN iv_child .
lv_form_id_parent = iv_form_id .

WHEN iv_sibling .
CASE iv_form_id .
WHEN r_formtemplate->v_root_id .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is
irrelevant for component type
EXIT .
ENDCASE .
lv_form_id_sibling = iv_form_id .
lv_form_id_parent = r_formtemplate->node_get_parent( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .
ENDCASE .

ls_form_prop = r_formtemplate->node_get_skipfolders( lv_form_id_parent ) .


CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

ls_form_excp = r_formtemplate->node_get_exceptions( ls_form_prop-id ) .


CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .
*------------ request a new component type
lt_comp_types =
r_formtemplate->get_relevant_child_comptypes( ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

IF lt_comp_types[] IS INITIAL .
MESSAGE i000(lp) WITH v_text-t120 . " text: Relevant components are missing
EXIT .
ENDIF .

popup_comp_types(
EXPORTING it_comp_types = lt_comp_types
iv_wizard_mode_allow = abap_on
IMPORTING ev_comp_type = ls_new_form_prop-comp_type
ev_wizard_mode = lv_wizard_mode
ev_cancel = lv_cancel ) .

CHECK lv_cancel IS INITIAL .

CASE lv_wizard_mode .
WHEN space .
*======================================================================
* common mode
*======================================================================

*------------ request the new component name/ description


DATA lv_retcode TYPE ty_char1 .

popup_compname(
EXPORTING iv_comp_type = ls_new_form_prop-comp_type
CHANGING cv_retcode = lv_retcode
cv_comp_name = ls_new_form_prop-comp_name
cv_comp_descr = ls_new_form_prop-comp_descr ) .
CHECK lv_retcode IS INITIAL .
CHECK ls_new_form_prop-comp_name IS NOT INITIAL .

*------------ add the new component node into the form buffer
ls_new_form_prop-id =
r_formtemplate->node_add( iv_comp_type = ls_new_form_prop-comp_type
iv_comp_name = ls_new_form_prop-comp_name
iv_comp_descr = ls_new_form_prop-comp_descr
iv_parent_id = lv_form_id_parent
iv_sibling_id = lv_form_id_sibling ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ add the new node into the tree


r_formtree->node_add( ir_formtemplate = r_formtemplate
iv_form_id = ls_new_form_prop-id
iv_alvtree_nkey = iv_alvtree_nkey
iv_sibling = iv_sibling ) .

WHEN OTHERS .
*======================================================================
* WIZARD MODE (create fields via context)
*======================================================================
CASE ls_new_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-field .
IF ls_form_excp-cb_relpath EQ c_retcode-legacy .
MESSAGE s000(lp)
WITH v_text-t127 " text: Firstly, eliminate problems due context
binding
v_text-t021 . " text: on the upper levels
EXIT .
ENDIF .

*------------ get a full path of context binding


r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = lv_form_id_parent
IMPORTING ev_cb_fullpath = lv_cb_fullpath ) .

*------------ popup-dialog to request a new context binding


popup_ctxtmulti(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
CHANGING ct_comp_paths = lt_comp_paths
cv_cancel = lv_cancel ) .
CHECK lv_cancel IS INITIAL .

LOOP AT lt_comp_paths INTO ls_comp_paths .


CLEAR ls_new_form_prop .
ls_new_form_prop-comp_type = ls_comp_paths-comp_type .
ls_new_form_prop-comp_name = ls_comp_paths-comp_name .
ls_new_form_prop-comp_descr = ls_comp_paths-comp_shortdescr .
ls_new_form_prop-cb_val_relpath = ls_comp_paths-cb_relpath .

*------------ add the new component node into the form buffer
ls_new_form_prop-id =
r_formtemplate->node_add( iv_comp_type = ls_new_form_prop-comp_type
iv_comp_name = ls_new_form_prop-comp_name
iv_comp_descr = ls_new_form_prop-comp_descr
iv_parent_id = lv_form_id_parent
iv_sibling_id = lv_form_id_sibling ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ add the new node into the tree


r_formtree->node_add( ir_formtemplate = r_formtemplate
iv_form_id = ls_new_form_prop-id
iv_alvtree_nkey = iv_alvtree_nkey
iv_sibling = iv_sibling ) .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties =
ls_new_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .
ENDLOOP .

WHEN OTHERS .
* not processing
RETURN .
ENDCASE .
ENDCASE .

DATA lt_expanded_nodes TYPE lvc_t_nkey .


r_formtree->get_expanded_nodes( CHANGING ct_expanded_nodes =
lt_expanded_nodes ) .
READ TABLE lt_expanded_nodes TRANSPORTING NO FIELDS WITH KEY table_line =
iv_alvtree_nkey .
CHECK sy-subrc NE 0 .
r_formtree->expand_node( EXPORTING i_node_key = iv_alvtree_nkey
i_level_count = 1
i_expand_subtree = abap_off
EXCEPTIONS OTHERS = 0 ) .
ENDMETHOD . "actn_comp_add
METHOD actn_comp_clone .
DATA lv_form_id_new TYPE snode-id .
DATA lv_form_id_parent TYPE snode-id .

*------ request a user confirmation


CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t172 ) . " text: Clone
component

*------ clone node in the buffer


lv_form_id_parent = r_formtemplate->node_get_parent( iv_form_id ) .
lv_form_id_new = r_formtemplate->node_clone( iv_id_sample =
iv_form_id
iv_id_target_parent =
lv_form_id_parent ) .

CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------ add the new node into the tree


r_formtree->node_add( ir_formtemplate = r_formtemplate
iv_form_id = lv_form_id_new
iv_alvtree_nkey = iv_alvtree_nkey
iv_sibling = abap_on ) .
*------ redraw controls
r_formtree->redraw( EXPORTING iv_form_id = lv_form_id_parent
ir_formtemplate = r_formtemplate ).

ENDMETHOD . "actn_comp_clone
METHOD actn_comp_clone_mass .
msg_init( ) .

DATA:
lv_node_key TYPE lvc_nkey ,
lt_node_key TYPE lvc_t_nkey ,
ls_links TYPE lcl_wb_formtree=>ty_s_links ,
lv_tabix TYPE sy-tabix ,
lv_cancel TYPE flag ,
lv_form_id_new TYPE lcl_form=>ty_s_properties-id ,
lv_alvtree_nkey_tar TYPE lvc_nkey ,
ls_properties_tmp TYPE lcl_form=>ty_s_properties ,
ls_properties_tar TYPE lcl_form=>ty_s_properties ,
ls_properties_src TYPE lcl_form=>ty_s_properties ,
lt_properties_src TYPE lcl_form=>ty_t_properties ,
lv_comp_type_tar TYPE lcl_form=>ty_s_properties-comp_type ,
lv_comp_type_src TYPE lcl_form=>ty_s_properties-comp_type ,
lt_comp_types_tar TYPE ty_t_comp_types ,
ls_comp_types_tar TYPE ty_s_comp_types ,
ls_comp_types_tmp TYPE ty_s_comp_types ,
lt_comp_types_tmp TYPE ty_t_comp_types ,
lv_rename_prefix TYPE sy-tvar1 ,
lv_rename_postfix TYPE sy-tvar2 ,
lv_rename_find TYPE sy-tvar3 ,
lv_rename_peplacement TYPE sy-tvar4 .

*============ GET SOURCE (SELECTED) COMPONENTS


*------ get selected nodes
r_formtree->get_selected_nodes( CHANGING ct_selected_nodes = lt_node_key
EXCEPTIONS OTHERS = 0 ) .

*------ check: all selected components must have the same type
LOOP AT lt_node_key INTO lv_node_key .

READ TABLE r_formtree->t_links INTO ls_links


WITH KEY alvtree_nkey = lv_node_key .
CHECK sy-subrc EQ 0 .
CHECK ls_links-form_id NE r_formtemplate->v_root_id .

READ TABLE r_formtemplate->t_properties INTO ls_properties_src


WITH KEY id = ls_links-form_id .
CHECK sy-subrc EQ 0 .

APPEND ls_properties_src TO lt_properties_src .


ENDLOOP .

LOOP AT lt_properties_src INTO ls_properties_src .


lv_tabix = sy-tabix .
LOOP AT lt_properties_src INTO ls_properties_tmp .
CHECK sy-tabix NE lv_tabix .

CHECK space NE r_formtemplate->is_component_subnode_of(


iv_form_id = ls_properties_tmp-id
iv_form_id_checked = ls_properties_src-id ) .

DELETE lt_properties_src INDEX lv_tabix .


EXIT .
ENDLOOP .
ENDLOOP .

IF lt_properties_src IS INITIAL .
MESSAGE s000(lp) WITH lcl_root=>v_text-t066 . " text: Select the node
EXIT .
ENDIF .

LOOP AT lt_properties_src INTO ls_properties_src .


IF lv_comp_type_src IS INITIAL .
lv_comp_type_src = ls_properties_src-comp_type .

ELSEIF lv_comp_type_src NE ls_properties_src-comp_type .


MESSAGE s000(lp) WITH lcl_root=>v_text-t320 . " text: Components must have
same type
RETURN .
ENDIF .
ENDLOOP .

CHECK lv_comp_type_src IS NOT INITIAL .

*============ REQUEST TARGET (PARENT) COMPONENT

*------------ get suitable parent component types


CLEAR lt_comp_types_tar .
LOOP AT r_formtemplate->t_comp_types INTO ls_comp_types_tmp .
CLEAR ls_properties_tmp .
ls_properties_tmp-comp_type = ls_comp_types_tmp-comp_type .
lt_comp_types_tmp = r_formtemplate-
>get_relevant_child_comptypes( ls_properties_tmp ) .
READ TABLE lt_comp_types_tmp TRANSPORTING NO FIELDS
WITH KEY comp_type = lv_comp_type_src .
CHECK sy-subrc EQ 0 .

READ TABLE r_formtemplate->t_properties TRANSPORTING NO FIELDS


WITH KEY comp_type = ls_comp_types_tmp-comp_type .
CHECK sy-subrc EQ 0 .

APPEND ls_comp_types_tmp TO lt_comp_types_tar .


ENDLOOP .

*------------ request target parent component TYPE


DESCRIBE TABLE lt_comp_types_tar[] .
CASE sy-tfill .
WHEN 0 .
MESSAGE i000(lp) WITH v_text-t120 . " text: Relevant components are
missing
EXIT .

WHEN 1 .
READ TABLE lt_comp_types_tar INTO ls_comp_types_tar INDEX 1 .
lv_comp_type_tar = ls_comp_types_tar-comp_type .

WHEN OTHERS .
popup_comp_types(
EXPORTING iv_title = v_text-t321 " text: Specify target
parent component
it_comp_types = lt_comp_types_tar
iv_wizard_mode_allow = abap_off
IMPORTING ev_comp_type = lv_comp_type_tar
ev_cancel = lv_cancel ) .
CHECK lv_cancel IS INITIAL .
ENDCASE .

*------------ request target parent component NAME


popup_component(
EXPORTING iv_title = v_text-t321 " text: Specify target parent
component
iv_comp_type = lv_comp_type_tar
IMPORTING es_form_prop = ls_properties_tar
ev_cancel = lv_cancel ) .
CHECK lv_cancel IS INITIAL .

READ TABLE r_formtree->t_links INTO ls_links


WITH KEY form_id = ls_properties_tar-id .
CHECK sy-subrc EQ 0 .

lv_alvtree_nkey_tar = ls_links-alvtree_nkey .

*============ REQUEST RENAMING FEATURES


popup_to_get_value(
EXPORTING iv_title = v_text-t322 " text: Renaming features
iv_tabname = 'SYST'
iv_fieldname = 'TVAR1'
iv_fieldtext = v_text-t323 " text: add Prefix
iv_2tabname = 'SYST'
iv_2fieldname = 'TVAR2'
iv_2fieldtext = v_text-t324 " text: add Postfix
iv_3tabname = 'SYST'
iv_3fieldname = 'TVAR3'
iv_3fieldtext = v_text-t325 " text: Find text...
iv_4tabname = 'SYST'
iv_4fieldname = 'TVAR4'
iv_4fieldtext = v_text-t326 " text: ... and replace with
IMPORTING ev_cancel = lv_cancel
CHANGING cv_value = lv_rename_prefix
cv_2value = lv_rename_postfix
cv_3value = lv_rename_find
cv_4value = lv_rename_peplacement ) .
CHECK lv_cancel IS INITIAL .

*============ CLONING
LOOP AT lt_properties_src INTO ls_properties_src .

*------ clone node in the buffer


lv_form_id_new = r_formtemplate->node_clone( iv_id_sample =
ls_properties_src-id
iv_id_target_parent =
ls_properties_tar-id
iv_rename_prefix =
lv_rename_prefix
iv_rename_postfix =
lv_rename_postfix
iv_rename_find =
lv_rename_find
iv_rename_replacement =
lv_rename_peplacement ) .

CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------ add the new node into the tree


r_formtree->node_add( ir_formtemplate = r_formtemplate
iv_form_id = lv_form_id_new
iv_alvtree_nkey = lv_alvtree_nkey_tar ) .
ENDLOOP .

*============ REDRAW CONTROLS


r_formtree->redraw( EXPORTING iv_form_id = ls_properties_tar-id
ir_formtemplate = r_formtemplate ).

ENDMETHOD . "actn_comp_clone_mass
METHOD actn_comp_delete .
msg_init( ) .

*------ request a user confirmation


CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t122 ) . " text: Removе
the component from the form

*------ delete component from buffer


r_formtemplate->node_del( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------ delete component from tree control


r_formtree->node_del( iv_alvtree_nkey ) .
*------ redraw controls
r_protab->redraw( ir_formtemplate = r_formtemplate
iv_form_id = r_formtemplate->v_root_id
iv_activetab_id = r_protab->c_tab_id-root ) .

ENDMETHOD . "actn_comp_delete
METHOD actn_comp_delete_mass .
msg_init( ) .

DATA:
lv_node_key TYPE lvc_nkey ,
lt_node_key TYPE lvc_t_nkey ,
lt_links_old TYPE lcl_wb_formtree=>ty_t_links ,
ls_links TYPE lcl_wb_formtree=>ty_s_links .

*------ get selected nodes


r_formtree->get_selected_nodes( CHANGING ct_selected_nodes = lt_node_key
EXCEPTIONS OTHERS = 0 ) .
IF lt_node_key IS INITIAL .
MESSAGE s000(lp) WITH lcl_root=>v_text-t066 . " text: Select the node
EXIT .
ENDIF .

*------ request a user confirmation


CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t122 ) . " text: Removе
the component from the form

*------ fix old nodes


lt_links_old[] = r_formtree->t_links[] .

*------ delete components from ALV-tree


LOOP AT lt_node_key INTO lv_node_key .
READ TABLE r_formtree->t_links INTO ls_links
WITH KEY alvtree_nkey = lv_node_key .
CHECK sy-subrc EQ 0 .
CHECK ls_links-form_id NE r_formtemplate->v_root_id .

r_formtree->node_del( iv_alvtree_nkey = lv_node_key ) .


ENDLOOP .

*------ delete components from buffer


LOOP AT lt_links_old INTO ls_links .
READ TABLE r_formtree->t_links TRANSPORTING NO FIELDS
WITH KEY alvtree_nkey = ls_links-alvtree_nkey .
CHECK sy-subrc NE 0 .

READ TABLE r_formtemplate->t_properties TRANSPORTING NO FIELDS


WITH KEY id = ls_links-form_id .
CHECK sy-subrc EQ 0 .

r_formtemplate->node_del( ls_links-form_id ) .
ENDLOOP .

ENDMETHOD . "actn_comp_delete_mass
METHOD actn_comp_tbshift_mass .
msg_init( ) .

DATA:
lv_node_key TYPE lvc_nkey ,
lt_node_key TYPE lvc_t_nkey ,
ls_links TYPE lcl_wb_formtree=>ty_s_links ,
ls_form_prop TYPE lcl_form=>ty_s_properties ,
lv_shift_top TYPE i ,
lv_shift_left TYPE i ,
lv_tb_area_top TYPE i ,
lv_tb_area_left TYPE i ,
lv_changed TYPE flag ,
lv_cancel TYPE flag .

*------ get selected nodes


r_formtree->get_selected_nodes( CHANGING ct_selected_nodes = lt_node_key
EXCEPTIONS OTHERS = 0 ) .
IF lt_node_key IS INITIAL .
MESSAGE s000(lp) WITH lcl_root=>v_text-t066 . " text: Select the node
EXIT .
ENDIF .

*------ request shift coordinates


popup_to_get_value(
EXPORTING iv_title = v_text-t220 " text: Shift template binding
coordinates
iv_tabname = 'SYST'
iv_fieldname = 'INDEX'
iv_fieldtext = v_text-t163 " text: row(s)
iv_2tabname = 'SYST'
iv_2fieldname = 'TABIX'
iv_2fieldtext = v_text-t162 " text: column(s)
IMPORTING ev_cancel = lv_cancel
CHANGING cv_value = lv_shift_top
cv_2value = lv_shift_left ) .

CHECK lv_cancel IS INITIAL .

IF lv_shift_top IS INITIAL
AND lv_shift_left IS INITIAL .
MESSAGE s000(lp) WITH v_text-t221 . " test: Nothing to change
EXIT .
ENDIF .

*------ delete components from ALV-tree


LOOP AT lt_node_key INTO lv_node_key .
READ TABLE r_formtree->t_links INTO ls_links
WITH KEY alvtree_nkey = lv_node_key .
CHECK sy-subrc EQ 0 .

ls_form_prop = r_formtemplate->node_get_properties( iv_id = ls_links-


form_id ) .

CASE ls_form_prop-comp_type .
WHEN r_formtemplate->c_comp_type-root
OR r_formtemplate->c_comp_type-sheet
OR r_formtemplate->c_comp_type-loopstep
OR r_formtemplate->c_comp_type-folder .
CONTINUE .

WHEN OTHERS .
CHECK ls_form_prop-tb_area_rows GT 0 .
CHECK ls_form_prop-tb_area_columns GT 0 .

lv_tb_area_top = ls_form_prop-tb_area_top + lv_shift_top .


lv_tb_area_left = ls_form_prop-tb_area_left + lv_shift_left .

CHECK ( lv_tb_area_top GT 0 AND lv_tb_area_top NE ls_form_prop-


tb_area_top )
OR ( lv_tb_area_left GT 0 AND lv_tb_area_left NE ls_form_prop-
tb_area_left ) .

IF lv_tb_area_top GT 0 .
ls_form_prop-tb_area_top = lv_tb_area_top .
ENDIF .
IF lv_tb_area_left GT 0 .
ls_form_prop-tb_area_left = lv_tb_area_left .
ENDIF .

r_formtemplate->node_set_properties( CHANGING cs_properties =


ls_form_prop ) .
lv_changed = abap_on .
ENDCASE .
ENDLOOP .

IF lv_changed IS INITIAL .
MESSAGE s000(lp) WITH v_text-t221 . " test: Nothing to change
EXIT .
ENDIF .

r_formtemplate->check_subtree( ) .

ENDMETHOD . "actn_comp_tbshift_mass
METHOD actn_comp_move_sibling_up .
msg_init( ) .

r_formtemplate->node_move_sibling_up( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

DATA lv_prev_nkey TYPE lvc_nkey .


r_formtree->get_prev_sibling( EXPORTING i_node_key = iv_alvtree_nkey
IMPORTING e_prev_node_key = lv_prev_nkey ) .
r_formtree->move_node(
EXPORTING i_node_key = lv_prev_nkey
i_relatkey = iv_alvtree_nkey
i_relatship = cl_gui_column_tree=>relat_next_sibling
EXCEPTIONS OTHERS = 1 ) .
IF sy-subrc NE 0 .
actn_appl_actualize( ) . " -->> hard redraw tree
ENDIF .
ENDMETHOD . "actn_comp_move_sibling_up
METHOD actn_comp_move_sibling_down .
msg_init( ) .

r_formtemplate->node_move_sibling_down( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

DATA lv_next_nkey TYPE lvc_nkey .


r_formtree->get_next_sibling( EXPORTING i_node_key = iv_alvtree_nkey
IMPORTING e_next_node_key = lv_next_nkey ) .
r_formtree->move_node(
EXPORTING i_node_key = lv_next_nkey
i_relatkey = iv_alvtree_nkey
i_relatship = cl_gui_column_tree=>relat_prev_sibling
EXCEPTIONS OTHERS = 1 ) .
IF sy-subrc NE 0 .
actn_appl_actualize( ) . " -->> hard redraw tree
ENDIF .
ENDMETHOD . "actn_comp_move_sibling_down
METHOD actn_appl_save .
msg_init( ) .

DATA lv_devclass TYPE tadir-devclass .


DATA lv_objid TYPE wwwdatatab-objid .

IF r_formtemplate->v_devclass IS INITIAL .
lv_objid = r_formtemplate->conv_formname_ei( r_formtemplate->v_formname ).
lv_devclass = popup_devclass( iv_objid = lv_objid ) .
ELSE .
lv_devclass = r_formtemplate->v_devclass .
ENDIF.
CHECK lv_devclass IS NOT INITIAL .

r_formtemplate->save( iv_devclass = lv_devclass ) .

IF v_retcode EQ c_retcode-okey .
MESSAGE s000(lp) WITH v_text-t170 . " test: Form has been saved
ELSE .
msg_check_errors_and_show( me ).
ENDIF .
ENDMETHOD . "actn_appl_save
METHOD actn_appl_save_as .
msg_init( ) .

DATA:
lv_cancel TYPE flag ,
lv_formname_new TYPE wwwdatatab-objid .

popup_to_get_value(
EXPORTING iv_title = v_text-t166 " text: Save as...
iv_tabname = 'MASSD_F4_ATT'
iv_fieldname = 'TABNAME'
iv_fieldtext = v_text-t167 " text: New form name
iv_obligatory = abap_on
IMPORTING ev_cancel = lv_cancel
CHANGING cv_value = lv_formname_new ) .

CHECK lv_cancel IS INITIAL .

IF lv_formname_new EQ r_formtemplate->v_formname .
MESSAGE i000(lp) WITH v_text-t168 . " text: Specify another form name
EXIT .
ENDIF.

IF r_formtemplate->get_devclass( iv_formname = lv_formname_new ) IS NOT INITIAL


.

CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t169 ) . " text: Form


with same name already exists. Overwrite it ?
ENDIF .
r_formtemplate->set_formname_new( lv_formname_new ) .
msg_check_errors_and_show( EXPORTING iv_any = r_formtemplate ) .

actn_appl_save( ) .

ENDMETHOD . "actn_appl_save_as
METHOD actn_appl_activate .
msg_init( ) .

IF r_formtemplate->v_devclass IS INITIAL .
MESSAGE i000(lp) WITH v_text-t038 . " text: Firstly, save the form
EXIT .
ENDIF .

r_formtemplate->activate( ) .
msg_check_errors_and_show( EXPORTING iv_any = r_formtemplate ) .

IF r_formtemplate->v_active IS NOT INITIAL .


MESSAGE s000(lp) WITH v_text-t171 . " text: Form has been activated
ENDIF .
ENDMETHOD . "actn_appl_activate
METHOD actn_appl_actualize .
msg_init( ) .

r_formtree->free( ) .
FREE r_formtree .
init_formtree( ) .

r_excelole->free( ) .
FREE r_excelole .
init_excelole( ) .
ENDMETHOD . "actn_appl_actualize
METHOD actn_appl_viewmode .
IF r_excelole IS BOUND .
r_excelole->free( ) .
FREE r_excelole .
ENDIF .
CASE v_oletempl_viewmode .
WHEN lcl_wb_ole=>c_viewmode-floating . v_oletempl_viewmode =
lcl_wb_ole=>c_viewmode-inplace .
WHEN lcl_wb_ole=>c_viewmode-inplace . v_oletempl_viewmode =
lcl_wb_ole=>c_viewmode-floating .
ENDCASE .
init_excelole( ) .
ENDMETHOD . "actn_appl_viewmode
METHOD actn_appl_help .
DATA lv_url(30000) TYPE c .
lv_url = iv_url .
CALL FUNCTION 'CALL_BROWSER'
EXPORTING
url = lv_url
EXCEPTIONS
OTHERS = 6.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
ENDIF .
ENDMETHOD . "actn_appl_help
METHOD actn_appl_presets .
DATA lv_selected TYPE ty_char1 VALUE '1' .

popup_to_decide( EXPORTING iv_title = v_text-t206 " text: Presets


iv_text_rb1 = v_text-t284 " text: Design-
time presets
iv_text_rb2 = v_text-t285 " text: Run-time
presets
CHANGING cv_selected_rb = lv_selected ) .
CASE lv_selected .
WHEN '1' . actn_appl_presets_designtime( ) .
WHEN '2' . actn_appl_presets_runtime( ) .
WHEN OTHERS . RETURN .
ENDCASE .
ENDMETHOD . "actn_appl_presets
METHOD actn_appl_presets_designtime .
TYPES:
BEGIN OF ty_s_outtab ,
checkboxtype TYPE flag ,
fieldname TYPE lvc_fname ,
paramname TYPE uws_service_parameter_name ,
paramvalue TYPE lvc_value ,
END OF ty_s_outtab ,
ty_t_outtab TYPE STANDARD TABLE OF ty_s_outtab .
DATA:
lv_title TYPE ty_char100 ,
ls_fct TYPE lvc_s_fcat ,
lt_fct TYPE lvc_t_fcat ,
ls_excl TYPE lvc_s_excl ,
lt_excl TYPE lvc_t_excl ,
ls_selfield TYPE slis_selfield ,
lv_exit TYPE flag ,
ls_outtab TYPE ty_s_outtab ,
lt_outtab TYPE ty_t_outtab .
FIELD-SYMBOLS:
<field> TYPE ANY ,
<outtab> TYPE ty_s_outtab .

ls_excl-func = '%SC' . APPEND ls_excl TO lt_excl .


ls_excl-func = '&ONT' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&RNT' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&OL0' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&ODN' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&OUP' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&ILT' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&ELP' . APPEND ls_excl TO lt_excl .

CLEAR ls_fct .
ls_fct-fieldname = 'PARAMNAME' .
ls_fct-outputlen = 58 .
APPEND ls_fct TO lt_fct .

CLEAR ls_fct .
ls_fct-fieldname = 'PARAMVALUE' .
ls_fct-outputlen = 10 .
ls_fct-hotspot = abap_on .
ls_fct-just = 'C' .
APPEND ls_fct TO lt_fct .
lv_title = v_text-t284 . " text: Design-time presets

DEFINE mk_add .
assign component &2 of structure s_presets_dt to <field> .
if <field> is assigned .
clear ls_outtab .
ls_outtab-fieldname = &2 .
ls_outtab-paramname = &3 .
if &1 is initial .
ls_outtab-paramvalue = <field> .
else .
ls_outtab-checkboxtype = abap_on .
case <field> .
when space . ls_outtab-paramvalue = icon_wd_iframe .
when others . ls_outtab-paramvalue = icon_checkbox .
endcase .
endif .
append ls_outtab to lt_outtab .
endif .
END-OF-DEFINITION .

DO .
CLEAR lt_outtab .

mk_add:
abap_on 'POPUP_TB' v_text-t208 , " text: Requesting of user
confirmation due template binding change
abap_on 'POPUP_IM' v_text-t103 , " text: Allow to upload an
initial XLSX-template from frontend
abap_on 'MESGTAB_WHEN_ERROR' v_text-t270 , " text: Activate messages tab
when error occurs
abap_on 'DESELECT_CELLS_NO_TB' v_text-t271 . " text: Losing cell range
selection when the component has no template binding

CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'


EXPORTING
i_title = lv_title
it_fieldcatalog = lt_fct[]
it_status_excl = lt_excl[]
i_screen_start_column = 10
i_screen_start_line = 5
i_screen_end_column = 80
i_screen_end_line = 10
IMPORTING
es_selfield = ls_selfield
e_exit = lv_exit
TABLES
t_outtab = lt_outtab[].

IF lv_exit IS NOT INITIAL .


EXIT . " -->> do
ENDIF .

CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_outtab ASSIGNING <outtab> INDEX ls_selfield-tabindex .
CHECK sy-subrc EQ 0 .

ASSIGN COMPONENT <outtab>-fieldname OF STRUCTURE s_presets_dt TO <field> .


IF <field> IS NOT ASSIGNED .
EXIT .
ENDIF.

CASE ls_outtab-checkboxtype .
WHEN space .
* CASE <outtab>-fieldname .
* WHEN ... .
* popup_to_get_value(
* EXPORTING iv_title = <outtab>-paramname
* iv_tabname = 'ALPDBUIALV'
* iv_fieldname = 'INDEX'
* iv_fieldtext = v_text-t126 " -->> text: Specify new
value
* CHANGING cv_value = <field> ) .
* WHEN OTHERS .
* ENDCASE .

WHEN OTHERS .
CASE <outtab>-paramvalue .
WHEN icon_wd_iframe . <field> = abap_on .
WHEN icon_checkbox . <field> = abap_off .
ENDCASE .
ENDCASE .
ENDDO .

tech_presets_dt_save( ) .

ENDMETHOD . "actn_appl_presets_designtime
METHOD actn_appl_presets_runtime .
TYPES:
BEGIN OF ty_s_outtab ,
checkboxtype TYPE flag ,
fieldname TYPE lvc_fname ,
paramname TYPE uws_service_parameter_name ,
paramvalue TYPE lvc_value ,
END OF ty_s_outtab ,
ty_t_outtab TYPE STANDARD TABLE OF ty_s_outtab .
DATA:
lv_title TYPE ty_char100 ,
ls_fct TYPE lvc_s_fcat ,
lt_fct TYPE lvc_t_fcat ,
ls_excl TYPE lvc_s_excl ,
lt_excl TYPE lvc_t_excl ,
ls_selfield TYPE slis_selfield ,
lv_exit TYPE flag ,
lv_selected TYPE ty_char1 ,
ls_outtab TYPE ty_s_outtab ,
lt_outtab TYPE ty_t_outtab .
FIELD-SYMBOLS:
<field> TYPE ANY ,
<outtab> TYPE ty_s_outtab .

ls_excl-func = '%SC' . APPEND ls_excl TO lt_excl .


ls_excl-func = '&ONT' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&RNT' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&OL0' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&ODN' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&OUP' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&ILT' . APPEND ls_excl TO lt_excl .
ls_excl-func = '&ELP' . APPEND ls_excl TO lt_excl .

CLEAR ls_fct .
ls_fct-fieldname = 'PARAMNAME' .
ls_fct-outputlen = 30 .
APPEND ls_fct TO lt_fct .

CLEAR ls_fct .
ls_fct-fieldname = 'PARAMVALUE' .
ls_fct-outputlen = 30 .
ls_fct-hotspot = abap_on .
ls_fct-just = 'C' .
APPEND ls_fct TO lt_fct .

lv_title = v_text-t285 . " text: Run-time presets

DEFINE mk_add .
assign component &2 of structure s_presets_rt to <field> .
if <field> is assigned .
clear ls_outtab .
ls_outtab-fieldname = &2 .
ls_outtab-paramname = &3 .
if &1 is initial .
case ls_outtab-fieldname .
when 'POSTPROCESSING_METHOD' .
case <field> .
when c_postprocessing_method-vbs . ls_outtab-paramvalue =
'VBScript' .
when c_postprocessing_method-ole . ls_outtab-paramvalue = 'OLE' .
endcase .
when others .
ls_outtab-paramvalue = <field> .
endcase .
else .
ls_outtab-checkboxtype = abap_on .
case <field> .
when space . ls_outtab-paramvalue = icon_wd_iframe .
when others . ls_outtab-paramvalue = icon_checkbox .
endcase .
endif .
append ls_outtab to lt_outtab .
endif .
END-OF-DEFINITION .

DO .
CLEAR lt_outtab .

mk_add:
abap_off 'POSTPROCESSING_METHOD' v_text-t286 . " text: Method for post
processing

CALL FUNCTION 'LVC_SINGLE_ITEM_SELECTION'


EXPORTING
i_title = lv_title
it_fieldcatalog = lt_fct[]
it_status_excl = lt_excl[]
i_screen_start_column = 10
i_screen_start_line = 5
i_screen_end_column = 80
i_screen_end_line = 10
IMPORTING
es_selfield = ls_selfield
e_exit = lv_exit
TABLES
t_outtab = lt_outtab[].

IF lv_exit IS NOT INITIAL .


EXIT . " -->> do
ENDIF .

CHECK ls_selfield-tabindex NE 0 .
READ TABLE lt_outtab ASSIGNING <outtab> INDEX ls_selfield-tabindex .
CHECK sy-subrc EQ 0 .

ASSIGN COMPONENT <outtab>-fieldname OF STRUCTURE s_presets_rt TO <field> .


IF <field> IS NOT ASSIGNED .
EXIT .
ENDIF.

CASE ls_outtab-checkboxtype .
WHEN space .
CASE <outtab>-fieldname .
WHEN 'POSTPROCESSING_METHOD' .
CASE <field> .
WHEN c_postprocessing_method-vbs . lv_selected = '1' .
WHEN c_postprocessing_method-ole . lv_selected = '2' .
ENDCASE .
popup_to_decide( EXPORTING iv_title = v_text-t126 " -->>
text: Specify new value
iv_text = v_text-t286 " -->>
text: Method for post processing
iv_text_rb1 = 'VBScript'
iv_text_rb2 = 'OLE'
CHANGING cv_selected_rb = lv_selected ) .
CASE lv_selected .
WHEN '1' . <field> = c_postprocessing_method-vbs .
WHEN '2' . <field> = c_postprocessing_method-ole .
ENDCASE .
WHEN OTHERS .
ENDCASE .

WHEN OTHERS .
CASE <outtab>-paramvalue .
WHEN icon_wd_iframe . <field> = abap_on .
WHEN icon_checkbox . <field> = abap_off .
ENDCASE .
ENDCASE .
ENDDO .

tech_presets_rt_save( ) .

ENDMETHOD . "actn_appl_presets_runtime
METHOD actn_appl_close_template .
msg_init( ) .
actn_appl_viewmode( ) .
r_formtemplate->check_subtree( ) .
ENDMETHOD . "actn_appl_close_template
METHOD actn_appl_mass_processing .
msg_init( ) .

CASE v_mass_processing .
WHEN space .
v_mass_processing = abap_on .
r_protab->redraw_dummy( iv_text = v_text-t214 " -->> text: Mass
processing
iv_icon = icon_segmented_data_act ) .
WHEN OTHERS .
v_mass_processing = abap_off .
r_protab->redraw( ir_formtemplate = r_formtemplate
iv_form_id = r_formtemplate->v_root_id
iv_activetab_id = r_protab->c_tab_id-root ) .
ENDCASE .

r_formtree->free( ) .
FREE r_formtree .
init_formtree( ) .

r_appltoolbar->free( ) .
FREE r_appltoolbar .
init_appltoolbar( ) .

ENDMETHOD . "actn_appl_mass_processing
METHOD actn_compname_change .
msg_init( ) .

DATA:
lv_retcode TYPE ty_char1 ,
ls_form_prop TYPE lcl_form=>ty_s_properties .

*------ read an actual (parent) node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------ request the new component name/ description


popup_compname(
EXPORTING iv_comp_type = ls_form_prop-comp_type
CHANGING cv_retcode = lv_retcode
cv_comp_name = ls_form_prop-comp_name
cv_comp_descr = ls_form_prop-comp_descr ) .
CHECK lv_retcode IS INITIAL .
CHECK ls_form_prop-comp_name IS NOT INITIAL .

*------ set properties of the component


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------ redraw controls


r_protab->redraw( ir_formtemplate = r_formtemplate
iv_form_id = ls_form_prop-id
iv_activetab_id = r_protab->c_tab_id-common ) .

ENDMETHOD . "actn_compname_change
METHOD actn_context_change .
msg_init( ) .

*------ request a context name


DATA:
lv_retcode TYPE ty_char1 ,
ls_fields TYPE sval ,
lt_fields TYPE STANDARD TABLE OF sval ,
lv_ok_buttontext TYPE svalbutton-buttontext ,
lv_ok_icon TYPE icon-name ,
lv_ok_quickinfo TYPE smp_dyntxt-text .

ls_fields-tabname = 'MASSD_F4_ATT' .
ls_fields-fieldname = 'TABNAME' .
CONCATENATE icon_bom_item v_text-t123 " text: context
INTO ls_fields-fieldtext
SEPARATED BY space .
ls_fields-field_obl = abap_on .
IF r_formtemplate->r_context IS BOUND .
ls_fields-value = r_formtemplate->r_context->v_contextname .
ENDIF .
APPEND ls_fields TO lt_fields .

lv_ok_icon = icon_checked .
lv_ok_quickinfo = v_text-t106 . " text: Continue

CALL FUNCTION 'POPUP_GET_VALUES_USER_BUTTONS'


EXPORTING
popup_title = v_text-t124 " text: Specify a name of the context
(data dictionary type)
programname = sy-repid
formname = 'POPUP_CONTEXT_UCOMM'
f4_programname = sy-repid
f4_formname = 'POPUP_CONTEXT_F4'
ok_pushbuttontext = lv_ok_buttontext
icon_ok_push = lv_ok_icon
quickinfo_ok_push = lv_ok_quickinfo
IMPORTING
returncode = lv_retcode
TABLES
fields = lt_fields
EXCEPTIONS
OTHERS = 4.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .
IF lv_retcode EQ space .
READ TABLE lt_fields INTO ls_fields INDEX 1 .
CHECK sy-subrc EQ 0 .
ELSE .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was terminated by the
user
EXIT .
ENDIF .

*------ try to send of choosen context into the form


r_formtemplate->set_context( ls_fields-value ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------ build the form structure automatically


IF abap_on EQ popup_to_confirm( iv_text = v_text-t213 " text:
Build the form structure automatically ?
iv_icon_button_1 = 'ICON_WIZARD'
iv_text_button_1 = v_text-t083 " text:
Auto
iv_icon_button_2 = 'ICON_OBJECT_LIST'
iv_text_button_2 = v_text-t218 ) . " text:
Don''t create
r_formtemplate->autostructure_create( ) .

r_formtree->free( ) .
FREE r_formtree .
init_formtree( ) .
ENDIF .

*------ redraw controls


r_protab->redraw( ir_formtemplate = r_formtemplate
iv_form_id = r_formtemplate->v_root_id
iv_activetab_id = r_protab->c_tab_id-root ) .
ENDMETHOD . "actn_context_change
METHOD actn_formdescr_change .
msg_init( ) .

*------ request a context name


DATA:
lv_cancel TYPE flag ,
lv_formdescr TYPE wwwdatatab-text .

lv_formdescr = r_formtemplate->v_formdescr .

popup_to_get_value(
EXPORTING iv_title = v_text-t126 " text: Specify new value
iv_tabname = 'WWWDATATAB'
iv_fieldname = 'TEXT'
iv_fieldtext = v_text-t075 " text: Form description
IMPORTING ev_cancel = lv_cancel
CHANGING cv_value = lv_formdescr ) .

CHECK lv_cancel IS INITIAL .

*------ try to set new form name into the buffer


r_formtemplate->set_formdescr_new( lv_formdescr ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------ redraw controls


r_protab->redraw( ir_formtemplate = r_formtemplate
iv_form_id = r_formtemplate->v_root_id
iv_activetab_id = r_protab->c_tab_id-root ) .
ENDMETHOD . "actn_formdescr_change
METHOD actn_format_change .
msg_init( ) .

*------ request new file fype


DATA:
lv_extension TYPE ty_char10 ,
lv_selected TYPE ty_char1 .

CASE r_formtemplate->r_exceltemplate->v_extension .
WHEN c_extension_xlsx . lv_selected = '1' .
WHEN c_extension_xlsm . lv_selected = '2' .
ENDCASE .
popup_to_decide( EXPORTING iv_title = v_text-t327 " -->>
text: File format
iv_text = v_text-t327 " -->>
text: File format
iv_text_rb1 = v_text-t328 " -->>
text: Without VBA-macro .XLSX
iv_text_rb2 = v_text-t329 " -->>
text: VBA-macro-enabled .XLSM
CHANGING cv_selected_rb = lv_selected ) .
CASE lv_selected .
WHEN '1' . lv_extension = c_extension_xlsx .
WHEN '2' . lv_extension = c_extension_xlsm .
WHEN 'A' . RETURN .
ENDCASE .

tech_template_sync( iv_new_extension = lv_extension ) .


msg_check_errors_and_show( me ) .

*------ redraw controls


r_protab->redraw( ir_formtemplate = r_formtemplate
iv_form_id = r_formtemplate->v_root_id
iv_activetab_id = r_protab->c_tab_id-root ) .
ENDMETHOD . "actn_format_change
METHOD actn_cb_loop_from_to .
msg_init( ) .

DATA:
ls_form_excp TYPE lcl_form=>ty_s_exceptions ,
ls_form_prop TYPE lcl_form=>ty_s_properties ,
lv_2fieldtext TYPE ty_char100 ,
lv_cancel TYPE flag .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

CASE ls_form_prop-comp_type .
WHEN r_formtemplate->c_comp_type-loopstep .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ update properties


CONCATENATE v_text-t265 " text: to
v_text-t266 " text: (0 = no limit)
INTO lv_2fieldtext SEPARATED BY space .

popup_to_get_value(
EXPORTING iv_title = v_text-t261 " text: Row processing
iv_tabname = 'SYST'
iv_fieldname = 'INDEX'
iv_fieldtext = v_text-t264 " text: from
iv_obligatory = abap_on
iv_2tabname = 'SYST'
iv_2fieldname = 'TABIX'
iv_2fieldtext = lv_2fieldtext
IMPORTING ev_cancel = lv_cancel
CHANGING cv_value = ls_form_prop-cb_loop_from
cv_2value = ls_form_prop-cb_loop_to ) .

CHECK lv_cancel IS INITIAL .


IF ls_form_prop-cb_loop_to NE 0
AND ls_form_prop-cb_loop_to LT ls_form_prop-cb_loop_from .
MESSAGE i000(lp) WITH v_text-t267 . " text: Некорректный интервал
EXIT .
ENDIF .

r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .


CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_cb_loop_from_to
METHOD actn_cb_relpath_change .
msg_init( ) .

DATA:
ls_form_excp TYPE lcl_form=>ty_s_exceptions ,
ls_form_prop TYPE lcl_form=>ty_s_properties ,
ls_form_prop_parent TYPE lcl_form=>ty_s_properties ,
lv_f4_strategy TYPE i ,
lv_cancel TYPE flag ,
lv_cb_fullpath_parent TYPE ty_comp_path .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

ls_form_excp = r_formtemplate->node_get_exceptions( iv_form_id ) .


CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .
IF ls_form_excp-cb_relpath EQ c_retcode-legacy .
MESSAGE s000(lp)
WITH v_text-t127 " text: Firstly, eliminate problems due context binding
v_text-t021 . " text: on the upper levels
EXIT .
ENDIF .

CASE ls_form_prop-comp_type .
WHEN r_formtemplate->c_comp_type-loopstep .
lv_f4_strategy = r_formtemplate->r_context->c_f4_strategy-loopstep .
WHEN r_formtemplate->c_comp_type-folder .
lv_f4_strategy = r_formtemplate->r_context->c_f4_strategy-folder .
WHEN OTHERS .
EXIT .
ENDCASE .

*------------ read a parent node


ls_form_prop_parent-id = r_formtemplate->node_get_parent( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

ls_form_prop_parent = r_formtemplate->node_get_properties( ls_form_prop_parent-


id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ get a full path of context binding for a parent node


r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = ls_form_prop_parent-id
IMPORTING ev_cb_fullpath = lv_cb_fullpath_parent ) .

*------------ popup-dialog to request a new context binding


popup_ctxtfield(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath_parent
iv_f4_strategy = lv_f4_strategy
iv_manual = iv_relpath_mn
CHANGING cv_cb_relpath = ls_form_prop-cb_relpath
cv_cancel = lv_cancel ) .
CHECK lv_cancel IS INITIAL .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_cb_relpath_change
METHOD actn_cb_relpath_delete .
msg_init( ) .

DATA ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ request a user confirmation


CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t128 ) . " text: Removing
the binding

*------------ update properties


ls_form_prop-cb_relpath = space .
r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_cb_relpath_delete
METHOD actn_cb_apr_relpath_change .
msg_init( ) .

DATA:
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
ls_form_excp TYPE lcl_form=>ty_s_exceptions ,
ls_form_prop TYPE lcl_form=>ty_s_properties ,
lv_cancel TYPE flag ,
lv_cb_fullpath TYPE ty_comp_path .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

ls_form_excp = r_formtemplate->node_get_exceptions( iv_form_id ) .


CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .
IF ls_form_excp-cb_relpath EQ c_retcode-legacy .
MESSAGE s000(lp)
WITH v_text-t127 " text: Firstly, eliminate problems due context binding
v_text-t021 . " text: on the upper levels
EXIT .
ENDIF .

*------------ get a full path of context binding


r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = iv_form_id
IMPORTING ev_cb_fullpath = lv_cb_fullpath ) .

IF iv_relpath_f4 IS NOT INITIAL


OR iv_relpath_mn IS NOT INITIAL .
*------------ popup-dialog to request a new context binding
popup_ctxtfield(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
iv_f4_strategy = r_formtemplate->r_context->c_f4_strategy-
apr_relpath
iv_manual = iv_relpath_mn
CHANGING cv_cb_relpath = ls_form_prop-cb_apr_relpath
cv_cancel = lv_cancel ) .
ENDIF .

CHECK lv_cancel IS INITIAL .

IF ls_form_prop-cb_apr_relpath IS INITIAL .
CLEAR: ls_form_prop-cb_apr_offset ,
ls_form_prop-cb_apr_match .
ELSE .
ls_ctxt_prop =
r_formtemplate->r_context->node_get_by_path(
iv_relpath = ls_form_prop-cb_apr_relpath
iv_fullpath_parent = lv_cb_fullpath ) .

IF ls_ctxt_prop-type_kind EQ cl_abap_typedescr=>typekind_char
AND ls_ctxt_prop-type_length GT 1 .
*------------ popup-dialog to request a character position of a value
popup_charpos( EXPORTING iv_length = ls_ctxt_prop-type_length
CHANGING cv_offset = ls_form_prop-cb_apr_offset
cv_match = ls_form_prop-cb_apr_match ) .
ELSE .
CLEAR: ls_form_prop-cb_apr_offset ,
ls_form_prop-cb_apr_match .
ENDIF .
ENDIF .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .
*------------ redraw the adjustments tab
r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_cb_apr_relpath_change
METHOD actn_cb_val_vld_change .
msg_init( ) .

DATA:
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
ls_form_excp TYPE lcl_form=>ty_s_exceptions ,
ls_form_prop TYPE lcl_form=>ty_s_properties ,
lv_cancel TYPE flag ,
lv_cb_fullpath TYPE ty_comp_path .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

ls_form_excp = r_formtemplate->node_get_exceptions( iv_form_id ) .


CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .
IF ls_form_excp-cb_relpath EQ c_retcode-legacy .
MESSAGE s000(lp)
WITH v_text-t127 " text: Firstly, eliminate problems due context binding
v_text-t021 . " text: on the upper levels
EXIT .
ENDIF .

*------------ get a full path of context binding


r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = iv_form_id
IMPORTING ev_cb_fullpath = lv_cb_fullpath ) .

CASE abap_on .
WHEN iv_attrpath_f4
OR iv_attrpath_mn .
*------------ popup-dialog to request a new context binding
popup_ctxtfield(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
iv_f4_strategy = r_formtemplate->r_context->c_f4_strategy-
loopstep
iv_manual = iv_attrpath_mn
CHANGING cv_cb_relpath = ls_form_prop-cb_valvld_attr_relpath
cv_cancel = lv_cancel ) .
CHECK lv_cancel IS INITIAL .

WHEN iv_attrpath_del .
*------------ request a user confirmation
CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t128 ) . " text:
Removing the binding
ls_form_prop-cb_valvld_attr_relpath = space .

WHEN iv_for1_template .
CHECK ls_form_prop-cb_valvld_for1_relpath IS NOT INITIAL
OR ls_form_prop-cb_valvld_for1_dataset_id IS NOT INITIAL .
*------------ request a user confirmation
CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t128 ) . " text:
Removing the binding
ls_form_prop-cb_valvld_for1_relpath = space .
ls_form_prop-cb_valvld_for1_dataset_id = space .
ls_form_prop-cb_valvld_for1_dataset_fld = space .

WHEN iv_for1_relpath .
*------------ popup-dialog to request a new context binding
popup_ctxtfield(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
iv_f4_strategy = r_formtemplate->r_context->c_f4_strategy-
apr_relpath
iv_manual = space
CHANGING cv_cb_relpath = ls_form_prop-cb_valvld_for1_relpath
cv_cancel = lv_cancel ) .
CHECK lv_cancel IS INITIAL .
CHECK ls_form_prop-cb_valvld_for1_relpath IS NOT INITIAL .
ls_form_prop-cb_valvld_for1_dataset_id = space .
ls_form_prop-cb_valvld_for1_dataset_fld = space .

WHEN iv_for1_dataset_id .
*------------ popup-dialog to request dataset (Grid)
popup_dataset_id( EXPORTING iv_id = ls_form_prop-id
iv_same_sheet = abap_on
CHANGING cv_dataset_id = ls_form_prop-
cb_valvld_for1_dataset_id ) .
CHECK ls_form_prop-cb_valvld_for1_dataset_id IS NOT INITIAL .
ls_form_prop-cb_valvld_for1_relpath = space .

*------------ popup-dialog to request field of dataset (Grid)


popup_dataset_field( EXPORTING iv_dataset_id = ls_form_prop-
cb_valvld_for1_dataset_id
CHANGING cv_fieldname = ls_form_prop-
cb_valvld_for1_dataset_fld ) .

WHEN iv_for1_dataset_fld .
CHECK ls_form_prop-cb_valvld_for1_dataset_id IS NOT INITIAL .
*------------ popup-dialog to request field of dataset (Grid)
popup_dataset_field( EXPORTING iv_dataset_id = ls_form_prop-
cb_valvld_for1_dataset_id
CHANGING cv_fieldname = ls_form_prop-
cb_valvld_for1_dataset_fld ) .

WHEN iv_for2_template .
CHECK ls_form_prop-cb_valvld_for2_relpath IS NOT INITIAL .
*------------ request a user confirmation
CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t128 ) . " text:
Removing the binding
ls_form_prop-cb_valvld_for2_relpath = space .

WHEN iv_for2_relpath .
*------------ popup-dialog to request a new context binding
popup_ctxtfield(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
iv_f4_strategy = r_formtemplate->r_context->c_f4_strategy-
apr_relpath
iv_manual = space
CHANGING cv_cb_relpath = ls_form_prop-cb_valvld_for2_relpath
cv_cancel = lv_cancel ) .
CHECK lv_cancel IS INITIAL .
CHECK ls_form_prop-cb_valvld_for2_relpath IS NOT INITIAL .
WHEN OTHERS .
RETURN .
ENDCASE .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_cb_val_vld_change
METHOD actn_cb_apr_relpath_delete .
msg_init( ) .

DATA ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ request a user confirmation


CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t129 ) . " text: Delete
connection with field ?

*------------ update properties


CLEAR: ls_form_prop-cb_apr_relpath ,
ls_form_prop-cb_apr_offset ,
ls_form_prop-cb_apr_match .
r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_cb_apr_relpath_delete
METHOD actn_cb_cellrng_relpth_change .
msg_init( ) .

DATA:
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
ls_form_excp TYPE lcl_form=>ty_s_exceptions ,
ls_form_prop TYPE lcl_form=>ty_s_properties ,
lv_cancel TYPE flag ,
lv_cb_fullpath TYPE ty_comp_path .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .
ls_form_excp = r_formtemplate->node_get_exceptions( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .
IF ls_form_excp-cb_relpath EQ c_retcode-legacy .
MESSAGE s000(lp)
WITH v_text-t127 " text: Firstly, eliminate problems due context binding
v_text-t021 . " text: on the upper levels
EXIT .
ENDIF .

*------------ get a full path of context binding


r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = iv_form_id
IMPORTING ev_cb_fullpath = lv_cb_fullpath ) .

IF iv_relpath_f4 IS NOT INITIAL


OR iv_relpath_mn IS NOT INITIAL .
*------------ popup-dialog to request a new context binding
popup_ctxtfield(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
iv_f4_strategy = r_formtemplate->r_context->c_f4_strategy-
apr_relpath
iv_manual = iv_relpath_mn
CHANGING cv_cb_relpath = ls_form_prop-cb_cellrng_relpath
cv_cancel = lv_cancel ) .
ENDIF .

CHECK lv_cancel IS INITIAL .

IF ls_form_prop-cb_cellrng_relpath IS INITIAL .
CLEAR: ls_form_prop-cb_cellrng_offset ,
ls_form_prop-cb_cellrng_match .
ELSE .
ls_ctxt_prop =
r_formtemplate->r_context->node_get_by_path(
iv_relpath = ls_form_prop-cb_cellrng_relpath
iv_fullpath_parent = lv_cb_fullpath ) .

IF ls_ctxt_prop-type_kind EQ cl_abap_typedescr=>typekind_char
AND ls_ctxt_prop-type_length GT 1 .
*------------ popup-dialog to request a character position of a value
popup_charpos( EXPORTING iv_length = ls_ctxt_prop-type_length
CHANGING cv_offset = ls_form_prop-cb_cellrng_offset
cv_match = ls_form_prop-cb_cellrng_match ) .
ELSE .
CLEAR: ls_form_prop-cb_cellrng_offset ,
ls_form_prop-cb_cellrng_match .
ENDIF .
ENDIF .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_cb_cellrng_relpth_change
METHOD actn_cb_cellrng_relpth_delete .
msg_init( ) .

DATA ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ request a user confirmation


CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t129 ) . " text: Delete
connection with field ?

*------------ update properties


CLEAR: ls_form_prop-cb_cellrng_relpath ,
ls_form_prop-cb_cellrng_offset ,
ls_form_prop-cb_cellrng_match .
r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_cb_cellrng_relpth_delete
METHOD actn_cb_val_relpath_change .
msg_init( ) .

DATA:
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
ls_ctxt_prop_sub TYPE lcl_context=>ty_s_properties ,
ls_form_excp TYPE lcl_form=>ty_s_exceptions ,
ls_form_prop TYPE lcl_form=>ty_s_properties ,
lv_cancel TYPE flag ,
lv_cb_fullpath TYPE ty_comp_path ,
lv_cb_comp_type TYPE ty_comp_type ,
lv_f4_strategy TYPE i .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

ls_form_excp = r_formtemplate->node_get_exceptions( iv_form_id ) .


CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .
IF ls_form_excp-cb_relpath EQ c_retcode-legacy .
MESSAGE s000(lp)
WITH v_text-t127 " text: Firstly, eliminate problems due context binding
v_text-t021 . " text: on the upper levels
EXIT .
ENDIF .

*------------ get a full path of context binding


r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = iv_form_id
IMPORTING ev_cb_fullpath = lv_cb_fullpath ) .

*======================================================================
* relative path
*======================================================================
IF iv_relpath_f4 IS NOT INITIAL
OR iv_relpath_mn IS NOT INITIAL .

CASE ls_form_prop-comp_type .
WHEN r_formtemplate->c_comp_type-tree . lv_f4_strategy =
r_formtemplate->r_context->c_f4_strategy-tree .
WHEN r_formtemplate->c_comp_type-grid . lv_f4_strategy =
r_formtemplate->r_context->c_f4_strategy-grid .
WHEN OTHERS . lv_f4_strategy =
r_formtemplate->r_context->c_f4_strategy-value .
ENDCASE .

*------------ popup-dialog to request a new context binding


popup_ctxtfield(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
iv_f4_strategy = lv_f4_strategy
iv_manual = iv_relpath_mn
CHANGING cv_cb_relpath = ls_form_prop-cb_val_relpath
cv_cb_comp_type = lv_cb_comp_type
cv_cancel = lv_cancel ) .
CHECK lv_cancel IS INITIAL .

IF lv_cb_comp_type EQ r_formtemplate->r_context->c_comp_type-table
AND ls_form_prop-comp_type NE r_formtemplate->c_comp_type-tree
AND ls_form_prop-comp_type NE r_formtemplate->c_comp_type-grid .
popup_ctxtfield_sub(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
iv_cb_relpath = ls_form_prop-cb_val_relpath
CHANGING cv_cb_val_sub_col = ls_form_prop-cb_val_sub_col
cv_cb_val_sub_row = ls_form_prop-cb_val_sub_row
cs_ctxt_prop = ls_ctxt_prop_sub
cv_cancel = lv_cancel ) .
CHECK lv_cancel IS INITIAL .
ENDIF .
ENDIF .

DO 1 TIMES .
CHECK ls_form_prop-comp_type NE r_formtemplate->c_comp_type-tree .
CHECK ls_form_prop-comp_type NE r_formtemplate->c_comp_type-grid .

*======================================================================
* context properties
*======================================================================
IF ls_form_prop-cb_val_relpath IS INITIAL .
CLEAR: ls_form_prop-cb_val_offset ,
ls_form_prop-cb_val_match ,
ls_form_prop-cb_val_convert ,
ls_form_prop-cb_val_sub_req ,
ls_form_prop-cb_val_sub_row ,
ls_form_prop-cb_val_sub_col .
ELSE .
ls_ctxt_prop =
r_formtemplate->r_context->node_get_by_path(
iv_relpath = ls_form_prop-cb_val_relpath
iv_fullpath_parent = lv_cb_fullpath ) .
ENDIF .

*======================================================================
* sub
*======================================================================
IF ls_ctxt_prop-comp_type EQ r_formtemplate->r_context->c_comp_type-table .
ls_ctxt_prop_sub =
r_formtemplate->get_sub_ctxt( iv_cb_fullpath = lv_cb_fullpath
is_form_prop = ls_form_prop ) .

IF iv_sub IS NOT INITIAL .


popup_ctxtfield_sub(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
iv_cb_relpath = ls_form_prop-cb_val_relpath
CHANGING cv_cb_val_sub_col = ls_form_prop-cb_val_sub_col
cv_cb_val_sub_row = ls_form_prop-cb_val_sub_row
cs_ctxt_prop = ls_ctxt_prop_sub
cv_cancel = lv_cancel ) .
IF lv_cancel IS NOT INITIAL .
RETURN .
ENDIF .
ENDIF .
ENDIF .

*======================================================================
* character position of a value
*======================================================================
CHECK ls_form_prop-comp_type NE r_formtemplate->c_comp_type-drawing .

IF ls_ctxt_prop-type_kind EQ cl_abap_typedescr=>typekind_char
AND ls_ctxt_prop-type_length GT 1 .
IF iv_charpos IS NOT INITIAL .
*------------ popup-dialog to request a character position of a value
popup_charpos( EXPORTING iv_length = ls_ctxt_prop-type_length
CHANGING cv_offset = ls_form_prop-cb_val_offset
cv_match = ls_form_prop-cb_val_match
cv_cancel = lv_cancel ) .
IF lv_cancel IS NOT INITIAL .
RETURN .
ENDIF .
ENDIF .

ELSEIF ls_ctxt_prop_sub-type_kind EQ cl_abap_typedescr=>typekind_char


AND ls_ctxt_prop_sub-type_length GT 1 .
IF iv_charpos IS NOT INITIAL .
*------------ popup-dialog to request a character position of a value
popup_charpos( EXPORTING iv_length = ls_ctxt_prop_sub-type_length
CHANGING cv_offset = ls_form_prop-cb_val_offset
cv_match = ls_form_prop-cb_val_match
cv_cancel = lv_cancel ) .
IF lv_cancel IS NOT INITIAL .
RETURN .
ENDIF .
ENDIF .
ELSE .
CLEAR: ls_form_prop-cb_val_offset ,
ls_form_prop-cb_val_match .
ENDIF .

*======================================================================
* convertion
*======================================================================
IF iv_convertion IS NOT INITIAL .
CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-field
OR lcl_form=>c_comp_type-sheet .
CASE ls_form_prop-cb_val_convert .
WHEN space . ls_form_prop-cb_val_convert = abap_on .
WHEN OTHERS . ls_form_prop-cb_val_convert = abap_off .
ENDCASE .

WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is
irrelevant for component type
EXIT .
ENDCASE .
ENDIF .
ENDDO .

*======================================================================
* update
*======================================================================
*------------ update properties
r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_cb_val_relpath_change
METHOD actn_cb_val_relpath_delete .
msg_init( ) .

DATA ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ request a user confirmation


CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t129 ) . " text: Delete
connection with field ?

*------------ update properties


CLEAR: ls_form_prop-cb_val_relpath ,
ls_form_prop-cb_val_offset ,
ls_form_prop-cb_val_match .
r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_cb_val_relpath_delete
METHOD actn_tb_val_layout_change .
msg_init( ) .
DATA ls_form_prop TYPE lcl_form=>ty_s_properties .
DATA lv_cancel TYPE flag .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ checks
CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-field .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ set new property


CLEAR ls_form_prop-tb_val_formula .
CLEAR ls_form_prop-tb_val_matrix .
CLEAR ls_form_prop-tb_val_matr_r .
CLEAR ls_form_prop-tb_val_matr_c .

IF iv_valformula IS NOT INITIAL .


ls_form_prop-tb_val_formula = abap_on .
ELSEIF iv_valmatrix IS NOT INITIAL .
ls_form_prop-tb_val_matrix = abap_on .
*------------ popup-dialog to request an interval between rows / columns
popup_matrix_interval( CHANGING cv_rows = ls_form_prop-tb_val_matr_r
cv_cols = ls_form_prop-tb_val_matr_c
cv_cancel = lv_cancel ) .
CHECK lv_cancel IS INITIAL .
ENDIF .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .
ENDMETHOD . "actn_tb_val_layout_change
METHOD actn_tb_sheetname_change .
msg_init( ) .

DATA ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ checks
CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-sheet .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ popup-dialog to request a new binding with sheet


ls_form_prop-tb_sheetname = popup_tbsheet( ) .
CHECK ls_form_prop-tb_sheetname IS NOT INITIAL .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .
ENDMETHOD . "actn_tb_sheetname_change
METHOD actn_tb_sheetname_delete .
msg_init( ) .

DATA ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ checks
CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-sheet .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ request a user confirmation


CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t131 ) . " text: Delete
connection with a sheet ?

*------------ update properties


ls_form_prop-tb_sheetname = space .
r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .
ENDMETHOD . "actn_tb_sheetname_delete
METHOD actn_tb_sheetstate .
msg_init( ) .

DATA ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ checks
CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-sheet .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ update properties


CASE ls_form_prop-tb_sheetstate .
WHEN space . ls_form_prop-tb_sheetstate = abap_on .
WHEN OTHERS . ls_form_prop-tb_sheetstate = space .
ENDCASE .

r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .


CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .
ENDMETHOD . "actn_tb_sheetstate
METHOD actn_tb_sheetprotection .
msg_init( ) .

DATA:
ls_form_excp TYPE lcl_form=>ty_s_exceptions ,
ls_form_prop TYPE lcl_form=>ty_s_properties ,
lv_cancel TYPE flag ,
lv_selected TYPE ty_char1 ,
lv_password TYPE string ,
lv_cb_fullpath TYPE ty_comp_path ,
ls_sheetprotection TYPE lcl_form=>ty_s_sheetprotection .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ checks
CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-sheet .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ request of approach to sheet protection


ls_sheetprotection = lcl_form=>conv_sheetprotection_st( ls_form_prop-
tb_sheetprotection ) .

CASE abap_on .
WHEN iv_change .
CASE ls_sheetprotection-mode .
WHEN c_sheetprotection_mode-off . lv_selected = '3' .
WHEN c_sheetprotection_mode-from_template . lv_selected = '1' .
WHEN c_sheetprotection_mode-from_context . lv_selected = '2' .
WHEN c_sheetprotection_mode-static . lv_selected = '3' .
WHEN OTHERS . RETURN .
ENDCASE .
popup_to_decide( EXPORTING iv_title = v_text-t298 "
-->> text: Sheet protection
iv_text = v_text-t298 "
-->> text: Sheet protection
iv_text_rb1 = v_text-t299 "
-->> text: From template
iv_text_rb2 = v_text-t300 "
-->> text: From context
iv_text_rb3 = v_text-t301 "
-->> text: Static
IMPORTING ev_cancel = lv_cancel
CHANGING cv_selected_rb = lv_selected ) .
CASE lv_selected .
WHEN '1' . ls_sheetprotection-mode = c_sheetprotection_mode-from_template
.
WHEN '2' . ls_sheetprotection-mode = c_sheetprotection_mode-
from_context .
WHEN '3' . ls_sheetprotection-mode = c_sheetprotection_mode-static .
ENDCASE .

WHEN iv_delete .
ls_sheetprotection-mode = c_sheetprotection_mode-off .
ENDCASE .

CHECK lv_cancel IS INITIAL .

*------------ request of password options


CASE ls_sheetprotection-mode .
WHEN c_sheetprotection_mode-from_context
OR c_sheetprotection_mode-static .

popup_sheetprotection_password(
IMPORTING ev_cancel = lv_cancel
CHANGING cv_password = ls_sheetprotection-password ) .
ENDCASE .

CHECK lv_cancel IS INITIAL .

*------------ request of new options of sheet protection


CASE ls_sheetprotection-mode .
WHEN c_sheetprotection_mode-off .
CLEAR ls_sheetprotection .

WHEN c_sheetprotection_mode-from_template .
CLEAR ls_sheetprotection .
ls_sheetprotection-mode = c_sheetprotection_mode-from_template.

WHEN c_sheetprotection_mode-from_context .
lv_cb_fullpath = ls_sheetprotection-cb_val_relpath .
lv_password = ls_sheetprotection-password .
CLEAR ls_sheetprotection .
ls_sheetprotection-cb_val_relpath = lv_cb_fullpath .
ls_sheetprotection-mode = c_sheetprotection_mode-from_context .
ls_sheetprotection-password = lv_password .

ls_form_excp = r_formtemplate->node_get_exceptions( iv_form_id ) .


CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .
IF ls_form_excp-cb_relpath EQ c_retcode-legacy .
MESSAGE s000(lp)
WITH v_text-t127 " text: Firstly, eliminate problems due context
binding
v_text-t021 . " text: on the upper levels
RETURN .
ENDIF .

*------------ get a full path of context binding


r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = iv_form_id
IMPORTING ev_cb_fullpath = lv_cb_fullpath ) .

*------------ popup-dialog to request a new context binding


popup_ctxtfield(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
iv_f4_strategy = r_formtemplate->r_context-
>c_f4_strategy-apr_relpath " value
CHANGING cv_cb_relpath = ls_sheetprotection-cb_val_relpath
cv_cancel = lv_cancel ) .
CHECK ls_sheetprotection-cb_val_relpath IS NOT INITIAL .

WHEN c_sheetprotection_mode-static .
CLEAR ls_sheetprotection-cb_val_relpath .
ls_sheetprotection-mode = c_sheetprotection_mode-static .

popup_sheetprotection_static(
IMPORTING ev_cancel = lv_cancel
CHANGING cs_sheetprotection = ls_sheetprotection ) .

ENDCASE .

CHECK lv_cancel IS INITIAL .

*------------ update properties


ls_form_prop-tb_sheetprotection =
lcl_form=>conv_sheetprotection_ts( ls_sheetprotection ) .
r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .
ENDMETHOD . "actn_tb_sheetprotection
METHOD actn_tb_area_setcells .
msg_init( ) .

DATA:
lv_tb_sheetname_legacy TYPE ty_char31 ,
lv_tb_sheetname_current TYPE ty_char31 ,
ls_form_expt TYPE lcl_form=>ty_s_exceptions ,
ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_expt = r_formtemplate->node_get_exceptions( iv_form_id ) .

ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .


CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

r_formtemplate->node_get_legacy_info( EXPORTING iv_id = iv_form_id


IMPORTING ev_tb_sheetname =
lv_tb_sheetname_legacy ) .
IF lv_tb_sheetname_legacy IS INITIAL
OR ls_form_expt-tb_sheetname EQ c_retcode-legacy .
MESSAGE i000(lp)
WITH v_text-t026 " text: problem occurs with component
v_text-t008 " text: Sheet
v_text-t021 . " text: on the upper levels
EXIT .
ENDIF .

*------------ determine selected area


r_excelole->selection_get(
IMPORTING ev_sheet = lv_tb_sheetname_current
ev_area_top = ls_form_prop-tb_area_top
ev_area_left = ls_form_prop-tb_area_left
ev_area_rows = ls_form_prop-tb_area_rows
ev_area_columns = ls_form_prop-tb_area_columns ) .
IF lv_tb_sheetname_current IS INITIAL
OR lv_tb_sheetname_current NE lv_tb_sheetname_legacy
OR ( ls_form_prop-tb_area_top IS INITIAL
AND ls_form_prop-tb_area_left IS INITIAL
AND ls_form_prop-tb_area_rows IS INITIAL
AND ls_form_prop-tb_area_columns IS INITIAL ) .
MESSAGE i000(lp)
WITH v_text-t132 " text: Specify an area on the sheet
lv_tb_sheetname_legacy .
EXIT .
ENDIF .

*------------ clear mark in the text


CLEAR ls_form_prop-tb_area_textmark .

IF s_presets_dt-popup_tb IS NOT INITIAL .


*------------ request user confirmation
CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t133 ) . " text:
Connection with selected area in the template will be created
ENDIF .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .
ENDMETHOD . "actn_tb_area_setcells
METHOD actn_tb_area_settextmark .
msg_init( ) .

DATA:
lv_retcode TYPE flag ,
ls_form_expt TYPE lcl_form=>ty_s_exceptions ,
ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_expt = r_formtemplate->node_get_exceptions( iv_form_id ) .
ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ request mark in the text


IF ls_form_prop-tb_area_textmark IS INITIAL .
CONCATENATE '[' ls_form_prop-comp_name ']' INTO ls_form_prop-tb_area_textmark
.
ENDIF .

popup_textmark( CHANGING cv_retcode = lv_retcode


cv_textmark = ls_form_prop-tb_area_textmark ) .
CHECK lv_retcode IS INITIAL .

*------------ clear area cells


CLEAR:
ls_form_prop-tb_area_top ,
ls_form_prop-tb_area_left ,
ls_form_prop-tb_area_rows ,
ls_form_prop-tb_area_columns .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .
ENDMETHOD . "actn_tb_area_settextmark
METHOD actn_tb_area_delete .
msg_init( ) .

DATA ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ request a user confirmation


CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t128 ) . " text: Removing
of the binding

*------------ update properties


CLEAR ls_form_prop-tb_area_textmark .
CLEAR ls_form_prop-tb_area_top .
CLEAR ls_form_prop-tb_area_left .
CLEAR ls_form_prop-tb_area_rows .
CLEAR ls_form_prop-tb_area_columns .
r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_tb_area_delete
METHOD actn_tb_direction_change .
msg_init( ).
DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ determine selected area


CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-folder
OR lcl_form=>c_comp_type-pattern
OR lcl_form=>c_comp_type-respattern
OR lcl_form=>c_comp_type-tree
OR lcl_form=>c_comp_type-grid .

CASE ls_form_prop-tb_direction .
WHEN lcl_form=>c_tb_direction-up2down .
ls_form_prop-tb_direction = lcl_form=>c_tb_direction-left2right .
WHEN lcl_form=>c_tb_direction-left2right .
ls_form_prop-tb_direction = lcl_form=>c_tb_direction-up2down .
ENDCASE .

WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ).
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL.

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ).

ENDMETHOD . "actn_tb_direction_change
METHOD actn_tb_colrow_prop_change .
msg_init( ).

DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ checks
CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-pattern
OR lcl_form=>c_comp_type-respattern .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .
*------------ set new property
IF iv_rows IS NOT INITIAL .
CASE ls_form_prop-tb_rowprop .
WHEN space . ls_form_prop-tb_rowprop = abap_on .
WHEN OTHERS . ls_form_prop-tb_rowprop = abap_off .
ENDCASE .

ELSEIF iv_columns IS NOT INITIAL .


CASE ls_form_prop-tb_colprop .
WHEN space . ls_form_prop-tb_colprop = abap_on .
WHEN OTHERS . ls_form_prop-tb_colprop = abap_off .
ENDCASE .
ENDIF .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ).
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL.

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ).

ENDMETHOD . "actn_tb_colrow_prop_change
METHOD actn_tb_colrow_group_change .
msg_init( ).

DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ checks
CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-folder .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ set new property


IF iv_clp IS INITIAL .
IF iv_rows IS NOT INITIAL .
CASE ls_form_prop-tb_rowgroup .
WHEN space . ls_form_prop-tb_rowgroup = abap_on .
WHEN OTHERS . ls_form_prop-tb_rowgroup = abap_off .
ENDCASE .

ELSEIF iv_columns IS NOT INITIAL .


CASE ls_form_prop-tb_colgroup .
WHEN space . ls_form_prop-tb_colgroup = abap_on .
WHEN OTHERS . ls_form_prop-tb_colgroup = abap_off .
ENDCASE .
ENDIF .
ELSE .
IF iv_rows IS NOT INITIAL .
CASE ls_form_prop-tb_rowgroup_clp .
WHEN space . ls_form_prop-tb_rowgroup_clp = abap_on .
WHEN OTHERS . ls_form_prop-tb_rowgroup_clp = abap_off .
ENDCASE .

ELSEIF iv_columns IS NOT INITIAL .


CASE ls_form_prop-tb_colgroup_clp .
WHEN space . ls_form_prop-tb_colgroup_clp = abap_on .
WHEN OTHERS . ls_form_prop-tb_colgroup_clp = abap_off .
ENDCASE .
ENDIF .
ENDIF .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ).
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL.

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ).

ENDMETHOD . "actn_tb_colrow_group_change
METHOD actn_tb_drwstatflag_change .
msg_init( ).

DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ set new property


CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-drawing .
CASE ls_form_prop-tb_drwstat_flag .
WHEN space . ls_form_prop-tb_drwstat_flag = abap_on .
WHEN OTHERS . ls_form_prop-tb_drwstat_flag = abap_off .
ENDCASE .

WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_tb_drwstatflag_change
METHOD actn_tb_drwstatname_change .
msg_init( ) .

DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties ,
ls_form_excp TYPE lcl_form=>ty_s_exceptions ,
lv_tb_sheetname TYPE ty_char31 .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

IF ls_form_prop-tb_drwstat_flag IS INITIAL .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant for
component type
EXIT .
ENDIF .

*=======================================
IF iv_change IS NOT INITIAL .
*=======================================

r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = iv_form_id
IMPORTING ev_tb_sheetname = lv_tb_sheetname
es_exceptions = ls_form_excp ) .

IF lv_tb_sheetname IS INITIAL
OR ls_form_excp-tb_sheetname EQ c_retcode-error
OR ls_form_excp-tb_sheetname EQ c_retcode-legacy .
MESSAGE i000(lp)
WITH v_text-t026 " text: problem occurs with component
v_text-t008 " text: Sheet
v_text-t021 INTO v_dummy . " text: on the upper levels
EXIT .
ENDIF .

*------------ popup-dialog to request a new binding with Drawing or Chart


CASE ls_form_prop-comp_type .
WHEN r_formtemplate->c_comp_type-drawing .
ls_form_prop-tb_drwstat_name = popup_tbdrawing( iv_sheetname =
lv_tb_sheetname
iv_vector = abap_on
iv_bitmap =
abap_on ) .
WHEN r_formtemplate->c_comp_type-chart .
ls_form_prop-tb_drwstat_name = popup_tbdrawing( iv_sheetname =
lv_tb_sheetname
iv_chart =
abap_on ) .
ENDCASE .
CHECK ls_form_prop-tb_drwstat_name IS NOT INITIAL .

*=======================================
ELSEIF iv_delete IS NOT INITIAL .
*=======================================
CHECK ls_form_prop-tb_drwstat_name IS NOT INITIAL .
CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t128 ) . " text:
Removing the binding
CLEAR ls_form_prop-tb_drwstat_name .

ENDIF .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .
ENDMETHOD . "actn_tb_drwstatname_change
METHOD actn_tb_drwsize_change .
msg_init( ) .

DATA:
ls_form_excp TYPE lcl_form=>ty_s_exceptions ,
ls_form_prop TYPE lcl_form=>ty_s_properties ,
lv_cancel TYPE flag ,
lv_cb_fullpath TYPE ty_comp_path .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ checks
CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-drawing
OR lcl_form=>c_comp_type-chart .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

ls_form_excp = r_formtemplate->node_get_exceptions( iv_form_id ) .


CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

CASE abap_on .
WHEN iv_context
OR iv_h_f4
OR iv_h_mn
OR iv_w_f4
OR iv_w_mn .

IF ls_form_excp-cb_relpath EQ c_retcode-legacy .
MESSAGE s000(lp)
WITH v_text-t127 " text: Firstly, eliminate problems due context
binding
v_text-t021 . " text: on the upper levels
EXIT .
ENDIF .
ENDCASE .

*------------ process
CASE abap_on .
WHEN iv_fit .
ls_form_prop-drawing_size = lcl_form=>c_drawing_size-fit_within_area .
ls_form_prop-drawing_size_h_relpath = space .
ls_form_prop-drawing_size_w_relpath = space .

WHEN iv_context .
ls_form_prop-drawing_size = lcl_form=>c_drawing_size-from_context .

WHEN iv_h_f4
OR iv_h_mn .

*------------ get a full path of context binding


r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = iv_form_id
IMPORTING ev_cb_fullpath = lv_cb_fullpath ) .

*------------ popup-dialog to request a new context binding


popup_ctxtfield(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
iv_f4_strategy = r_formtemplate->r_context->c_f4_strategy-
apr_relpath
iv_manual = iv_h_mn
CHANGING cv_cb_relpath = ls_form_prop-drawing_size_h_relpath
cv_cancel = lv_cancel ) .

WHEN iv_w_f4
OR iv_w_mn .

*------------ get a full path of context binding


r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = iv_form_id
IMPORTING ev_cb_fullpath = lv_cb_fullpath ) .

*------------ popup-dialog to request a new context binding


popup_ctxtfield(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
iv_f4_strategy = r_formtemplate->r_context->c_f4_strategy-
apr_relpath
iv_manual = iv_w_mn
CHANGING cv_cb_relpath = ls_form_prop-drawing_size_w_relpath
cv_cancel = lv_cancel ) .
ENDCASE .

CHECK lv_cancel IS INITIAL .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_tb_drwsize_change
METHOD actn_tb_pgbreak .
msg_init( ) .

DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties .
*------------ read an actual node
ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ checks
CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-folder .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ process
IF iv_nopgbreak IS INITIAL .
*------------ Insert page break (at the beginning)
IF iv_top IS NOT INITIAL .
CASE ls_form_prop-tb_pgbrk_top .
WHEN space . ls_form_prop-tb_pgbrk_top = abap_on .
WHEN OTHERS. ls_form_prop-tb_pgbrk_top = abap_off .
ENDCASE .

ELSEIF iv_left IS NOT INITIAL .


CASE ls_form_prop-tb_pgbrk_left .
WHEN space . ls_form_prop-tb_pgbrk_left = abap_on .
WHEN OTHERS. ls_form_prop-tb_pgbrk_left = abap_off .
ENDCASE .
ELSE .
EXIT .
ENDIF .

ELSE .
*------------ Preventing automatic page breaks (inside)
IF iv_top IS NOT INITIAL .
IF ls_form_prop-tb_nopgbrk_top IS INITIAL .
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = v_text-t105 " text: Notice!
txt2 = v_text-t157 " text: This option will be implemented via
OLE on FrontEnd
txt1 = space.

ls_form_prop-tb_nopgbrk_top = abap_on .

popup_pgbrk( EXPORTING iv_top = abap_on


CHANGING cv_shift = ls_form_prop-tb_nopgbrk_top_shift ) .
ELSE .
CLEAR: ls_form_prop-tb_nopgbrk_top ,
ls_form_prop-tb_nopgbrk_top_shift .
ENDIF .

ELSEIF iv_left IS NOT INITIAL .


IF ls_form_prop-tb_nopgbrk_left IS INITIAL .
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = v_text-t105 " text: Notice!
txt2 = v_text-t157 " text: This option will be implemented via
OLE on FrontEnd
txt1 = space.
ls_form_prop-tb_nopgbrk_left = abap_on .

popup_pgbrk( EXPORTING iv_left = abap_on


CHANGING cv_shift = ls_form_prop-tb_nopgbrk_left_shift ) .
ELSE .
CLEAR: ls_form_prop-tb_nopgbrk_left ,
ls_form_prop-tb_nopgbrk_left_shift .
ENDIF .
ELSE .
EXIT .
ENDIF .

IF ls_form_prop-tb_nopgbrk_top IS NOT INITIAL


OR ls_form_prop-tb_nopgbrk_left IS NOT INITIAL .
popup_postprocessing_info( ) .
ENDIF .

ENDIF .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .
ENDMETHOD . "actn_tb_pgbreak
METHOD actn_tb_printtitles .
msg_init( ) .

DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties ,
lv_tb_sheetname TYPE ty_char31 .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ process
r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = iv_form_id
IMPORTING ev_tb_sheetname = lv_tb_sheetname ) .
CHECK lv_tb_sheetname IS NOT INITIAL .

IF iv_rows IS NOT INITIAL .


IF iv_delete IS NOT INITIAL .
CLEAR ls_form_prop-tb_printtitles_r .
ELSEIF iv_change IS NOT INITIAL .
popup_printtitles(
EXPORTING iv_sheetname = lv_tb_sheetname
iv_rows = abap_on
CHANGING cv_comp_id = ls_form_prop-tb_printtitles_r ) .
ENDIF .

ELSEIF iv_cols IS NOT INITIAL .


IF iv_delete IS NOT INITIAL .
CLEAR ls_form_prop-tb_printtitles_c .
ELSEIF iv_change IS NOT INITIAL .
popup_printtitles(
EXPORTING iv_sheetname = lv_tb_sheetname
iv_cols = abap_on
CHANGING cv_comp_id = ls_form_prop-tb_printtitles_c ) .
ENDIF .
ELSE .
EXIT .
ENDIF .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .
ENDMETHOD . "actn_tb_printtitles
METHOD actn_tb_mergecells_change .
msg_init( ).

DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ determine selected area


CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-respattern .

CASE ls_form_prop-tb_mergecells .
WHEN lcl_form=>c_tb_mergecells-rows .
ls_form_prop-tb_mergecells = lcl_form=>c_tb_mergecells-cols .
WHEN lcl_form=>c_tb_mergecells-cols .
ls_form_prop-tb_mergecells = lcl_form=>c_tb_mergecells-rows .
ENDCASE .

WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_tb_mergecells_change
METHOD actn_tb_autofitmerged_change .
msg_init( ).
DATA ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ determine selected area


CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-pattern
OR lcl_form=>c_comp_type-respattern .

IF ls_form_prop-tb_autofitmerged_r IS INITIAL
AND ls_form_prop-tb_autofitmerged_c IS INITIAL
AND ( iv_rows IS NOT INITIAL OR iv_cols IS NOT INITIAL ) .
popup_postprocessing_info( ) .
ENDIF .
ls_form_prop-tb_autofitmerged_r = iv_rows .
ls_form_prop-tb_autofitmerged_c = iv_cols .

WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_tb_autofitmerged_change
METHOD actn_tb_respattern_place .
msg_init( ).

DATA ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ determine selected area


CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-respattern .
CASE abap_on .
WHEN iv_before . ls_form_prop-tb_respattern_place =
lcl_form=>c_respattern_place-before_subarea .
WHEN iv_after . ls_form_prop-tb_respattern_place =
lcl_form=>c_respattern_place-after_subarea .
ENDCASE .

WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .
*------------ update properties
r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_tb_respattern_place
METHOD actn_tree_layout_change .
msg_init( ).

DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties ,
ls_ctxt_prop TYPE lcl_context=>ty_s_properties ,
lv_cb_fullpath TYPE ty_comp_path ,
ls_tree_layout TYPE ty_s_tree_layout .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ read context binding properties


IF ls_form_prop-cb_val_relpath IS NOT INITIAL .
r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = iv_form_id
IMPORTING ev_cb_fullpath = lv_cb_fullpath ) .

ls_ctxt_prop =
r_formtemplate->r_context->node_get_by_path(
iv_relpath = ls_form_prop-cb_val_relpath
iv_fullpath_parent = lv_cb_fullpath ) .
ENDIF .

*------------ checks
CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-tree .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ process
lcl_form=>conv_container_fs(
EXPORTING iv_field = ls_form_prop-tree_layout
IMPORTING es_structure = ls_tree_layout ) .

IF iv_rotate IS NOT INITIAL .


CASE ls_tree_layout-rotate .
WHEN space . ls_tree_layout-rotate = abap_on .
WHEN OTHERS . ls_tree_layout-rotate = abap_off .
ENDCASE .

ELSEIF iv_stru_exp_coll IS NOT INITIAL .


CASE ls_ctxt_prop-comp_type .
WHEN lcl_context=>c_comp_type-tree .
CASE ls_tree_layout-stru_exp_coll .
WHEN lcl_form=>c_stru_exp_coll-expanded . ls_tree_layout-
stru_exp_coll = lcl_form=>c_stru_exp_coll-collapsed .
WHEN lcl_form=>c_stru_exp_coll-collapsed . ls_tree_layout-
stru_exp_coll = lcl_form=>c_stru_exp_coll-dynamic .
WHEN OTHERS . ls_tree_layout-
stru_exp_coll = lcl_form=>c_stru_exp_coll-expanded .
ENDCASE .
WHEN lcl_context=>c_comp_type-tree_s .
CASE ls_tree_layout-stru_exp_coll .
WHEN lcl_form=>c_stru_exp_coll-expanded . ls_tree_layout-
stru_exp_coll = lcl_form=>c_stru_exp_coll-collapsed .
WHEN OTHERS . ls_tree_layout-
stru_exp_coll = lcl_form=>c_stru_exp_coll-expanded .
ENDCASE .
ENDCASE .

ELSEIF iv_stru IS NOT INITIAL .


CASE ls_tree_layout-stru .
WHEN space . ls_tree_layout-stru = abap_on .
WHEN OTHERS . ls_tree_layout-stru = abap_off .
ENDCASE .

ELSEIF iv_head IS NOT INITIAL .


CASE ls_tree_layout-head .
WHEN space . ls_tree_layout-head = abap_on .
WHEN OTHERS . ls_tree_layout-head = abap_off .
ENDCASE .

ELSEIF iv_col_hier IS NOT INITIAL .


CASE ls_tree_layout-col_hier .
WHEN space .
ls_tree_layout-col_hier = abap_on .
ls_tree_layout-col_hier_shift = 5 .
WHEN OTHERS .
ls_tree_layout-col_hier = abap_off .
ls_tree_layout-col_hier_shift = 0 .
ENDCASE .

ELSEIF iv_col_hier_after IS NOT INITIAL .


CASE ls_tree_layout-col_hier_after .
WHEN space . ls_tree_layout-col_hier_after = abap_on .
WHEN OTHERS . ls_tree_layout-col_hier_after = abap_off .
ENDCASE .

ELSEIF iv_col_hier_shift IS NOT INITIAL .

popup_to_get_value(
EXPORTING iv_title = v_text-t126 " -->> text: Specify new value
iv_tabname = 'ALPDBUIALV'
iv_fieldname = 'INDEX'
iv_fieldtext = v_text-t191 " -->> text: shift
CHANGING cv_value = ls_tree_layout-col_hier_shift ) .

ELSEIF iv_col_othr IS NOT INITIAL .


CASE ls_tree_layout-col_othr .
WHEN space .
ls_tree_layout-col_othr = abap_on .
ls_tree_layout-col_othr_width = 0 .
WHEN OTHERS .
ls_tree_layout-col_othr = abap_off .
ls_tree_layout-col_othr_width = 0 .
ENDCASE .

ELSEIF iv_col_othr_width IS NOT INITIAL .


IF ls_tree_layout-col_othr_width IS INITIAL
OR ls_tree_layout-col_othr_width EQ 0 .
ls_tree_layout-col_othr_width = 1 .

popup_to_get_value(
EXPORTING iv_title = v_text-t126 " -->> text: Specify new value
iv_tabname = 'ALPDBUIALV'
iv_fieldname = 'INDEX'
iv_fieldtext = v_text-t202 " -->> text: multiplier
CHANGING cv_value = ls_tree_layout-col_othr_width ) .
IF ls_tree_layout-col_othr_width IS INITIAL .
MESSAGE s000(lp) WITH v_text-t100 . " text: Operation was
terminated by the user
EXIT .
ENDIF .
ELSE .
ls_tree_layout-col_othr_width = 0 .
ENDIF .

ELSEIF iv_col_othr_allowformulas IS NOT INITIAL .


CASE ls_tree_layout-allow_formulas .
WHEN space . ls_tree_layout-allow_formulas = abap_on .
WHEN OTHERS. ls_tree_layout-allow_formulas = abap_off .
ENDCASE .
ELSE .
EXIT .
ENDIF .

lcl_form=>conv_container_sf(
EXPORTING is_structure = ls_tree_layout
IMPORTING ev_field = ls_form_prop-tree_layout ) .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .
ENDMETHOD . "actn_tree_layout_change
METHOD actn_grid_layout_change .
msg_init( ).

DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties ,
ls_grid_layout TYPE ty_s_grid_layout .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ checks
CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-grid .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ process
lcl_form=>conv_container_fs(
EXPORTING iv_field = ls_form_prop-grid_layout
IMPORTING es_structure = ls_grid_layout ) .

IF iv_rotate IS NOT INITIAL .


CASE ls_grid_layout-rotate .
WHEN space . ls_grid_layout-rotate = abap_on .
WHEN OTHERS . ls_grid_layout-rotate = abap_off .
ENDCASE .

ELSEIF iv_head IS NOT INITIAL .


CASE ls_grid_layout-head .
WHEN space . ls_grid_layout-head = abap_on .
WHEN OTHERS . ls_grid_layout-head = abap_off .
ENDCASE .

ELSEIF iv_head_titles IS NOT INITIAL .


CASE ls_grid_layout-head_titles .
WHEN lcl_form=>c_head_titles-tech . ls_grid_layout-head_titles =
lcl_form=>c_head_titles-descr .
WHEN lcl_form=>c_head_titles-descr . ls_grid_layout-head_titles =
lcl_form=>c_head_titles-tech_descr .
WHEN OTHERS . ls_grid_layout-head_titles =
lcl_form=>c_head_titles-tech .
ENDCASE .

ELSEIF iv_fldseq IS NOT INITIAL .


IF ls_form_prop-cb_val_relpath IS INITIAL .
MESSAGE i000(lp) WITH v_text-t022 . " text: Context binding is missing
EXIT .
ENDIF .

popup_grid_fldseq( CHANGING cs_form_prop = ls_form_prop ) .

ELSEIF iv_fldprop IS NOT INITIAL .


IF ls_form_prop-cb_val_relpath IS INITIAL .
MESSAGE i000(lp) WITH v_text-t022 . " text: Context binding is missing
EXIT .
ENDIF .
IF ls_form_prop-grid_fldseq IS INITIAL .
MESSAGE i000(lp) WITH v_text-t231 . " text: No column list is specified
EXIT .
ENDIF .
popup_grid_fldprop( CHANGING cs_form_prop = ls_form_prop ) .

ELSEIF iv_allowformulas IS NOT INITIAL .


CASE ls_grid_layout-allow_formulas .
WHEN space . ls_grid_layout-allow_formulas = abap_on .
WHEN OTHERS. ls_grid_layout-allow_formulas = abap_off .
ENDCASE .
ELSE .
EXIT .
ENDIF .

lcl_form=>conv_container_sf(
EXPORTING is_structure = ls_grid_layout
IMPORTING ev_field = ls_form_prop-grid_layout ) .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .
ENDMETHOD . "actn_grid_layout_change
METHOD actn_chart_change .
msg_init( ).

DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties ,
ls_form_excp TYPE lcl_form=>ty_s_exceptions ,
lv_cancel TYPE flag ,
lv_cb_fullpath TYPE ty_comp_path .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

ls_form_excp = r_formtemplate->node_get_exceptions( iv_form_id ) .


CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ checks
CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-chart .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ process
IF iv_model_change IS NOT INITIAL .
actn_tb_drwstatname_change( iv_alvtree_nkey = iv_alvtree_nkey
iv_form_id = iv_form_id
iv_change = abap_on ) .
EXIT .

ELSEIF iv_model_delete IS NOT INITIAL .


actn_tb_drwstatname_change( iv_alvtree_nkey = iv_alvtree_nkey
iv_form_id = iv_form_id
iv_delete = abap_on ) .
EXIT .

ELSEIF iv_title IS NOT INITIAL .


CASE ls_form_prop-chart_title .
WHEN space .
IF ls_form_excp-cb_relpath EQ c_retcode-legacy .
MESSAGE s000(lp)
WITH v_text-t127 " text: Firstly, eliminate problems due context
binding
v_text-t021 . " text: on the upper levels
EXIT .
ENDIF .
" get a full path of context binding
r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = iv_form_id
IMPORTING ev_cb_fullpath = lv_cb_fullpath ) .

" popup-dialog to request a new context binding


CLEAR ls_form_prop-chart_title_relpath .

popup_ctxtfield(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
iv_f4_strategy = r_formtemplate->r_context-
>c_f4_strategy-apr_relpath
CHANGING cv_cb_relpath = ls_form_prop-chart_title_relpath
cv_cancel = lv_cancel ) .
CHECK lv_cancel IS INITIAL .
CHECK ls_form_prop-chart_title_relpath IS NOT INITIAL .

ls_form_prop-chart_title = abap_on .

WHEN OTHERS .
ls_form_prop-chart_title = abap_off .
ENDCASE .

ELSEIF iv_title_catax IS NOT INITIAL .


CASE ls_form_prop-chart_catax_title .
WHEN space .
ls_form_prop-chart_catax_title = '1' .

WHEN '1' .
IF ls_form_excp-cb_relpath EQ c_retcode-legacy .
MESSAGE s000(lp)
WITH v_text-t127 " text: Firstly, eliminate problems due context
binding
v_text-t021 . " text: on the upper levels
EXIT .
ENDIF .
" get a full path of context binding
r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = iv_form_id
IMPORTING ev_cb_fullpath = lv_cb_fullpath ) .

" popup-dialog to request a new context binding


CLEAR ls_form_prop-chart_catax_title_relpath .

popup_ctxtfield(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
iv_f4_strategy = r_formtemplate->r_context-
>c_f4_strategy-apr_relpath
CHANGING cv_cb_relpath = ls_form_prop-
chart_catax_title_relpath
cv_cancel = lv_cancel ) .
CHECK lv_cancel IS INITIAL .
CHECK ls_form_prop-chart_catax_title_relpath IS NOT INITIAL .
ls_form_prop-chart_catax_title = abap_on .

WHEN OTHERS .
ls_form_prop-chart_catax_title = abap_off .
ENDCASE .

ELSEIF iv_title_valax IS NOT INITIAL .


CASE ls_form_prop-chart_valax_title .
WHEN space .
IF ls_form_excp-cb_relpath EQ c_retcode-legacy .
MESSAGE s000(lp)
WITH v_text-t127 " text: Firstly, eliminate problems due context
binding
v_text-t021 . " text: on the upper levels
EXIT .
ENDIF .
" get a full path of context binding
r_formtemplate->node_get_legacy_info(
EXPORTING iv_id = iv_form_id
IMPORTING ev_cb_fullpath = lv_cb_fullpath ) .

" popup-dialog to request a new context binding


CLEAR ls_form_prop-chart_valax_title_relpath .

popup_ctxtfield(
EXPORTING iv_cb_fullpath_parent = lv_cb_fullpath
iv_f4_strategy = r_formtemplate->r_context-
>c_f4_strategy-apr_relpath
CHANGING cv_cb_relpath = ls_form_prop-
chart_valax_title_relpath
cv_cancel = lv_cancel ) .
CHECK lv_cancel IS INITIAL .
CHECK ls_form_prop-chart_valax_title_relpath IS NOT INITIAL .

ls_form_prop-chart_valax_title = abap_on .

WHEN OTHERS .
ls_form_prop-chart_valax_title = abap_off .
ENDCASE .

ELSEIF iv_title_series IS NOT INITIAL .


CASE ls_form_prop-chart_series_title .
WHEN space . ls_form_prop-chart_series_title = abap_on .
WHEN OTHERS . ls_form_prop-chart_series_title = abap_off .
ENDCASE .

ELSEIF iv_dtset_change IS NOT INITIAL .


IF ls_form_excp-cb_relpath EQ c_retcode-legacy .
MESSAGE s000(lp)
WITH v_text-t127 " text: Firstly, eliminate problems due context binding
v_text-t021 . " text: on the upper levels
EXIT .
ENDIF .
popup_dataset_id( EXPORTING iv_id = ls_form_prop-id
CHANGING cv_dataset_id = ls_form_prop-dataset_id ) .

ELSEIF iv_dtset_delete IS NOT INITIAL .


CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t128 ) . " text:
Removing the binding
CLEAR ls_form_prop-dataset_id .
CLEAR ls_form_prop-dataset_series .

ELSEIF iv_dtset_series IS NOT INITIAL .


IF ls_form_prop-dataset_id IS INITIAL .
MESSAGE s000(lp) WITH v_text-t243 . " text: Dataset is not specified
EXIT .
ELSEIF ls_form_excp-dataset EQ c_retcode-error .
MESSAGE s000(lp) WITH v_text-t244 . " text: Incorrect Dataset is
specified
EXIT .
ENDIF .
popup_dataset_series( CHANGING cs_form_prop = ls_form_prop ) .

ELSE .
EXIT .
ENDIF .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .
ENDMETHOD . "actn_chart_change
METHOD actn_draft_change .
msg_init( ) .

DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ determine selected area


CASE ls_form_prop-comp_type .
WHEN lcl_form=>c_comp_type-folder .

CASE ls_form_prop-draft_subtree .
WHEN space . ls_form_prop-draft_subtree = abap_on .
WHEN OTHERS . ls_form_prop-draft_subtree = space .
ENDCASE .

WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ update properties


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the adjustments tab


r_protab->redraw( iv_form_id = ls_form_prop-id
ir_formtemplate = r_formtemplate
iv_activetab_id = r_protab->c_tab_id-adjustments ) .

ENDMETHOD . "actn_draft_change
METHOD actn_postproccessing .
DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties ,
lv_cancel TYPE flag .

*------------ checks
CASE iv_form_id .
WHEN r_formtemplate->v_root_id .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

CASE abap_on .
WHEN iv_vbs_code . popup_vbs_code_editor( CHANGING cv_vbs_code =
ls_form_prop-postproc_vbs_code cv_cancel = lv_cancel ) .
WHEN iv_vbs_tables . popup_vbs_tables( CHANGING cv_vbs_tables = ls_form_prop-
postproc_vbs_tables cv_cancel = lv_cancel ) .
WHEN OTHERS . RETURN .
ENDCASE .
CHECK lv_cancel IS INITIAL .

*------ set properties of the component


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the tab


r_protab->redraw( ir_formtemplate = r_formtemplate
iv_form_id = r_formtemplate->v_root_id
iv_activetab_id = r_protab->c_tab_id-root ) .

ENDMETHOD . "actn_postproccessing
METHOD actn_root_others .
DATA:
ls_form_prop TYPE lcl_form=>ty_s_properties .

*------------ checks
CASE iv_form_id .
WHEN r_formtemplate->v_root_id .
WHEN OTHERS .
MESSAGE i000(lp) WITH v_text-t130 . " text: The property is irrelevant
for component type
EXIT .
ENDCASE .

*------------ read an actual node


ls_form_prop = r_formtemplate->node_get_properties( iv_form_id ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

CASE abap_on .
WHEN iv_definednames_dont_remove .
CASE ls_form_prop-definednames_dont_remove .
WHEN space .
CHECK abap_on EQ popup_to_confirm( iv_text = v_text-t345 ) . " text:
Changing of this option can cause file error
ls_form_prop-definednames_dont_remove = abap_on .
WHEN OTHERS .
ls_form_prop-definednames_dont_remove = abap_off .
ENDCASE .

WHEN OTHERS .

ENDCASE .

*------ set properties of the component


r_formtemplate->node_set_properties( CHANGING cs_properties = ls_form_prop ) .
CHECK msg_check_errors_and_show( r_formtemplate ) IS INITIAL .

*------------ redraw the tab


r_protab->redraw( ir_formtemplate = r_formtemplate
iv_form_id = r_formtemplate->v_root_id
iv_activetab_id = r_protab->c_tab_id-root ) .

ENDMETHOD . "actn_root_others
METHOD tech_presets_dt_save .
* initialize extract parameters
DATA ls_disextract TYPE disextract .
ls_disextract = tech_presets_dt_init( ) .

* get splitter left column width


IF r_cont_splitter1 IS BOUND .
r_cont_splitter1->get_column_width(
EXPORTING id = 1
IMPORTING result = s_presets_dt-leftframe_width ) .
cl_gui_cfw=>dispatch( EXCEPTIONS OTHERS = 0 ) .
cl_gui_cfw=>flush( EXCEPTIONS OTHERS = 0 ) .
ENDIF .

* convert S_PRESETS_DT structure to the LT_FLDVAL table


DATA:
ls_fldval TYPE ty_s_fldval ,
lt_fldval TYPE ty_t_fldval ,
lr_descr_line TYPE REF TO cl_abap_structdescr .
FIELD-SYMBOLS:
<components> TYPE abap_compdescr ,
<value> TYPE ANY .
lr_descr_line ?= cl_abap_structdescr=>describe_by_data( s_presets_dt ) .
LOOP AT lr_descr_line->components ASSIGNING <components>.
ASSIGN COMPONENT <components>-name OF STRUCTURE s_presets_dt TO <value> .
CHECK <value> IS ASSIGNED .

ls_fldval-field = <components>-name .
ls_fldval-value = <value> .
APPEND ls_fldval TO lt_fldval .
ENDLOOP .

* save presets to the extract


CALL FUNCTION 'REUSE_ALV_EXTRACT_SAVE'
EXPORTING
is_extract = ls_disextract
i_no_message = abap_on
TABLES
it_exp01 = lt_fldval[]
EXCEPTIONS
OTHERS = 0.
COMMIT WORK .
ENDMETHOD . "tech_presets_dt_save
METHOD tech_presets_rt_save .
* initialize extract parameters
DATA ls_disextract TYPE disextract .
ls_disextract = tech_presets_rt_init( ) .

* convert S_PRESETS_RT structure to the LT_FLDVAL table


DATA:
ls_fldval TYPE ty_s_fldval ,
lt_fldval TYPE ty_t_fldval ,
lr_descr_line TYPE REF TO cl_abap_structdescr .
FIELD-SYMBOLS:
<components> TYPE abap_compdescr ,
<value> TYPE ANY .
lr_descr_line ?= cl_abap_structdescr=>describe_by_data( s_presets_rt ) .
LOOP AT lr_descr_line->components ASSIGNING <components>.
ASSIGN COMPONENT <components>-name OF STRUCTURE s_presets_rt TO <value> .
CHECK <value> IS ASSIGNED .

ls_fldval-field = <components>-name .
ls_fldval-value = <value> .
APPEND ls_fldval TO lt_fldval .
ENDLOOP .

* save presets to the extract


CALL FUNCTION 'REUSE_ALV_EXTRACT_SAVE'
EXPORTING
is_extract = ls_disextract
i_no_message = abap_on
TABLES
it_exp01 = lt_fldval[]
EXCEPTIONS
OTHERS = 0.
COMMIT WORK .
ENDMETHOD . "tech_presets_rt_save
ENDCLASS . "lcl_workbench IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_vr_appltoolbar DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_vr_appltoolbar DEFINITION INHERITING FROM lcl_root .
PUBLIC SECTION .
DATA:
r_container TYPE REF TO cl_gui_gos_container ,
r_toolbar TYPE REF TO cl_gui_toolbar .
CONSTANTS:
BEGIN OF c_fcode ,
appl_sendmail TYPE ui_func VALUE 'APPL_SENDMAIL' ,
appl_saveas TYPE ui_func VALUE 'APPL_SAVEAS' ,
appl_print TYPE ui_func VALUE 'APPL_PRINT' ,
appl_next TYPE ui_func VALUE 'APPL_NEXT' ,
appl_prev TYPE ui_func VALUE 'APPL_PREV' ,
appl_first TYPE ui_func VALUE 'APPL_FIRST' ,
appl_last TYPE ui_func VALUE 'APPL_LAST' ,
END OF c_fcode .
EVENTS:
evnt_fcode
EXPORTING value(ev_fcode) TYPE ui_func .

METHODS:
constructor
IMPORTING iv_navi_keys TYPE flag DEFAULT abap_on ,
free ,
hndl_toolbar_fcode
FOR EVENT function_selected OF cl_gui_toolbar
IMPORTING fcode .
ENDCLASS . "lcl_vr_appltoolbar DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_vr_appltoolbar IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_vr_appltoolbar IMPLEMENTATION .
METHOD constructor .
super->constructor( ) .

DATA:
lv_repid TYPE syrepid ,
lv_dynnr TYPE sydynnr ,
lv_text TYPE text100 ,
ls_events TYPE cntl_simple_event ,
lt_events TYPE cntl_simple_events .

lv_repid = sy-repid .
lv_dynnr = sy-dynnr .

CREATE OBJECT r_container


EXPORTING
width = 450
repid = lv_repid
dynnr = lv_dynnr
* no_autodef_progid_dynnr = abap_on
EXCEPTIONS
OTHERS = 5.
CHECK sy-subrc = 0 .

CREATE OBJECT r_toolbar


EXPORTING
parent = r_container.

lv_text = v_text-t047 . " text: Send mail


r_toolbar->add_button( fcode = c_fcode-appl_sendmail
icon = icon_mail
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .

lv_text = v_text-t045 . " text: Save as...


r_toolbar->add_button( fcode = c_fcode-appl_saveas
icon = icon_system_save
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .

lv_text = v_text-t224 . " text: Print out


r_toolbar->add_button( fcode = c_fcode-appl_print
icon = icon_print
butn_type = cntb_btype_button
quickinfo = lv_text(30) ) .

r_toolbar->add_button( fcode = space


icon = space
butn_type = cntb_btype_sep
quickinfo = space ) .

IF iv_navi_keys IS NOT INITIAL .


r_toolbar->add_button( fcode = c_fcode-appl_first
icon = icon_total_left
butn_type = cntb_btype_button ) .

r_toolbar->add_button( fcode = c_fcode-appl_prev


icon = icon_column_left
butn_type = cntb_btype_button ) .

r_toolbar->add_button( fcode = c_fcode-appl_next


icon = icon_column_right
butn_type = cntb_btype_button ) .

r_toolbar->add_button( fcode = c_fcode-appl_last


icon = icon_total_right
butn_type = cntb_btype_button ) .

r_toolbar->add_button( fcode = space


icon = space
butn_type = cntb_btype_sep
quickinfo = space ) .
ENDIF .

ls_events-eventid = cl_gui_toolbar=>m_id_function_selected .
APPEND ls_events TO lt_events .

r_toolbar->set_registered_events( events = lt_events ) .


SET HANDLER hndl_toolbar_fcode FOR r_toolbar .

ENDMETHOD . "constructor
METHOD free .
IF r_toolbar IS BOUND .
r_toolbar->free( ) .
FREE r_toolbar .
ENDIF .
IF r_container IS BOUND .
r_container->free( ) .
FREE r_container .
ENDIF .
ENDMETHOD . "free
METHOD hndl_toolbar_fcode .
RAISE EVENT evnt_fcode EXPORTING ev_fcode = fcode .
ENDMETHOD . "hndl_toolbar_fcode
ENDCLASS . "lcl_vr_appltoolbar IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_vr_ole DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_vr_ole DEFINITION INHERITING FROM lcl_ole .
PUBLIC SECTION .
METHODS:
constructor
IMPORTING ir_container TYPE REF TO cl_gui_container
iv_document_rawdata TYPE xstring
iv_viewmode TYPE flag
EXCEPTIONS process_terminated .
ENDCLASS . "lcl_vr_ole DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_vr_ole IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_vr_ole IMPLEMENTATION .
METHOD constructor .
super->constructor(
EXPORTING ir_container = ir_container
iv_document_rawdata = iv_document_rawdata
iv_viewmode = iv_viewmode
iv_readonly = abap_on " -->> abap_off
EXCEPTIONS OTHERS = 1 ) .
IF sy-subrc NE 0 .
RAISE process_terminated .
ENDIF .

* some action to redraw view


DATA:
BEGIN OF ls_ole ,
activewindow TYPE ole2_object ,
END OF ls_ole .

GET PROPERTY OF s_ole-application 'ActiveWindow' = ls_ole-activewindow .


SET PROPERTY OF ls_ole-activewindow 'TabRatio' = '0.6' .
IF ls_ole-activewindow IS NOT INITIAL .
FREE OBJECT ls_ole-activewindow .
CLEAR ls_ole-activewindow .
ENDIF .
ENDMETHOD . "constructor
ENDCLASS . "lcl_vr_ole IMPLEMENTATION

*----------------------------------------------------------------------*
* CLASS lcl_vr_navipanel DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_vr_navipanel DEFINITION INHERITING FROM lcl_root .
PUBLIC SECTION .
TYPES:
BEGIN OF ty_s_outtab ,
tabix TYPE sytabix ,
title TYPE sytitle ,
icon TYPE icon_d ,
END OF ty_s_outtab ,
ty_t_outtab TYPE STANDARD TABLE OF ty_s_outtab .
DATA:
r_container TYPE REF TO cl_gui_docking_container ,
r_grid TYPE REF TO cl_gui_alv_grid ,
t_outtab TYPE ty_t_outtab .
METHODS:
constructor
IMPORTING it_table TYPE STANDARD TABLE
EXCEPTIONS process_terminamed ,
free ,
set_selection
IMPORTING iv_tabix TYPE any .
EVENTS:
evnt_redraw
EXPORTING value(ev_tabix) TYPE sytabix .

PRIVATE SECTION .
METHODS:
hndl_grid_hotspot
FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING e_row_id e_column_id es_row_no .

ENDCLASS . "lcl_vr_navipanel DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_vr_navipanel IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_vr_navipanel IMPLEMENTATION .
METHOD constructor .
super->constructor( ) .

DATA:
ls_fieldcat TYPE lvc_s_fcat ,
lt_fieldcat TYPE lvc_t_fcat ,
ls_layout TYPE lvc_s_layo .
FIELD-SYMBOLS:
<row> TYPE ANY ,
<outtab> TYPE ty_s_outtab .

CREATE OBJECT r_container


EXPORTING
lifetime = cntl_lifetime_dynpro
extension = 200
EXCEPTIONS
OTHERS = 4.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING process_terminamed .
ENDIF .

CREATE OBJECT r_grid


EXPORTING
i_parent = r_container
EXCEPTIONS
OTHERS = 4.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING process_terminamed .
ENDIF .

LOOP AT it_table ASSIGNING <row> .


APPEND INITIAL LINE TO t_outtab ASSIGNING <outtab> .
MOVE-CORRESPONDING <row> TO <outtab> .
<outtab>-icon = icon_xls .
ENDLOOP .

ls_layout-sel_mode = 'A' .
ls_layout-zebra = abap_on .
ls_layout-col_opt = abap_on .
ls_layout-cwidth_opt = abap_on .
ls_layout-no_rowmark = abap_on .
ls_layout-no_toolbar = abap_on .
ls_layout-no_headers = abap_on .
ls_layout-no_hgridln = abap_on .
ls_layout-no_vgridln = abap_on .

ls_fieldcat-icon = abap_on .
ls_fieldcat-fieldname = 'ICON' .
APPEND ls_fieldcat TO lt_fieldcat .
CLEAR ls_fieldcat .
ls_fieldcat-fieldname = 'TITLE' .
ls_fieldcat-hotspot = abap_on .
APPEND ls_fieldcat TO lt_fieldcat .

r_grid->set_table_for_first_display(
EXPORTING i_default = abap_on
is_layout = ls_layout
CHANGING it_fieldcatalog = lt_fieldcat[]
it_outtab = t_outtab[]
EXCEPTIONS OTHERS = 4 ) .
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING process_terminamed .
ENDIF .
SET HANDLER hndl_grid_hotspot FOR r_grid .
ENDMETHOD . "constructor
METHOD free .
IF r_grid IS BOUND .
r_grid->free( ) .
FREE r_grid .
ENDIF .
ENDMETHOD . "free
METHOD set_selection .
DATA:
ls_rows TYPE lvc_s_row ,
lt_rows TYPE lvc_t_row .

READ TABLE t_outtab TRANSPORTING NO FIELDS


WITH KEY tabix = iv_tabix .

ls_rows-index = sy-tabix .
INSERT ls_rows INTO TABLE lt_rows .

r_grid->set_selected_rows( it_index_rows = lt_rows ) .


ENDMETHOD . "set_selection
METHOD hndl_grid_hotspot .
FIELD-SYMBOLS <outtab> TYPE ty_s_outtab .
READ TABLE t_outtab ASSIGNING <outtab> INDEX e_row_id-index .
CHECK sy-subrc EQ 0.

RAISE EVENT evnt_redraw EXPORTING ev_tabix = <outtab>-tabix .


ENDMETHOD . "hndl_grid_hotspot
ENDCLASS . "lcl_vr_navipanel IMPLEMENTATION

*----------------------------------------------------------------------*
* CLASS lcl_viewer DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_viewer DEFINITION INHERITING FROM lcl_root .

PUBLIC SECTION .
TYPES:
BEGIN OF ty_s_docbuffer ,
tabix TYPE sytabix ,
title TYPE sytitle ,
rawdata TYPE xstring ,
extension TYPE ty_char10 ,
callback_prog TYPE sycprog ,
callback_form TYPE sycprog ,
inplace TYPE flag ,
END OF ty_s_docbuffer ,
ty_t_docbuffer TYPE STANDARD TABLE OF ty_s_docbuffer .
DATA:
t_docbuffer TYPE ty_t_docbuffer ,
s_docbuffer TYPE ty_s_docbuffer ,
r_container TYPE REF TO cl_gui_container ,
r_excelole TYPE REF TO lcl_vr_ole ,
r_appltoolbar TYPE REF TO lcl_vr_appltoolbar ,
r_navipanel TYPE REF TO lcl_vr_navipanel ,
v_viewmode TYPE flag ,
v_initialized TYPE flag .
CONSTANTS:
BEGIN OF c_event ,
before_ole_initialization TYPE ty_char50 VALUE 'BEFORE_OLE_INITIALIZATION'
,
after_ole_initialization TYPE ty_char50 VALUE
'AFTER_OLE_INITIALIZATION' ,
function_code TYPE ty_char50 VALUE 'FUNCTION_CODE' ,
controls_init TYPE ty_char50 VALUE 'CONTROLS_INIT' ,
redraw TYPE ty_char50 VALUE 'REDRAW' ,
END OF c_event .

METHODS:
constructor
IMPORTING ir_container TYPE REF TO cl_gui_container
iv_viewmode TYPE flag
EXCEPTIONS process_terminated ,
free ,
document_add
IMPORTING iv_document_rawdata TYPE xstring
iv_document_extension TYPE any DEFAULT c_extension_xlsx
iv_document_title TYPE any OPTIONAL
iv_callback_prog TYPE any OPTIONAL
iv_callback_form TYPE any OPTIONAL
iv_inplace TYPE flag OPTIONAL ,
pbo ,
redraw
IMPORTING iv_tabix TYPE any ,
appl_sendmail ,
appl_saveas ,
appl_print ,
appl_next ,
appl_prev ,
appl_first ,
appl_last ,
init_appltoolbar ,
init_excelole ,
init_navipanel ,
call_floating ,
call_floating_form .

PRIVATE SECTION .
METHODS:
hndl_fcode_appl
FOR EVENT evnt_fcode OF lcl_vr_appltoolbar
IMPORTING ev_fcode ,
hndl_redraw
FOR EVENT evnt_redraw OF lcl_vr_navipanel
IMPORTING ev_tabix .

ENDCLASS . "lcl_viewer DEFINITION


*----------------------------------------------------------------------*
* CLASS lcl_viewer IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_viewer IMPLEMENTATION .
METHOD constructor .
super->constructor( ).

IF v_gui_available IS INITIAL .
MESSAGE e000(lp) WITH v_text-t125 " text: Process is flowing in OFF-line
mode
RAISING process_terminated .
ENDIF .

v_viewmode = iv_viewmode .
r_container = ir_container .
ENDMETHOD . "constructor
METHOD free .
IF r_excelole IS BOUND .
r_excelole->free( ) .
FREE r_excelole .
ENDIF .
IF r_appltoolbar IS BOUND .
r_appltoolbar->free( ) .
FREE r_appltoolbar .
ENDIF .
IF r_navipanel IS BOUND .
r_navipanel->free( ) .
FREE r_navipanel .
ENDIF .
ENDMETHOD . "free
METHOD document_add .
FIELD-SYMBOLS <docbuffer> TYPE ty_s_docbuffer .
APPEND INITIAL LINE TO t_docbuffer ASSIGNING <docbuffer> .
<docbuffer>-tabix = sy-tabix .
<docbuffer>-title = iv_document_title .
<docbuffer>-rawdata = iv_document_rawdata .
<docbuffer>-extension = iv_document_extension .
<docbuffer>-callback_prog = iv_callback_prog .
<docbuffer>-callback_form = iv_callback_form .
<docbuffer>-inplace = iv_inplace .

IF <docbuffer>-title IS INITIAL .
<docbuffer>-title = <docbuffer>-tabix .
CONCATENATE v_text-t017 " text: Form
<docbuffer>-title
INTO <docbuffer>-title SEPARATED BY space .
ENDIF .
ENDMETHOD . "document_add
METHOD pbo .
CHECK v_initialized IS INITIAL .
v_initialized = abap_on .

READ TABLE t_docbuffer INTO s_docbuffer INDEX 1 .


CHECK sy-subrc EQ 0 .

v_title = s_docbuffer-title .
init_appltoolbar( ) .
init_navipanel( ) .
init_excelole( ) .
IF r_navipanel IS BOUND .
r_navipanel->set_selection( 1 ) .
ENDIF .

IF s_docbuffer-callback_form IS NOT INITIAL


AND s_docbuffer-callback_prog IS NOT INITIAL .
PERFORM (s_docbuffer-callback_form)
IN PROGRAM (s_docbuffer-callback_prog) IF FOUND
USING c_event-controls_init
CHANGING sy-ucomm " TYPE ui_func
r_appltoolbar->r_toolbar " TYPE REF TO cl_gui_toolbar
s_docbuffer-rawdata . " TYPE xstring
ENDIF .

ENDMETHOD . "pbo
METHOD call_floating .
lcl_vr_ole=>temp_directory_set( ) .
IF lcl_vr_ole=>v_temp_directory IS INITIAL .
MESSAGE i000(lp) WITH v_text-t050 . " text: The working directory is not
determined
EXIT .
ENDIF .
lcl_vr_ole=>temp_directory_clear( ) .

LOOP AT t_docbuffer INTO s_docbuffer WHERE inplace IS INITIAL .


call_floating_form( ) .
DELETE t_docbuffer .
ENDLOOP .
ENDMETHOD . "call_floating
METHOD call_floating_form .
DATA:
lv_guid TYPE string ,
lv_temp_filename TYPE string ,
lv_document_size TYPE i ,
lt_document_table TYPE STANDARD TABLE OF w3mime .

lv_guid = guid_create( ) .

CONCATENATE lcl_vr_ole=>v_temp_directory
lcl_vr_ole=>v_file_separator
lv_guid
s_docbuffer-extension "lcl_vr_ole=>c_extension_xlsx
INTO lv_temp_filename .

CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'


EXPORTING
buffer = s_docbuffer-rawdata
IMPORTING
output_length = lv_document_size
TABLES
binary_tab = lt_document_table.

cl_gui_frontend_services=>gui_download(
EXPORTING bin_filesize = lv_document_size
filename = lv_temp_filename
filetype = 'BIN'
CHANGING data_tab = lt_document_table
EXCEPTIONS OTHERS = 24 ).
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
RETURN .
ENDIF .

cl_gui_frontend_services=>execute(
EXPORTING document = lv_temp_filename
EXCEPTIONS OTHERS = 1 ) .
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
RETURN .
ENDIF .
ENDMETHOD . "call_floating_form
METHOD redraw .
READ TABLE t_docbuffer INTO s_docbuffer INDEX iv_tabix .
CHECK sy-subrc EQ 0 .

IF s_docbuffer-callback_form IS NOT INITIAL


AND s_docbuffer-callback_prog IS NOT INITIAL .
PERFORM (s_docbuffer-callback_form)
IN PROGRAM (s_docbuffer-callback_prog) IF FOUND
USING c_event-redraw
CHANGING sy-ucomm " TYPE ui_func
r_appltoolbar->r_toolbar " TYPE REF TO cl_gui_toolbar
s_docbuffer-rawdata . " TYPE xstring
ENDIF .

IF r_navipanel IS BOUND .
r_navipanel->set_selection( iv_tabix ) .
ENDIF .

IF r_excelole IS BOUND .
r_excelole->free( ) .
FREE r_excelole .
ENDIF .
init_excelole( ) .

v_title = s_docbuffer-title .
CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE'
EXPORTING
functioncode = 'DUMMY'.

ENDMETHOD . "redraw
METHOD hndl_fcode_appl .
DATA lv_fcode TYPE ui_func .
lv_fcode = ev_fcode .

IF s_docbuffer-callback_form IS NOT INITIAL


AND s_docbuffer-callback_prog IS NOT INITIAL .
PERFORM (s_docbuffer-callback_form)
IN PROGRAM (s_docbuffer-callback_prog) IF FOUND
USING c_event-function_code
CHANGING lv_fcode " TYPE ui_func
r_appltoolbar->r_toolbar " TYPE REF TO cl_gui_toolbar
s_docbuffer-rawdata . " TYPE xstring
ENDIF .

CASE lv_fcode .
WHEN lcl_vr_appltoolbar=>c_fcode-appl_sendmail . appl_sendmail( ) .
WHEN lcl_vr_appltoolbar=>c_fcode-appl_saveas . appl_saveas( ) .
WHEN lcl_vr_appltoolbar=>c_fcode-appl_print . appl_print( ) .
WHEN lcl_vr_appltoolbar=>c_fcode-appl_next . appl_next( ) .
WHEN lcl_vr_appltoolbar=>c_fcode-appl_prev . appl_prev( ) .
WHEN lcl_vr_appltoolbar=>c_fcode-appl_first . appl_first( ) .
WHEN lcl_vr_appltoolbar=>c_fcode-appl_last . appl_last( ) .
ENDCASE .
ENDMETHOD . "hndl_fcode_appl
METHOD hndl_redraw .
redraw( iv_tabix = ev_tabix ) .
ENDMETHOD . "hndl_redraw
METHOD appl_sendmail .
DATA:
lv_attachment_size TYPE sood-objlen ,
lv_subject TYPE so_obj_des ,
lv_document_size TYPE i ,
lt_document_table TYPE solix_tab .
DATA:
lr_send_request TYPE REF TO cl_bcs ,
lr_mail_message TYPE REF TO cl_document_bcs ,
lv_attachment_type TYPE soodk-objtp VALUE 'XLSX' .

r_excelole->r_docproxy->save_document_to_table(
CHANGING
document_size = lv_document_size
document_table = lt_document_table ) .
TRY.
lr_send_request = cl_bcs=>create_persistent( ) .

lv_subject = v_title .
lr_mail_message = cl_document_bcs=>create_document(
i_type = 'RAW'
i_subject = lv_subject ) .

lv_attachment_size = lv_document_size .
lr_mail_message->add_attachment(
i_attachment_type = lv_attachment_type
i_attachment_subject = lv_subject
i_attachment_size = lv_attachment_size
i_att_content_hex = lt_document_table ) .

lr_send_request->set_document( lr_mail_message ) .
lr_send_request->edit( i_starting_at_x = 1
i_starting_at_y = 1 ) .
CATCH cx_bcs .
ENDTRY .
COMMIT WORK .
FREE: lr_mail_message , lr_send_request .
ENDMETHOD . "appl_sendmail
METHOD appl_saveas .
r_excelole->r_docproxy->save_as(
EXPORTING prompt_user = abap_on
no_flush = abap_off ) .
ENDMETHOD . "appl_saveas
METHOD appl_print .
r_excelole->r_docproxy->print_document(
EXPORTING prompt_user = abap_on
no_flush = abap_off ) .
ENDMETHOD . "appl_print
METHOD appl_next .
DATA lv_tabix_next TYPE sytabix .
lv_tabix_next = s_docbuffer-tabix + 1 .

IF lv_tabix_next LE LINES( t_docbuffer ) .


redraw( lv_tabix_next ) .
ELSE .
MESSAGE s000(lp) WITH v_text-t134 . " text: END of the list is reached
ENDIF .
ENDMETHOD . "appl_next
METHOD appl_prev .
DATA lv_tabix_prew TYPE sytabix .
lv_tabix_prew = s_docbuffer-tabix - 1 .

IF lv_tabix_prew GT 0 .
redraw( lv_tabix_prew ) .
ELSE .
MESSAGE s000(lp) WITH v_text-t135 . " text: TOP of the list is reached
ENDIF .
ENDMETHOD . "appl_prev
METHOD appl_first .
DATA lv_tabix_first TYPE sytabix VALUE 1 .
CHECK lv_tabix_first NE s_docbuffer-tabix .

redraw( lv_tabix_first ) .
ENDMETHOD . "appl_first
METHOD appl_last .
DATA lv_tabix_last TYPE sytabix .
lv_tabix_last = LINES( t_docbuffer ) .
CHECK lv_tabix_last NE s_docbuffer-tabix .

redraw( lv_tabix_last ) .
ENDMETHOD . "appl_last
METHOD init_appltoolbar .
DATA lv_navi_keys TYPE flag .

IF LINES( t_docbuffer ) GT 1 .
lv_navi_keys = abap_on .
ELSE .
lv_navi_keys = abap_off .
ENDIF .

CREATE OBJECT r_appltoolbar


EXPORTING
iv_navi_keys = lv_navi_keys
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .
SET HANDLER hndl_fcode_appl FOR r_appltoolbar .
ENDMETHOD . "init_appltoolbar
METHOD init_excelole .

IF s_docbuffer-callback_form IS NOT INITIAL


AND s_docbuffer-callback_prog IS NOT INITIAL .
PERFORM (s_docbuffer-callback_form)
IN PROGRAM (s_docbuffer-callback_prog) IF FOUND
USING c_event-before_ole_initialization
CHANGING sy-ucomm " TYPE ui_func
r_appltoolbar->r_toolbar " TYPE REF TO cl_gui_toolbar
s_docbuffer-rawdata . " TYPE xstring
ENDIF .

CREATE OBJECT r_excelole


EXPORTING
ir_container = r_container
iv_document_rawdata = s_docbuffer-rawdata
iv_viewmode = v_viewmode
EXCEPTIONS
OTHERS = 4.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .

IF s_docbuffer-callback_form IS NOT INITIAL


AND s_docbuffer-callback_prog IS NOT INITIAL .
PERFORM (s_docbuffer-callback_form)
IN PROGRAM (s_docbuffer-callback_prog) IF FOUND
USING c_event-after_ole_initialization
CHANGING sy-ucomm " TYPE ui_func
r_appltoolbar->r_toolbar " TYPE REF TO cl_gui_toolbar
s_docbuffer-rawdata . " TYPE xstring
ENDIF .

* SET HANDLER hndl_fcode_tmpl FOR r_excelole .

CALL FUNCTION 'FLUSH'


EXCEPTIONS
OTHERS = 0.
cl_gui_cfw=>dispatch( ) .
ENDMETHOD . "init_excelole
METHOD init_navipanel .
CHECK LINES( t_docbuffer ) GT 1 .

CREATE OBJECT r_navipanel


EXPORTING
it_table = t_docbuffer
EXCEPTIONS
OTHERS = 4.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
EXIT .
ENDIF .
SET HANDLER hndl_redraw FOR r_navipanel .
ENDMETHOD . "init_navipanel
ENDCLASS . "lcl_viewer IMPLEMENTATION

*&---------------------------------------------------------------------*
*& Form POPUP_CTXTFIELD_CB_GUI_STATUS
*&---------------------------------------------------------------------*
FORM popup_ctxtfield_cb_gui_status . "#EC CALLED
DATA lt_excl TYPE STANDARD TABLE OF fcode .
APPEND 'TRAD' TO lt_excl .
APPEND 'TRDL' TO lt_excl .
APPEND 'TRRN' TO lt_excl .
APPEND 'TRMV' TO lt_excl .
APPEND 'TRTO' TO lt_excl .
APPEND 'TRZM' TO lt_excl .

SET PF-STATUS 'LD_TREE'


OF PROGRAM 'SAPLSEUT'
EXCLUDING lt_excl .

ENDFORM . "POPUP_CTXTFIELD_CB_GUI_STATUS
*&---------------------------------------------------------------------*
*& Form POPUP_CTXTFIELD_UCOMM
*&---------------------------------------------------------------------*
FORM popup_ctxtfield_ucomm TABLES pt_nodetab "#EC CALLED
USING pv_uc TYPE any
CHANGING cv_exit TYPE flag
cv_list_refresh TYPE any .
DATA ls_nodetab TYPE seucomm .
MOVE-CORRESPONDING pt_nodetab TO ls_nodetab .

FIELD-SYMBOLS <workbench> TYPE REF TO lcl_workbench .


ASSIGN ('GR_WORKBENCH') TO <workbench> .

CHECK <workbench> IS ASSIGNED .


CHECK <workbench> IS BOUND .

<workbench>->popup_ctxtfield_callback(
EXPORTING is_nodetab = ls_nodetab
iv_uc = pv_uc
CHANGING cv_exit = cv_exit
cv_list_refresh = cv_list_refresh ) .

ENDFORM . "POPUP_CTXTFIELD_UCOMM
*&---------------------------------------------------------------------*
*& Form POPUP_CTXTMULTI_CB_GUI_STATUS
*&---------------------------------------------------------------------*
FORM popup_ctxtmulti_cb_gui_status. "#EC CALLED

SET PF-STATUS 'LD_ADD'


OF PROGRAM 'SAPLSEUT'.
ENDFORM. "POPUP_CTXTMULTI_CB_GUI_STATUS
*&---------------------------------------------------------------------*
*& Form POPUP_CTXTMULTI_UCOMM
*&---------------------------------------------------------------------*
FORM popup_ctxtmulti_ucomm TABLES pt_nodetab "#EC CALLED
USING pv_uc TYPE any
CHANGING cv_exit TYPE flag
cv_list_refresh TYPE any .
DATA ls_nodetab TYPE seucomm .
MOVE-CORRESPONDING pt_nodetab TO ls_nodetab .

FIELD-SYMBOLS <workbench> TYPE REF TO lcl_workbench .


ASSIGN ('GR_WORKBENCH') TO <workbench> .

CHECK <workbench> IS ASSIGNED .


CHECK <workbench> IS BOUND .

<workbench>->popup_ctxtmulti_callback(
EXPORTING is_nodetab = ls_nodetab
iv_uc = pv_uc
CHANGING cv_exit = cv_exit
cv_list_refresh = cv_list_refresh ) .

ENDFORM . "POPUP_CTXTMULTI_UCOMM
*&---------------------------------------------------------------------*
*& Form popup_context_ucomm
*&---------------------------------------------------------------------*
FORM popup_context_ucomm "#EC CALLED
TABLES pt_fields STRUCTURE sval
USING pv_code TYPE any
CHANGING cv_error STRUCTURE svale
cv_show_popup TYPE any .

ENDFORM . "popup_context_ucomm
*&---------------------------------------------------------------------*
*& Form popup_context_f4
*&---------------------------------------------------------------------*
FORM popup_context_f4 USING pv_tabname TYPE any "#EC CALLED
pv_fieldname TYPE any
pv_display TYPE any
CHANGING cv_returncode TYPE any
cv_value TYPE any .

DATA: lv_objname TYPE rsrd1-objname .

CALL FUNCTION 'RS_DD_F4_OBJECT'


EXPORTING
objname = lv_objname
objtype = 'Q'
suppress_selection = space
IMPORTING
selobjname = lv_objname.

cv_value = lv_objname .

ENDFORM . "popup_context_f4

You might also like