You are on page 1of 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