User Interface Elements (UI elements) Static and Dynamic Programming-part-3
RoadMap
By
using this UI element, we can display the steps required to complete a
certain task. Hereunder,we show some of the roadMap properties that can
be bound,and the attribute type in case the property is bindable.
For
the RoadMap example,we use the exercise from the
ViewContainerUIElement,a little bit re-arranged. The WD component
structure is presented.
WD component structure
In
this case,we replace the LinkToAction UI elements with two Buttons:
Next and Back. These Buttons are inserted into the view V_VIEW, and the
user can navigate from the first step to the end one, via the RoadMap.
In this case, we used only a ViewContainerUIElement,and for each step we
have a view. In the view V_VIEW, we insert a RoadMap UI element with
three steps. To insert a step into a RoadMap UI Element, we right-click
on the element and, from the contextual menu, we choose Insert Step.
V_VIEW view layout
T0
be able to manipulate the RoadMap UI element and the Button via the
data held in the context, we create, in the V_VIEW, a context node named
DYNAMIC. This node has three attributes:
- SELECTEDSTEP, of STRING type, used to dynamically set the ID of the selected step
- ENABLED_NEXT, of WDY_BOOLEAN type, used to manipulate the enabled property of the NEXT button
- ENABLED_BACK,of WDY_BOOLEAN type,used to manipulate the enabled property of the BACK button (Fig – right)
To
hold and show the data entered by the user, we have created, in the COM
PONENTCONTROLLER context, a node named INFO (Fig. – left).This context
node has the same structure as presented in the ViewContainerUIElement
example. The attributes are: NAME, EMAIL & CITY (of STRING type) and
COUNTRY (of Y_DEFORDOMAIN type). We create a context mapping among this
context node and the context views V_STEP1, V_STEP2 and V_STEP3.
Context structure
V_STEP1 view layout
V_STEP2 view layout
V_STEP3 view layout
The
view “V_VIEW” is the default view – the firstly displayed one.In the
ViewContainerUIElement,we embed all the three views V_STEP1,V_STEP2 and
V_STEP3. The view V_STEP1 is, in this case, the default view. To be able
to navigate among the views, we have to create inbound and outbound
plugs. In the view V_VIEW, we create three outbound plugs:
- OP_TO_V_STEP1 required to navigate to the view V_STEP1
- OP_TO_V_STEP2 required to navigate to the view V_STEP2
- OP_TO_V_STEP3 required to navigate to the view V_STEP3
The
view V_STEP1 has an inbound plug named IP_V_STEP1,the view V_STEP2 has
an inbound plug named IP_V_STEP2 and the view V_STEP3 has an inbound
plug named IP_V_STEP3.
Window structure
In the wdDoInit Hook method (V_VIEW),we dynamically set the attributes values for SELECTEDSTEP, ENABLED_NEXT and ENABLED_BACK.
The wdDoInit Hook method
METHOD wddoinit. DATA lr_node TYPE REF TO if_wd_context_node. DATA ls_data TYPE wd_this->element_dynamic. lr_node = wd_context-get_child_node('DYNAMIC'). ls_data-enabled_next = abap_true. ls_data-enabled_back = abap_false. ls_data-selectedstep ='STEP1'. lr_node->set_static_attributes(ls_data). ENDMETHOD.
First
time when the screen is rendered, we want the BACK Button to be not
enabled,the NEXT Button to be enabled, and the STEP1 to be the active
RoadMap step.
Runtime
When the user presses the NEXT button, the Framework triggers the event handler method onactionnext.
The onactionnext event handler method
METHOD onactionnext. DATA lr_node TYPE REF TO if_wd_context_node. DATA ls_data TYPE wd_this-element_dynamic. DATA lv_selectedstep TYPE string. lr_node = wd_context-get_child_node('DYNAMIC'). lr_node-get_attribute (EXPORTING name ='SELECTED STEP'IMPORTING value = lv_selectedstep ). ASE lv_selectedstep. WHEN ‘STEP1’. ls_data-selectedstep = ‘STEP2’. ls_data-enabled_next = abap_true. ls_data-enabled_back = abap_true. wd_this-fire_op_to_v_step2_plg( ). WHEN ‘STEP2’. ls_data-selectedstep = ‘STEP3’. ls_data-enabled_next = abap_false. ls_data-enabled_back = abap_true. wd_this-fire_op_to_v_step3_plg( ). WHEN OTHERS. ls_data-enabled_next = abap_false. ls_data-enabled_back = abap_true. ENDCASE. lr_node-set_static_attributes(ls_data). ENDMETHOD.
As
we can see, we make active the STEP2: ls_data-selectedstep = ‘STEP2’,we
fire the method that helps us to navigate to the nextview V_STEP2
wd_thisfire_op_to_v_step2_plg( )
and we enable both buttons
ls_data-enabled_next = abap_true.
ls_data-enabled_back = abap_true.
and we enable both buttons
ls_data-enabled_next = abap_true.
ls_data-enabled_back = abap_true.
Runtime
When
the user presses again the NEXT button,we deactivate the NEXT button
ls_data-enabled_next = abap_false we make active STEP3
ls_data-selectedstep = ‘STEP3’and fire the method that helps us to
navigate to the view V_STEP3 wd_this!fire_op_to_v_step3_plg( ),
Runtime
When the user presses the BACK button, the Framework triggers the event handler method onactionback.
The onactionback event handler method
METHOD onactionback. DATA lr_node TYPE REF TO if_wd_context_node. DATA ls_data TYPE wd_this-element_dynamic. DATA lv_selectedstep TYPE string. lr_node = wd_context-get_child_node(‘DYNAMIC’). lr_node-get_attribute ( EXPORTING name =‘SELECTEDSTEP’IMPORTING value = lv_selectedstep). CASE lv_selectedstep. WHEN ‘STEP3’. ls_data-selectedstep = ‘STEP2’. ls_data-enabled_next = abap_true. ls_data-enabled_back = abap_true. wd_this-fire_op_to_v_step2_plg( ). WHEN ‘STEP2’. ls_data-selectedstep = ‘STEP1’. ls_data-enabled_next = abap_true. ls_data-enabled_back = abap_false. wd_this->fire_op_to_v_step1_plg( ). WHEN OTHERS. ls_data-enabled_next = abap_true. ls_data-enabled_back = abap_false. NDCASE. r_node-set_static_attributes(ls_data ). ENDMETHOD.
As we can see(Fig.)when the user presses the BACK button,we navigate back to the view V_STEP2
wd_this!fire_op_to_v_step2_plg( ).
we activate both buttons ls_data-enabled_next = abap_true.
ls_data-enabled_back = abap_true.
we make active the step STEP2 ls_data-selectedstep = ‘STEP2’.
wd_this!fire_op_to_v_step2_plg( ).
we activate both buttons ls_data-enabled_next = abap_true.
ls_data-enabled_back = abap_true.
we make active the step STEP2 ls_data-selectedstep = ‘STEP2’.
wd_this!fire_op_to_v_step2_plg( ).
Runtime
When the user presses again the BACK Button (Fig.),we navigate back to the view V_STEP1
wd_this!fire_op_to_v_step1_plg( ).
we deactivate the BACK button ls_data-enabled_back = abap_false.
and make active the step STEP1 ls_data-selectedstep = ‘STEP1’.
we deactivate the BACK button ls_data-enabled_back = abap_false.
and make active the step STEP1 ls_data-selectedstep = ‘STEP1’.
Runtime
Dynamic Programming
RUNTIME CLASS: CL_WD_ROAD_MAP
Hereunder,we
present a table showing the correspondence between the view designer
name and the runtime name, with the proper types,in case of dynamic
programming of a RoadMap UI element.
Dynamic programming
For
the RoadMap UI element,we have, as aggregation, the Step: Road Map Step
or MultipleRoadMapStep.The RoadMapStep element represents a step in a
Road- Map,and has the CL_WD_ROAD_MAP_STEP runtime class.
The implementation of a dynamic RoadMap UI element with two Steps contains the following statements:
Dynamic programming of a RoadMap UI element
METHOD wddomodifyview. DATA lr_container TYPE REF TO cl_wd_uielement_container. DATA lr_roadmap TYPE REF TO cl_wd_road_map. DATA lr_step1 TYPE REF TO cl_wd_road_map_step. DATA lr_step2 TYPE REF TO cl_wd_road_map_step. DATA lr_flow_data TYPE REF TO cl_wd_flow_data. IF first_time EQ abap_true. lr_container ?= view->get_element('ROOTUIELEMENTCONTAINER'). lr_roadmap = cl_wd_road_map=>new_road_map( id = 'RM_ROADMAP' bind_selected_step ='DYNAMIC.SELECTEDSTEP' start_point_design = cl_wd_road_map=>e_start_point_design-selected ). lr_flow_data = cl_wd_flow_data=>new_flow_data(element = lr_roadmap). lr_container->add_child(lr_roadmap). lr_step1 = cl_wd_road_map_step=>new_road_map_step( id = 'STEP1' description ='STEP 1' name ='1' ). lr_roadmap->add_step(the_step = lr_step1). lr_step2 = cl_wd_road_map_step=>new_road_map_st id = 'STEP2' description ='STEP 2' name ='2' ). lr_roadmap->add_step(he_step = lr_step2). ENDIF. ENDMETHOD.
PhaseIndicator
Similar
to the Road Map UI element, we can display then the steps in a
wizard,by using the PhaseIndicator. Hereunder,we show some of the
PhaseIndicator properties that can be bound, and the attribute type in
case the property is bindable.
Some of the PhaseIndicator UI element properties
A
Phase is a step into a PhaseIndicator that has bindable properties
as,for example,enable and status. Table presents some of these
properties and how we can use the status property for a dynamic
manipulation.
Some of the phase properties and the dynamic manipulation of the status
We
create the same example as for the RoadMap, but,in this case,we use a
PhaseIndicator UI element with three phases.The WD component structure
is presented.
WD component structure
In
this case,we have renamed the views V_STEP1, V_STEP2 and V_STEP3 as
V_PHASE1,V_PHASE2 and V_PHASE3. The content of these views is the
same.We can rename a view by right-clicking on the view name and, from
the contextual menu,we choose rename. To insert a phase into a
PhaseIndicator UI Element, we right-clickon the element and,from the
contextual menu, we choose Insert Phase.
Inserting Phase into a PhaseIndicator
For
the first Phase,we have set the status property: completed. For the
other two Phases(Phase2 and Phase3),we have dynamically set the status
property,by using the two attributes named STATUS2 and STATUS3 of
WDUI_PHASE_STATUS type.To manipulate the enabled property of the NEXT
button, we use the same attribute ENABLED_NEXT of WDY_BOOLEAN type, and
to manipulate the selected phase, we use the attribute SELECTEDPHASE of
string type (Fig right).
The
node INFO is defined in the COMPONENTCONTROLLER and has the same
structure as showed in the previous example. We create context mapping
among this context node and the context views V_PHASE1,V_PHASE2 and
V_PHASE3.
Context structure
The V_VIEW layout
This
view has two outbound plugs defined: OP_TO_V_PHASE2 and
OP_TO_V_PHASE3.The view V_PHASE1 has no inbound plug, the view V_PHASE2
has an inbound plug named IP_V_PHASE2 and the view PHASE_3 has an
inbound plug named IP_V_PHASE3. The window structure is presented.
Window structure
The
view V_PHASE1 is shown in the ViewControllerUIElement first time when
the screen is rendered, this view being defined as default view.We have
to dynamically set the attributes values for
SELECTEDPHASE,STATS2,STATUS3 and ENABLED_NEXT. To do this, we use the
wdDoInit Hook method.
The wdDoInit Hook method
METHOD wddoinit. DATA lr_node TYPE REF TO if_wd_context_node. DATA ls_data TYPE if_v_view=element_dynamic. lr_node = wd_context-get_child_node('DYNAMIC'). ls_data-enabled_next = abap_true. ls_data-status2 = CL_WD_PHASE=E_STATUS-WARNING. ls_data-status3 = CL_WD_PHASE=E_STATUS-WARNING. ls_data-selectedphase = 'PHASE1'. lr_node-set_static_attributes(ls_data). ENDMETHOD.
As
we can see,we selected the first phase: ls_data-selectedphase =
‘PHASE1’and we set the Phase2 and Phase3 with the Warning status
ls_data-status2 = cl_wd_phase) e_status-warning.
ls_data-status3 = cl_wd_phase) e_status-warning.
ls_data-status3 = cl_wd_phase) e_status-warning.
Runtime
When the user presses the button, the Framework triggers the event handler method onactionnext.
The onactionnext event handler method
METHOD onactionnext. DATA lr_node TYPE REF TO if_wd_context_node. DATA ls_data TYPE if_v_view=element_dynamic. DATA lv_phase TYPE string. lr_node = wd_context->get_child_node('DYNAMIC'). lr_node-get_attribute (EXPORTING name ='SELECTEDPHASE'IMPORTING value = lv_phase). CASE lv_phase. WHEN 'PHASE1'. ls_data-selected phase ='PHASE2'. ls_data-enabled_next = abap_true. ls_data-status2 = cl_wd_phase=e_status-completed. ls_data-status3 = cl_wd_phase=e_status-warning. wd_this-fire_op_to_v_phase2_plg( ). WHEN 'PHASE2'. ls_data-selectedphase = 'PHASE3'. ls_data-enabled_next = abap_false. ls_data-status2 = cl_wd_phase=e_status-completed. ls_data-status3 = cl_wd_phase=e_status-completed. wd_this-fire_op_to_v_phase3_plg( ). WHEN OTHERS. ls_data-enabled_next = abap_false. ENDCASE. lr_node-set_static_attributes(ls_data). ENDMETHOD.
As
we can see, we make active the Phase2 ls_data-selectedphase ¼ ‘PHASE2’
we set the Phase2 with completed status and Phase3 with warning status
ls_data-status2 cl_wd_phase )
e_status-completed.ls_data-status3 = cl_wd_phase)e_status-warning.
e_status-completed.ls_data-status3 = cl_wd_phase)e_status-warning.
For the next press of the NEXT button,we set the Phase2 and Phase3 with completed status
ls_data-status2 cl_wd_phase)e_status-completed.
ls_data-status3 cl_wd_phase)e_status-completed.we make active the last Phase, ls_data-selectedphase = ‘PHASE3’.
ls_data-status3 cl_wd_phase)e_status-completed.we make active the last Phase, ls_data-selectedphase = ‘PHASE3’.
Runtime
Dynamic Programming
RUNTIME CLASS: CL_WD_PHASE_INDICATOR
Hereunder,we
present a table showing the correspondence between the view designer
name and the runtime name, with the proper types,in case of dynamic
programming of a PhaseIndicator UI element
Dynamic programming
For the PhaseIndicator UI element,we have,as aggregation, the Phase element. It has the CL_WD_PHASE runtime class.
The implementation of a dynamic PhaseIndicator UI element with two Phases contains the following statements:
The implementation of a dynamic PhaseIndicator UI element with two Phases contains the following statements:
Dynamic programming of a PhaseIndicator UI element
METHOD wddomodifyview. DATA lr_container TYPE REF TO cl_wd_uielement_container. DATA lr_flow_data TYPE REF TO cl_wd_flow_data. DATA lr_phaseindicator TYPE REF TO cl_wd_phase_indicator. DATA lr_phase1 TYPE REF TO cl_wd_phase. DATA lr_phase2 TYPE REF TO cl_wd_phase. IF first_time EQ abap_true. lr_container ?= view->get_element('ROOTUIELEMENTCONTAINER'). lr_phaseindicator = cl_wd_phase_indicator=>new_phase_indicator( id = 'PI_PHASEINDICATOR' bind_selected_phase ='DYNAMIC.SELECTEDPHASE' irst_visible_phase ='PHASE1' background_design = cl_wd_phase_indicator=> e_background_designtransparent ). lr_flow_data = cl_wd_flow_data=>new_flow_data(element = lr_phaseindicator). lr_container->add_child(lr_phaseindicator). lr_phase1 = cl_wd_phase=>new_phase( id ='PHASE1' description ='PHASE 1' status = cl_wd_phase=>e_status-completed ). lr_phaseindicator->add_phase(the_phase = lr_phase1). lr_phase2 = cl_wd_phase=>new_phase( ld ='PHASE2' description ='PHASE 2' bind_status ='DYNAMIC.STATUS2' ). lr_phaseindicator->add_phase(the_phase = lr_phase2). ENDIF. ENDMETHOD.
Tree - Sequential Implementation
With this UI element,we can visualise the hierarchy defined in the context. For this UI element,we can use:
- A sequential implementation with a non-recursive node in case the number of levels can be specified at design time
- A recursive implementation with a recursive node in case the number of levels is not known at design time
WD component
In
this case(sequential implementation,we don’t need a recursive node. A
context node TREE is created in the context node of the view controller.
It has the cardinality 1...1 and is Singleton.Under this context
node,we create another context node TREE_NODE with two attributes. Under
this context node,we create another context node TREE_LEAF with an
attribute.
Context structure
The
attributes STUDENTNAME, VALUE and STUDENTINFO are of STRING type.The
context node TREE_LEAF is not Singleton,because we need to create an
instance of this node for each element of the TREE_NODE context node.In
the STUDENTNAME attribute, we hold the name of each student; for each
student we have proper information held in the attribute STUDENTINFO. In
a Tree UI element, we can insert Node Types of type TreeItemType and
TreeNodeType,to specify which subnodes and which context attributes are
going to be displayed.
Inserting Node Type
View layout
Binding of the Context to the Tree elements
The context node TREE_NODE is populated via the supply function method.
TREE_NODE context node
METHOD supply_tree_node. DATA: ls_studentTYPE if_v_view =element_tree_node,lt_student LIKE TABLE OF ls_student. ls_student-studentname = 'Ionescu Ana Maria'. ls_student-value = 'A'. APPEND ls_student TO lt_student. ls_student-studentname = 'Marinescu Loredana'. ls_student-value = 'B'. APPEND ls_student TO lt_student. ls_student-studentname = 'Marton Luminita'. ls_student-value = 'C'. APPEND ls_student TO lt_student. node-bind_table(lt_student ). ENDMETHOD.
The values for the child node TREE_LEAF are set in the same way via a supply function method.
Populating the attributes of the TREE_LEAF context node
METHOD supply_tree_leaf. DATA: ls_studentTYPE if_v_view=> element_tree_leaf,lt_student LIKE TABLE OF ls_student. DATA: lv_value TYPE string. parent_element->get_attribute (EXPORTING name = 'VALUE'IMPORTING value = lv_value ). CASE lv_value. WHEN 'A'. ls_student-student info ='Article - YES'. APPEND ls_student TO lt_student. ls_student-studentinfo = 'Exam - 5'. APPEND ls_student TO lt_student. ls_student-studentinfo = 'Academic year -II'. APPEND ls_student TO lt_student. WHEN 'B'. ls_student-studentinfo ='Article - NO'. APPEND ls_student TO lt_student. ls_student-studentinfo ='Academic year -I'. APPEND ls_student TO lt_student. WHEN OTHERS. ls_student-studentinfo ='Article - YES'. APPEND ls_student TO lt_student. ls_student-studentinfo ='Exam - 3'. APPEND ls_student TO lt_student. ls_student-studentinfo ='Academic year -IV'. APPEND ls_student TO lt_student. ENDCASE. node-bind_table(lt_student). ENDMETHOD.
Runtime
Dynamic Programming
RUNTIME CLASS: CL_WD_TREE
Hereunder,we
present a table showing the correspondence between the view designer
name and the runtime name,with the proper types,in case of dynamic
programming of a Tree UI element.
Dynamic programming
For
the Tree UI element, we have, as aggregation, the Node Types:
TreeItem-Type and TreeNodeType. The TreeItemType element has the
CL_WD_TREE_ ITEM_TYPE runtime class and the TreeNodeType element has the
CL_WD_TREE_NODE_TYPE runtime class.
The
implementation of a dynamic Tree UI element with two node types (Tree-
NodeType and TreeItemType)contains the following statements:
Dynamic programming
METHOD wddomodifyview. DATA lr_container TYPE REF TO cl_wd_uielement_container. DATA lr_flow_data TYPE REF TO cl_wd_flow_data. DATA lr_tree TYPE REF TO cl_wd_tree. DATA lr_treenode TYPE REF TO cl_wd_tree_node_type. DATA lr_treeitem TYPE REF TO cl_wd_tree_item_type. IF first_time EQ abap_true. lr_container ?= view->get_element('ROOTUIELEMENTCONTAINER'). lr_tree = cl_wd_tree=>new_tree( id = 'TRE_SEQUENTIAL' bind_data_source = 'TREE' title = 'Student info' default_node_icon_source = '~Icon/CheckedOk' ). lr_flow_data = cl_wd_flow_data=>new_flow_data(element = lr_tree). lr_container->add_child(lr_tree). lr_treenode = cl_wd_tree_node_type=>new_tree_node_type( id ='TREE_NT' bind_data_source ='TREE.TREE_NODE' bind_text ='TREE.TREE_NODE.STUDENTNAME' ). lr_treeitem = cl_wd_tree_item_type=>new_tree_item_type( id ='TREE_IT' bind_data_source ='TREE.TREE_NODE.TREE_LEAF' bind_text ='TREE.TREE_NODE.TREE_LEAF.STUDENTINFO' ). lr_tree->add_node_type(index = 1 the_node_type = lr_treenode). lr_tree->add_node_type(index = 2 the_node_type = lr_treeitem). ENDIF. ENDMETHOD.
DateNavigator
This
UI element offers the possibilities to display and navigate in a
calendar and to enter dates, by choosing a year, a month,a day or a
range of dates,from the showed calendar.
Hereunder,we
present a table with some of the DataNavigator properties that can be
bound, and the attribute type in case the property is bindable.
Some of the DataNavigator UI element properties
We
create a WD Component named Y_UI_DATENAVIGATOR. In the context view,we
create three attributes: MONTH, WEEK and DAY of STRING type,and two
context nodes:
- LEGEND,Cardinality 0. . .n, supply function named SUPPLY_LEGEND,attributes:
CATEGORY of WDY_MD_DATE_MARKING_CATEGORY type and TEXT of STRING type - MARKING,Cardinality 0...n,supply function named SUPPLY_MARKING, attributes: CATEGORY of WDY_MD_DATE_MARKING_CATEGORY type and DATE of D type.
In
the view layout,we insert a DateNavigator UI element with a
DateNavigator- Legend and DateNavigatorMarking. By using the
DateNavigatorLegend element,we can add a legend for the DateNavigator,
and with the DateNavigator- Marking element,we can highlight entries of a
specific category within the Date- Navigator UI element.
Context view and DateNavigatorLegend, DateNavigatorMarking properties
The most important properties of the DateNavigatorLegend element are:
- “Category”,which allows us to create the legend categories (in format one,two,three and four).It shall be bound to a context attribute that stores these categories.
- “Text”, which stores the texts, describing each category.
- “DataSource”,which shall be bound to a context node,which stores the categories and the texts of the legend entries. The most important properties of the DateNavigatorMarking element are:
- “Category”,which shall be bound to a context attribute that stores the category of the highlighted data.
- “DataSource”,which shall be bound to a context node which stores the categories,data and tooltip of the highlighted data.
- “Tooltip” is not necessarily bindable. In our case,we have not created an attribute for the tooltip,because we don’t want to display a quick info text when the user passes the mouse pointer over the highlighted data of the Date- Navigator UI element.
- “Data” shall be bound to a context attribute that stores the date of the highlighted data.
View layout
The DateNavigator UI element has many properties and events. In our case,we have changed the properties:
In this way,we have chosen Sunday as the first day of the week in our calendar.
In this way,we show 3 months in our calendar.
We have chosen from the list the range option,because we want to offer the possibility to select the range of dates.
We have set the starting date of our calendar.
To
be able to show,in the TextView UI elements,the week,the day or the
month that the end-user selects in our calendar,we have used the
events:onDaySelect,on Month Select and on Week Select.
Events of the DataNavigator UI element
First of all,we have to populate our nodes with values. The Listing shows the SUPPLY_LEGEND supply function method.
The SUPPLY_LEGEND supply function method
METHOD supply_legend. DATA: ls_legend TYPE wd_this-element_legend,lt_legend LIKE TABLE OF ls_legend. ls_legend-category = cl_wd_date_nav_legend=e_category-one. ls_legend-text = 'Doors open day'. APPEND ls_legend TO lt_legend. ls_legend-category = cl_wd_date_nav_legend=>e_category-two. ls_legend-text = 'Operating teams trip'. APPEND ls_legend TO lt_legend. ls_legend-category = cl_wd_date_nav_legend=>e_category-three. ls_legend-text = 'Happy hour'. INSERT ls_legend INTO TABLE lt_legend. node-bind_table( lt_legend ). ENDMETHOD.
We
create three legend categories(one, two and three),with the
texts:“Doors open day” for the first category, “Operating teams trip”for
the second category and “Happy hour” for the third category.
The Listing shows the SUPPLY_MARKING supply function method required to populate with values the MARKING node.
The SUPPLY_MARKING supply function method
METHOD supply_legend. DATA: ls_legend TYPE wd_this-element_legend,lt_legend LIKE TABLE OF ls_legend. ls_legend-category = cl_wd_date_nav_legend=e_category-one. ls_legend-text = 'Doors open day'. APPEND ls_legend TO lt_legend. ls_legend-category = cl_wd_date_nav_legend=e_category-two. ls_legend-text = 'Operating teams trip'. APPEND ls_legend TO lt_legend. ls_legend-category = cl_wd_date_nav_legend=e_category-three. ls_legend-text = 'Happy hour'. INSERT ls_legend INTO TABLE lt_legend. node-bind_table( lt_legend ). ENDMETHOD.
In
this way we mark (highlight),for the first category,the day
11.08.2009,for the second category,the day 21.08.2009,and for the third
category,the day 24.08.2009. When the user selects a day in our
calendar,the Framework triggers the event handler method
onactionon_day_select.
The onactionon_day_select event handler method
As
import parameter, for our event handler method, we have the parameter
named DAY of D type that holds the selected day. We pass this value in
our DAY attribute created in the context view.
When the user selects a Week in our calendar, the Framework triggers the event handler method onactionon_week_select.
The onactionon_week_select event handler method
As
import parameter,for our event handler method,we have the parameters:
WEEK of I type that holds the selected week and YEAR of I type that
holds the corresponding year of the selected week. We pass these values
in our WEEK attribute created in the context view.
When
the user selects a Month in our calendar,the Framework triggers the
event handler method onactionon_month_select. The
onactionon_month_select event handler method. As import parameters,for
our event handler method,we have: MONTH of I type that holds the
selected month and YEAR of I type that holds the corresponding of the
selected month. We pass these values in our MONTH attribute created in
context view.
Runtime
Dynamic Programming
RUNTIME CLASS: CL_WD_DATE_NAVIGATOR
Hereunder,we
present a table showing the correspondence between the view designer
name and the runtime name, with the proper types,in case of dynamic
programming of a DateNavigation UI element.
Dynamic programming
The
implementation of a dynamic DateNavigator UI element with elements:
DateNavigatorLegent and DateNavigatorMarking, contains the following
statements:
Dynamic programming of a DataNavigator UI element
METHOD wddomodifyview. DATA lr_date_navigator TYPE REF TO cl_wd_date_navigator. DATA lr_flow_data TYPE REF TO cl_wd_flow_data. DATA lr_container TYPE REF TO cl_wd_uielement_container. DATA lr_datenav_legend TYPE REF TO cl_wd_date_nav_legend. DATA lr_datenav_marking TYPE REF TO cl_wd_date_nav_marking. IF first_time EQ abap_true. lr_container ?= view->get_element('ROOTUIELEMENTCONTAINER'). lr_date_navigator = cl_wd_date_navigator=>new_date_navigator( id ='DATENAVIGATOR' first_day_of_week = cl_wd_date_navigator=>e_first_day_of_week-sunday months_per_column = 1 months_per_row = 3 selection_mode = cl_wd_date_navigator=>e_selection_mode-range starts_with ='20090801' on_day_select ='ON_DAY_SELECT' on_month_select ='ON_MONTH_SELECT' on_week_select ='ON_WEEK_SELECT' ). lr_flow_data = cl_wd_flow_data=>new_flow_data(element = lr_date_navigator). lr_container->add_child(lr_date_navigator). lr_datenav_legend = cl_wd_date_nav_legend=>new_date_nav_legend( id ='DATENAVIGATORLEGEND' bind_category ='LEGEND.CATEGORY' bind_data_source ='LEGEND' bind_text ='LEGEND.TEXT' ). lr_date_navigator->set_legend(the_legend = lr_datenav_legend). lr_datenav_marking = cl_wd_date_nav_marking=>new_date_nav_marking( id = 'DATENAVIGATORMARKING' bind_category = MARKING.CATEGORY' bind_data_source ='MARKING' bind_date ='MARKING.DATE' ). lr_date_navigator->set_marking(the_marking=lr_datenav_marking) ENDIF. ENDMETHOD.
This
category contains complex UI elements as regards their structure and
content.Hereunder,we present some of the UI Elements included in this
category.
Table
By
using this UI element, we can display data arranged in rows and
columns.Table shows some of the Table properties that can be bound,and
the attribute type in case the property is bindable.
Some of the Table UI element properties
In
this exercise,we want to take data from an end user and to insert them
into a table UI element,after the latest record. To do this,we create a
WD component named Y_UI_TABLE that has a View named V_VIEW and a default
window.In the context view,we need two context nodes: a context node
required to hold the new record from the end user and a context node
required to hold all the records.
Context structure
The
context node REGISTRATION has the cardinality 1. . .1, Singleton.Its
attributes are: NAME of STRING type,DATE OF BIRTH of YDATEOFBIRTH
type,COUNTRY of Y_DEFORDOMAIN type and NO of I type. We use the
attributes of this context node to hold every new record.
The
context node TABLE has the cardinality 0...n,Singleton, selection
0...1, supply function SUPPLY_PERSON and initialization lead selection
is not automatically set. In this case,we want to manually set the lead
selection. The context node attributes have the same name and data type
as the context node REGISTRATION.We use the attributes of this context
node to hold all the registrations.
In
the next step,we have to create the view layout.To insert a Table into
our view layout,we can use two options: we can manually insert the table
or we can use the Web Dynpro Wizard. In the beginning, we explain the
first option. After inserting a Table UI element into our view,we have
to create a data binding.When a table is bound to a context node by
using a wizard,we don’tneed to individually create each table column. We
have only to select the context node and the Framework provides the
available attributes.In this way,the value of the property DataSource
(mandatory) of the Table UI element is bound to the context node TABLE.
Table UI element – Creating the binding
The
Cell Editors of the Table Column describe the UI element used to
display or edit the column content.As we can see,our columns are created
by using textView UI elements. Each attribute represents a column in
our table, and for each column we can choose an UI element. After this,
the standard property to be bound depends on the chosen UI element.For
example, for the TextView UI element, the property is text, and for the
DropDownByKey, the name of the property to be bound is selectedKey.
Cell Editor of Table Column – Name of Property to be bound
The
view layout is presented in Fig. For each attribute for which the bind
option is marked, the Framework generates a proper column. For example,
for the attribute “NO”,the Framework has generated the column
TBL_EXAMPLE_NO, for the attribute NAME, the Framework has generated the
column TBL_EXAPLE_NAME,etc.The Table UI element offers the possibility
to display as many rows as we need by using the property visibleRowCount
(in our case, five). In the default mode,the property displayEmptyRows
is set as ABAP_TRUE. In case we set this property as ABAP_FALSE, the
rows that are empty in our table will not be on screen anymore.
The
second option to insert a Table UI element into our View Layout is to
use the Web Dynpro Wizard (Fig). In this case,the Wizard generates the
Table UI element and we use the same procedure presented hereunder to
create the data binding. After the user enters the new values (Name,
Date of Birth and Country),we have to add these values at the end of the
other records, in the table UI element. To be able to do this, we need
an action. Fig Cell Editor of Table Column – Name of Property to be
bounding.
After
the user enters the new values (Name, Date of Birth and Country),we
have to add these values at the end of the other records,in the table UI
element. To be able to do this, we need an action.
View layout
Web Dynpro wizard to insert a Table UI element into the view layout
For
a table UI element, we can insert a Toolbar. We need a toolbar to be
able to insert a ToolBarButton in this area. We populate the node TABLE
with two values, via the supply function method.
The
local variable lv_counter is used to create the record ID. After the
node population, we use the SET_LEAD_SELECTION_INDEX method to set lead
selection via index. As we can see, the index is set with the value of
the lv_counter. In this way,it is selected the last value of the table.
Inserting a ToolBarButton
Supply function method
METHOD supply_person. DATA: ls_table TYPE wd_this-element_table, lt_table LIKE TABLE OF ls_table, lv_counter TYPE i VALUE 1. ls_table-no = lv_counter. ls_table-name = 'Antonia Maria Crist'. ls_table-dateofbirth = '19800305'. ls_table-country = 'DE'. lv_counter = lv_counter + 1. APPEND ls_table TO lt_table. ls_table-no = lv_counter. ls_table-name = 'Albu Alina'. ls_table-dateofbirth = '19800908'. ls_table-country = 'IT'. APPEND ls_table TO lt_table. node->bind_table(new_items=lt_table set_initial_elements = abap_true). node-set_lead_selection_index(index=lv_counter). ENDMETHOD.
As
we have mentioned above, if the “Initialization lead selection” for a
node is “YES”, it is always selected the first element of this node. In
this case, our context node has this property selected “NO”; we
influence the selected element by using the set_lead_selection_index.
To influence the lead selection, we have some methods, as following
- Set_lead_selectio
- Move_first
- Move_previous
- Move_
For
our TABLE context node, we have set the selection cardinality 0...1
meaning that maximum one row can be selected if the node elements are
displayed as a table.
When the user presses the “Add record” button,the Framework triggers the event handler method onactionadd.
Event handler method
METHOD onactionadd. DATA: lr_node TYPE REF TO if_wd_context_node, lr_node1 TYPE REF TO if_wd_context_node, lr_element TYPE REF TO if_wd_context_element, lv_counter TYPE i, lv_dateofbirth TYPE ydateofbirth, lv_country TYPE y_defordomain, lv_name TYPE string, ls_registration TYPE wd_this->element_registration. lr_node = wd_context->get_child_node('REGISTRATION'). lr_node->get_attribute(EXPORTING name ='DATEOFBIRTH' IMPORTING value = lv_dateofbirth). lr_node->get_attribute(EXPORTING name ='NAME' IMPORTING value = lv_name). lr_node->get_attribute(EXPORTING name ='COUNTRY' IMPORTING value = lv_country). lr_node1 = wd_context->get_child_node('TABLE'). lr_node1->get_attribute(EXPORTING name ='NO' IMPORTING value = lv_counter). lv_counter = lv_counter + 1. ls_registration-no = lv_counter. ls_registration-dateofbirth = lv_dateofbirth. ls_registration-name = lv_name. ls_registration-country = lv_country. lr_node->set_static_attributes(ls_registration). lr_element = lr_node->get_lead_selection( ). lr_element-> get_static_attributes( IMPORTING static_attributes = ls_registration ). lr_node1 = wd_context->get_child_node('TABLE'). lr_node1->bind_structure( EXPORTING new_item = ls_registration set_initial_elements = abap_false). lr_node1->set_lead_selection_index(index = lv_counter). ENDMETHOD.
We
pass the value of the attribute NO of the TABLE context node in the
local variable lv_counter. As we have mentioned above,we use this local
variable to create the record ID.After each new record,we increase this
value with 1.The user enters the values Name,Date of Birth and Country
and we create his corresponding ID.The runtime structure is presented.
Runtime
Additionally,we
can add a reset Button on the table toolbar. After the user adds the
records, he can reset the fields Name, Date of birth and Country, to be
able to add a new record. The “Reset” Toolbar Button,of the same
ToolBarButton type, has associated an action named RESET. The Listing
shows the onactionreset event handler method.
The onactionreset event handler method
METHOD onactionreset. DATA: lr_node TYPE REF TO if_wd_context_node, ls_registration TYPE wd_this-element_registration. lr_node = wd_context-get_child_node('REGISTRATION'). lr_node->bind_structure(EXPORTING new_item = ls_registration). ENDMETHOD.
Runtime
Dynamic Programming
RUNTIME CLASS: CL_WD_TABLE
Hereunder,we
present a table showing the correspondence between the view designer
name and the runtime name, with the proper types,in case of dynamic
programming of a Table UI element.
Dynamic programming
For
the Table UI element,we have, as aggregation, the Table Column,Group
Column, Header,Legend Popin, MasterColumn and Toolbar. The TableColumn
element represents a column of a table, and has the CL_WD_TABLE_COLUMN
runtime class. The table title is implemented by using a Caption element
and has the CL_WD_CAPTION runtime class.
The
implementation of a dynamic Table UI element with table header,design
alternating, three visible rows and a column, that has a TextView UI
element as cell editor,contains the following statements.
Dynamic programming of a Table UI element
METHOD wddomodifyview. DATA lr_table TYPE REF TO cl_wd_table. DATA lr_flow_data TYPE REF TO cl_wd_flow_data. DATA lr_container TYPE REF TO cl_wd_uielement_container. DATA lr_column_name TYPE REF TO cl_wd_table_column. DATA lr_text_view TYPE REF TO cl_wd_text_view. DATA lr_table_header TYPE REF TO cl_wd_caption. DATA lr_column_name_header TYPE REF TO cl_wd_caption. IF first_time EQ abap_true. lr_container ?= view->get_element('ROOTUIELEMENTCONTAINER'). lr_table = cl_wd_table=>new_table( id ='TBL_TABLE' bind_data_source ='TABLE' design = cl_wd_table=>e_design-alternating visible_row_count = 3 ). lr_flow_data = cl_wd_flow_data=>new_flow_data(element = lr_table ). lr_container->add_child(lr_table). lr_column_name = cl_wd_table_column=>new_table_column( id = 'TBL_EXAMPLE_NAME' ). lr_table_header ?= cl_wd_caption=>new_caption(text ='Table UI elem ent - example'). lr_table->add_column(the_column = lr_column_name). lr_table->set_header(lr_table_header). lr_text_view = cl_wd_text_view=>new_text_view( id ='TXV_NAME' bind_text ='TABLE.NAME' ). lr_column_name_header ?= cl_wd_caption=>new_caption(text = 'Nam e'). lr_column_name-> set_table_cell_editor(the_table_cell_editor = lr_text_view ). lr_column_name->set_header(lr_column_name_header). ENDIF. ENDMETHOD.
RoadMap
By
using this UI element, we can display the steps required to complete a
certain task. Hereunder,we show some of the roadMap properties that can
be bound,and the attribute type in case the property is bindable.
Some of the Table UI element properties
For
the RoadMap example,we use the exercise from the
ViewContainerUIElement,a little bit re-arranged. The WD component
structure is presented.
WD component structure
In
this case,we replace the LinkToAction UI elements with two Buttons:
Next and Back. These Buttons are inserted into the view V_VIEW, and the
user can navigate from the first step to the end one, via the RoadMap.
In this case, we used only a View ContainerUIElement,and for each step
we have a view. In the view V_VIEW, we insert a RoadMap UI element with
three steps. To insert a step into a RoadMap UI Element, we right-click
on the element and, from the contextual menu, we choose Insert Step.
RoadMap steps
V_VIEW view layout
T0
be able to manipulate the RoadMap UI element and the Button via the
data held in the context, we create, in the V_VIEW, a context node named
DYNAMIC. This node has three attributes:
- SELECTEDSTEP, of STRING type, used to dynamically set the ID of the selected step
- ENABLED_NEXT, of WDY_BOOLEAN type, used to manipulate the enabled property of the NEXT button
- ENABLED_BACK,of WDY_BOOLEAN type,used to manipulate the enabled property of the BACK button (Fig – right)
To
hold and show the data entered by the user, we have created, in the COM
PONENTCONTROLLER context, a node named INFO (Fig. – left).This context
node has the same structure as presented in the ViewContainerUIElement
example. The attributes are: NAME, EMAIL & CITY (of STRING type) and
COUNTRY (of Y_DEFORDOMAIN type). We create a context mapping among this
context node and the context views V_STEP1, V_STEP2 and V_STEP3.
Context structure
V_STEP1 view layout
V_STEP2 view layout
V_STEP3 view layout
The
view “V_VIEW” is the default view – the firstly displayed one.In the
ViewContainerUIElement,we embed all the three views V_STEP1,V_STEP2 and
V_STEP3. The view V_STEP1 is, in this case, the default view.
To
be able to navigate among the views, we have to create inbound and
outbound plugs. In the view V_VIEW, we create three outbound plugs:
- OP_TO_V_STEP1 required to navigate to the view V_STEP1
- OP_TO_V_STEP2 required to navigate to the view V_STEP2
- OP_TO_V_STEP3 required to navigate to the view V_STEP3
The
view V_STEP1 has an inbound plug named IP_V_STEP1,the view V_STEP2 has
an inbound plug named IP_V_STEP2 and the view V_STEP3 has an inbound
plug named IP_V_STEP3.
Window structure
In the wdDoInit Hook method (V_VIEW),we dynamically set the attributes values for SELECTEDSTEP, ENABLED_NEXT and ENABLED_BACK.
The wdDoInit Hook method
METHOD wddoinit. DATA lr_node TYPE REF TO if_wd_context_node. DATA ls_data TYPE wd_this->element_dynamic. lr_node = wd_context-get_child_node('DYNAMIC'). ls_data-enabled_next = abap_true. ls_data-enabled_back = abap_false. ls_data-selectedstep ='STEP1'. lr_node->set_static_attributes(ls_data). ENDMETHOD.
First
time when the screen is rendered, we want the BACK Button to be not
enabled,the NEXT Button to be enabled, and the STEP1 to be the active
RoadMap step.
Runtime
When the user presses the NEXT button, the Framework triggers the event handler method onactionnext.
The onactionnext event handler method
METHOD onactionnext. DATA lr_node TYPE REF TO if_wd_context_node. DATA ls_data TYPE wd_this-element_dynamic. DATA lv_selectedstep TYPE string. lr_node = wd_context-get_child_node('DYNAMIC'). lr_node-get_attribute(EXPORTING name = 'SELECTED STEP'IMPORTING value = lv_selectedstep ). ASE lv_selectedstep. WHEN ‘STEP1’. ls_data-selectedstep = ‘STEP2’. ls_data-enabled_next = abap_true. ls_data-enabled_back = abap_true. wd_this-fire_op_to_v_step2_plg( ). WHEN ‘STEP2’. ls_data-selectedstep = ‘STEP3’. ls_data-enabled_next = abap_false. ls_data-enabled_back = abap_true. wd_this-fire_op_to_v_step3_plg( ). WHEN OTHERS. ls_data-enabled_next = abap_false. ls_data-enabled_back = abap_true. ENDCASE. lr_node-set_static_attributes(ls_data). ENDMETHOD.
As
we can see, we make active the STEP2: ls_data-selectedstep = ‘STEP2’,we
fire the method that helps us to navigate to the nextview V_STEP2
wd_thisfire_op_to_v_step2_plg( )
and we enable both buttons
ls_data-enabled_next = abap_true.
ls_data-enabled_back = abap_true.
and we enable both buttons
ls_data-enabled_next = abap_true.
ls_data-enabled_back = abap_true.
Runtime
When
the user presses again the NEXT button,we deactivate the NEXT button
ls_data-enabled_next = abap_false we make active STEP3
ls_data-selectedstep = ‘STEP3’and fire the method that helps us to
navigate to the view V_STEP3 wd_this!fire_op_to_v_step3_plg( ),
Runtime
When the user presses the BACK button, the Framework triggers the event handler method onactionback.
The onactionback event handler method
METHOD onactionback. DATA lr_node TYPE REF TO if_wd_context_node. DATA ls_data TYPE wd_this-element_dynamic. DATA lv_selectedstep TYPE string. lr_node = wd_context-get_child_node(‘DYNAMIC’). lr_node-get_attribute( EXPORTING name = ‘SELECTEDSTEP’IMPORTING value = lv_selectedstep). CASE lv_selectedstep. WHEN ‘STEP3’. ls_data-selectedstep = ‘STEP2’. ls_data-enabled_next = abap_true. ls_data-enabled_back = abap_true. wd_this-fire_op_to_v_step2_plg( ). WHEN ‘STEP2’. ls_data-selectedstep = ‘STEP1’. ls_data-enabled_next = abap_true. ls_data-enabled_back = abap_false. wd_this->fire_op_to_v_step1_plg( ). WHEN OTHERS. ls_data-enabled_next = abap_true. ls_data-enabled_back = abap_false. NDCASE. r_node-set_static_attributes(ls_data ). ENDMETHOD.
As we can see(Fig.)when the user presses the BACK button,we navigate back to the view V_STEP2
wd_this!fire_op_to_v_step2_plg( ).
we activate both buttons ls_data-enabled_next = abap_true.
ls_data-enabled_back = abap_true.
we make active the step STEP2 ls_data-selectedstep = ‘STEP2’.
wd_this!fire_op_to_v_step2_plg( ).
we activate both buttons ls_data-enabled_next = abap_true.
ls_data-enabled_back = abap_true.
we make active the step STEP2 ls_data-selectedstep = ‘STEP2’.
wd_this!fire_op_to_v_step2_plg( ).
Runtime
When the user presses again the BACK Button (Fig.),we navigate back to the view V_STEP1
wd_this!fire_op_to_v_step1_plg( ).
we deactivate the BACK button ls_data-enabled_back = abap_false.
and make active the step STEP1 ls_data-selectedstep = ‘STEP1’.
we deactivate the BACK button ls_data-enabled_back = abap_false.
and make active the step STEP1 ls_data-selectedstep = ‘STEP1’.
Runtime
Dynamic Programming
RUNTIME CLASS: CL_WD_ROAD_MAP
Hereunder,we
present a table showing the correspondence between the view designer
name and the runtime name, with the proper types,in case of dynamic
programming of a RoadMap UI element.
Dynamic programming
For
the RoadMap UI element,we have, as aggregation, the Step: Road Map Step
or MultipleRoadMapStep.The RoadMapStep element represents a step in a
Road- Map,and has the CL_WD_ROAD_MAP_STEP runtime class.
The implementation of a dynamic RoadMap UI element with two Steps contains the following statements:
Dynamic programming of a RoadMap UI element
METHOD wddomodifyview. DATA lr_container TYPE REF TO cl_wd_uielement_container. DATA lr_roadmap TYPE REF TO cl_wd_road_map. DATA lr_step1 TYPE REF TO cl_wd_road_map_step. DATA lr_step2 TYPE REF TO cl_wd_road_map_step. DATA lr_flow_data TYPE REF TO cl_wd_flow_data. IF first_time EQ abap_true. lr_container ?= view->get_element('ROOTUIELEMENTCONTAINER'). lr_roadmap = cl_wd_road_map=>new_road_map( id = 'RM_ROADMAP' bind_selected_step ='DYNAMIC.SELECTEDSTEP' start_point_design = cl_wd_road_map=>e_start_point_design-selected ). lr_flow_data = cl_wd_flow_data=>new_flow_data(element = lr_roadmap). lr_container->add_child(lr_roadmap). lr_step1 = cl_wd_road_map_step=>new_road_map_step( id = 'STEP1' description ='STEP 1' name ='1' ). lr_roadmap->add_step(the_step = lr_step1). lr_step2 = cl_wd_road_map_step=>new_road_map_st id = 'STEP2' description ='STEP 2' name ='2' ). lr_roadmap->add_step(he_step = lr_step2). ENDIF. ENDMETHOD.
PhaseIndicator
Similar
to the Road Map UI element, we can display then the steps in a
wizard,by using the PhaseIndicator. Hereunder,we show some of the
PhaseIndicator properties that can be bound, and the attribute type in
case the property is bindable.
Some of the PhaseIndicator UI element properties
A
Phase is a step into a PhaseIndicator that has bindable properties
as,for example,enable and status. Table presents some of these
properties and how we can use the status property for a dynamic
manipulation.
Some of the phase properties and the dynamic manipulation of the status
We
create the same example as for the RoadMap, but,in this case,we use a
PhaseIndicator UI element with three phases.The WD component structure
is presented.
WD component structure
In
this case,we have renamed the views V_STEP1, V_STEP2 and V_STEP3 as
V_PHASE1,V_PHASE2 and V_PHASE3. The content of these views is the
same.We can rename a view by right-clicking on the view name and, from
the contextual menu,we choose rename. To insert a phase into a
PhaseIndicator UI Element, we right-clickon the element and,from the
contextual menu, we choose Insert Phase.
Inserting Phase into a PhaseIndicator
For
the first Phase,we have set the status property: completed. For the
other two Phases(Phase2 and Phase3),we have dynamically set the status
property,by using the two attributes named STATUS2 and STATUS3 of
WDUI_PHASE_STATUS type.To manipulate the enabled property of the NEXT
button, we use the same attribute ENABLED_NEXT of WDY_BOOLEAN type, and
to manipulate the selected phase, we use the attribute SELECTEDPHASE of
string type (Fig right).
The
node INFO is defined in the COMPONENTCONTROLLER and has the same
structure as showed in the previous example. We create context mapping
among this context node and the context views V_PHASE1,V_PHASE2 and
V_PHASE3.
Context structure
The V_VIEW layout
This
view has two outbound plugs defined: OP_TO_V_PHASE2 and
OP_TO_V_PHASE3.The view V_PHASE1 has no inbound plug, the view V_PHASE2
has an inbound plug named IP_V_PHASE2 and the view PHASE_3 has an
inbound plug named IP_V_PHASE3. The window structure is presented.
Window structure
The
view V_PHASE1 is shown in the ViewControllerUIElement first time when
the screen is rendered, this view being defined as default view.We have
to dynamically set the attributes values for
SELECTEDPHASE,STATS2,STATUS3 and ENABLED_NEXT. To do this, we use the
wdDoInit Hook method.
The wdDoInit Hook method
METHOD wddoinit. DATA lr_node TYPE REF TO if_wd_context_node. DATA ls_data TYPE if_v_view=element_dynamic. lr_node = wd_context-get_child_node('DYNAMIC'). ls_data-enabled_next = abap_true. ls_data-status2 = CL_WD_PHASE=E_STATUS-WARNING. ls_data-status3 = CL_WD_PHASE=E_STATUS-WARNING. ls_data-selectedphase = 'PHASE1'. lr_node-set_static_attributes(ls_data). ENDMETHOD.
As
we can see,we selected the first phase: ls_data-selectedphase =
‘PHASE1’and we set the Phase2 and Phase3 with the Warning status
ls_data-status2 = cl_wd_phase) e_status-warning. ls_data-status3 =
cl_wd_phase) e_status-warning.
Runtime
When the user presses the button, the Framework triggers the event handler method onactionnext (Listing).
The onactionnext event handler method
METHOD onactionnext. DATA lr_node TYPE REF TO if_wd_context_node. DATA ls_data TYPE if_v_view=element_dynamic. DATA lv_phase TYPE string. lr_node = wd_context->get_child_node('DYNAMIC'). lr_node-get_attribute (EXPORTING name ='SELECTEDPHASE'IMPORTING value = lv_phase). CASE lv_phase. WHEN 'PHASE1'. ls_data-selected phase ='PHASE2'. ls_data-enabled_next = abap_true. ls_data-status2 = cl_wd_phase=e_status-completed. ls_data-status3 = cl_wd_phase=e_status-warning. wd_this-fire_op_to_v_phase2_plg( ). WHEN 'PHASE2'. ls_data-selectedphase = 'PHASE3'. ls_data-enabled_next = abap_false. ls_data-status2 = cl_wd_phase=e_status-completed. ls_data-status3 = cl_wd_phase=e_status-completed. wd_this-fire_op_to_v_phase3_plg( ). WHEN OTHERS. ls_data-enabled_next = abap_false. ENDCASE. lr_node-set_static_attributes(ls_data). ENDMETHOD.
As
we can see, we make active the Phase2 ls_data-selectedphase ¼ ‘PHASE2’
we set the Phase2 with completed status and Phase3 with warning status
ls_data-status2 cl_wd_phase )
e_status-completed.ls_data-status3 = cl_wd_phase)e_status-warning.
e_status-completed.ls_data-status3 = cl_wd_phase)e_status-warning.
For the next press of the NEXT button,we set the Phase2 and Phase3 with completed status
ls_data-status2 cl_wd_phase)e_status-completed.
ls_data-status3 cl_wd_phase)e_status-completed.we make active the last Phase, ls_data-selectedphase = ‘PHASE3’.
ls_data-status3 cl_wd_phase)e_status-completed.we make active the last Phase, ls_data-selectedphase = ‘PHASE3’.
Runtime
Dynamic Programming
RUNTIME CLASS: CL_WD_PHASE_INDICATOR
Hereunder,we
present a table showing the correspondence between the view designer
name and the runtime name, with the proper types,in case of dynamic
programming of a PhaseIndicator UI element
Dynamic programming
For the PhaseIndicator UI element,we have,as aggregation, the Phase element. It has the CL_WD_PHASE runtime class.
The implementation of a dynamic PhaseIndicator UI element with two Phases contains the following statements (Listing ):
The implementation of a dynamic PhaseIndicator UI element with two Phases contains the following statements (Listing ):
Dynamic programming of a PhaseIndicator UI element
METHOD wddomodifyview. DATA lr_container TYPE REF TO cl_wd_uielement_container. DATA lr_flow_data TYPE REF TO cl_wd_flow_data. DATA lr_phaseindicator TYPE REF TO cl_wd_phase_indicator. DATA lr_phase1 TYPE REF TO cl_wd_phase. DATA lr_phase2 TYPE REF TO cl_wd_phase. IF first_time EQ abap_true. lr_container ?= view->get_element('ROOTUIELEMENTCONTAINER'). lr_phaseindicator = cl_wd_phase_indicator=>new_phase_indicator( id = 'PI_PHASEINDICATOR' bind_selected_phase ='DYNAMIC.SELECTEDPHASE' irst_visible_phase ='PHASE1' background_design = cl_wd_phase_indicator=>e_background_designtransparent ). lr_flow_data = cl_wd_flow_data=>new_flow_data(element = lr_phaseindicator). lr_container->add_child(lr_phaseindicator). lr_phase1 = cl_wd_phase=>new_phase( id ='PHASE1' description ='PHASE 1' status = cl_wd_phase=>e_status-completed ). lr_phaseindicator->add_phase(the_phase = lr_phase1). lr_phase2 = cl_wd_phase=>new_phase( ld ='PHASE2' description ='PHASE 2' bind_status ='DYNAMIC.STATUS2' ). lr_phaseindicator->add_phase(the_phase = lr_phase2). ENDIF. ENDMETHOD.
Tree - Sequential Implementation
With this UI element,we can visualise the hierarchy defined in the context. For this UI element,we can use:
- A sequential implementation with a non-recursive node in case the number of levels can be specified at design time
- A recursive implementation with a recursive node in case the number of levels is not known at design time
WD component
In
this case(sequential implementation,we don’t need a recursive node. A
context node TREE is created in the context node of the view controller.
It has the cardinality 1...1 and is Singleton.Under this context
node,we create another context node TREE_NODE with two attributes. Under
this context node,we create another context node TREE_LEAF with an
attribute (Fig.)
Context structure
The
attributes STUDENTNAME, VALUE and STUDENTINFO are of STRING type.The
context node TREE_LEAF is not Singleton,because we need to create an
instance of this node for each element of the TREE_NODE context node.In
the STUDENTNAME attribute, we hold the name of each student; for each
student we have proper information held in the attribute STUDENTINFO. In
a Tree UI element, we can insert Node Types of type TreeItemType and
TreeNodeType,to specify which subnodes and which context attributes are
going to be displayed.
Inserting Node Type
View layout
Binding of the Context to the Tree elements
The context node TREE_NODE is populated via the supply function method.
TREE_NODE context node
METHOD supply_tree_node. DATA: ls_studentTYPE if_v_view=element_tree_node,lt_student LIKE TABLE OF ls_student. ls_student-studentname = 'Ionescu Ana Maria'. ls_student-value = 'A'. APPEND ls_student TO lt_student. ls_student-studentname = 'Marinescu Loredana'. ls_student-value = 'B'. APPEND ls_student TO lt_student. ls_student-studentname = 'Marton Luminita'. ls_student-value = 'C'. APPEND ls_student TO lt_student. node-bind_table(lt_student ). ENDMETHOD.
The values for the child node TREE_LEAF are set in the same way via a supply function method.
Populating the attributes of the TREE_LEAF context node
METHOD supply_tree_leaf. DATA: ls_studentTYPE if_v_view=> element_tree_leaf,lt_student LIKE TABLE OF ls_student. DATA: lv_value TYPE string. parent_element->get_attribute (EXPORTING name = 'VALUE'IMPORTING value = lv_value ). CASE lv_value. WHEN 'A'. ls_student-student info ='Article - YES'. APPEND ls_student TO lt_student. ls_student-studentinfo = 'Exam - 5'. APPEND ls_student TO lt_student. ls_student-studentinfo = 'Academic year -II'. APPEND ls_student TO lt_student. WHEN 'B'. ls_student-studentinfo ='Article - NO'. APPEND ls_student TO lt_student. ls_student-studentinfo ='Academic year -I'. APPEND ls_student TO lt_student. WHEN OTHERS. ls_student-studentinfo ='Article - YES'. APPEND ls_student TO lt_student. ls_student-studentinfo ='Exam - 3'. APPEND ls_student TO lt_student. ls_student-studentinfo ='Academic year -IV'. APPEND ls_student TO lt_student. ENDCASE. node-bind_table(lt_student). ENDMETHOD.
Runtime
Dynamic Programming
RUNTIME CLASS: CL_WD_TREE
Hereunder,we
present a table showing the correspondence between the view designer
name and the runtime name,with the proper types,in case of dynamic
programming of a Tree UI element.
Dynamic programming
For
the Tree UI element, we have, as aggregation, the Node Types:
TreeItem-Type and TreeNodeType. The TreeItemType element has the
CL_WD_TREE_ ITEM_TYPE runtime class and the TreeNodeType element has the
CL_WD_TREE_NODE_TYPE runtime class.
The
implementation of a dynamic Tree UI element with two node types (Tree-
NodeType and TreeItemType)contains the following statements:
Dynamic programming
METHOD wddomodifyview. DATA lr_container TYPE REF TO cl_wd_uielement_container. DATA lr_flow_data TYPE REF TO cl_wd_flow_data. DATA lr_tree TYPE REF TO cl_wd_tree. DATA lr_treenode TYPE REF TO cl_wd_tree_node_type. DATA lr_treeitem TYPE REF TO cl_wd_tree_item_type. IF first_time EQ abap_true. lr_container ?= view->get_element('ROOTUIELEMENTCONTAINER'). lr_tree = cl_wd_tree=>new_tree( id = 'TRE_SEQUENTIAL' bind_data_source = 'TREE' title = 'Student info' default_node_icon_source = '~Icon/CheckedOk' ). lr_flow_data = cl_wd_flow_data=>new_flow_data(element = lr_tree). lr_container->add_child(lr_tree). lr_treenode = cl_wd_tree_node_type=>new_tree_node_type( id ='TREE_NT' bind_data_source ='TREE.TREE_NODE' bind_text ='TREE.TREE_NODE.STUDENTNAME' ). lr_treeitem = cl_wd_tree_item_type=>new_tree_item_type( id ='TREE_IT' bind_data_source ='TREE.TREE_NODE.TREE_LEAF' bind_text ='TREE.TREE_NODE.TREE_LEAF.STUDENTINFO' ). lr_tree->add_node_type(index = 1 the_node_type = lr_treenode). lr_tree->add_node_type(index = 2 the_node_type = lr_treeitem). ENDIF. ENDMETHOD.
DateNavigator
This
UI element offers the possibilities to display and navigate in a
calendar and to enter dates, by choosing a year, a month,a day or a
range of dates,from the showed calendar.
Hereunder,we
present a table with some of the DataNavigator properties that can be
bound, and the attribute type in case the property is bindable.
Some of the DataNavigator UI element properties
We
create a WD Component named Y_UI_DATENAVIGATOR. In the context view,we
create three attributes: MONTH, WEEK and DAY of STRING type,and two
context nodes:
- LEGEND,Cardinality 0. . .n,
supply function named SUPPLY_LEGEND,attributes:
CATEGORY of WDY_MD_DATE_MARKING_CATEGORY type and TEXT of STRING type - MARKING,Cardinality 0...n,supply function named SUPPLY_MARKING, attributes: CATEGORY of WDY_MD_DATE_MARKING_CATEGORY type and DATE of D type.
In
the view layout,we insert a DateNavigator UI element with a
DateNavigator- Legend and DateNavigatorMarking. By using the
DateNavigatorLegend element,we can add a legend for the DateNavigator,
and with the DateNavigator- Marking element,we can highlight entries of a
specific category within the Date- Navigator UI element.
Context view and DateNavigatorLegend, DateNavigatorMarking properties
The most important properties of the DateNavigatorLegend element are:
- “Category”,which allows us to create the legend categories (in format one,two,three and four).It shall be bound to a context attribute that stores these categories.
- “Text”, which stores the texts, describing each category.
- “DataSource”,which shall be bound to a context node,which stores the categories and the texts of the legend entries. The most important properties of the DateNavigatorMarking element are:
- “Category”,which shall be bound to a context attribute that stores the category of the highlighted data.
- “DataSource”,which shall be bound to a context node which stores the categories,data and tooltip of the highlighted data.
- “Tooltip” is not necessarily bindable. In our case,we have not created an attribute for the tooltip,because we don’t want to display a quick info text when the user passes the mouse pointer over the highlighted data of the Date- Navigator UI element.
- “Data” shall be bound to a context attribute that stores the date of the highlighted data.
View layout
The DateNavigator UI element has many properties and events. In our case,we have changed the properties:
In this way,we have chosen Sunday as the first day of the week in our calendar.
In this way,we show 3 months in our calendar.
We have chosen from the list the range option,because we want to offer the possibility to select the range of dates.
We
have set the starting date of our calendar. To be able to show,in the
TextView UI elements,the week,the day or the month that the end-user
selects in our calendar,we have used the events:onDaySelect,on Month
Select and on Week Select.
Events of the DataNavigator UI element
First of all,we have to populate our nodes with values. The Listing shows the SUPPLY_LEGEND supply function method.
The SUPPLY_LEGEND supply function method
METHOD supply_legend. DATA: ls_legend TYPE wd_this-element_legend,lt_legend LIKE TABLE OF ls_legend. ls_legend-category = cl_wd_date_nav_legend=e_category-one. ls_legend-text = 'Doors open day'. APPEND ls_legend TO lt_legend. ls_legend-category = cl_wd_date_nav_legend=>e_category-two. ls_legend-text = 'Operating teams trip'. APPEND ls_legend TO lt_legend. ls_legend-category = cl_wd_date_nav_legend=>e_category-three. ls_legend-text = 'Happy hour'. INSERT ls_legend INTO TABLE lt_legend. node-bind_table( lt_legend ). ENDMETHOD.
We
create three legend categories(one, two and three),with the
texts:“Doors open day” for the first category, “Operating teams trip”for
the second category and “Happy hour” for the third category. The
Listing shows the SUPPLY_MARKING supply function method required to
populate with values the MARKING node.
The SUPPLY_MARKING supply function method
METHOD supply_legend. DATA: ls_legend TYPE wd_this-element_legend,lt_legend LIKE TABLE OF ls_legend. ls_legend-category = cl_wd_date_nav_legend=e_category-one. ls_legend-text = 'Doors open day'. APPEND ls_legend TO lt_legend. ls_legend-category = cl_wd_date_nav_legend=e_category-two. ls_legend-text = 'Operating teams trip'. APPEND ls_legend TO lt_legend. ls_legend-category = cl_wd_date_nav_legend=e_category-three. ls_legend-text = 'Happy hour'. INSERT ls_legend INTO TABLE lt_legend. node-bind_table( lt_legend ). ENDMETHOD.
In
this way we mark (highlight),for the first category,the day
11.08.2009,for the second category,the day 21.08.2009,and for the third
category,the day 24.08.2009. When the user selects a day in our
calendar,the Framework triggers the event handler method
onactionon_day_select.
The onactionon_day_select event handler method
As
import parameter, for our event handler method, we have the parameter
named DAY of D type that holds the selected day. We pass this value in
our DAY attribute created in the context view. When the user selects a
Week in our calendar, the Framework triggers the event handler method
onactionon_week_select.
The onactionon_week_select event handler method
As
import parameter,for our event handler method,we have the parameters:
WEEK of I type that holds the selected week and YEAR of I type that
holds the corresponding year of the selected week. We pass these values
in our WEEK attribute created in the context view. When the user selects
a Month in our calendar,the Framework triggers the event handler method
onactionon_month_select.
The
onactionon_month_select event handler method, As import parameters,for
our event handler method,we have: MONTH of I type that holds the
selected month and YEAR of I type that holds the corresponding of the
selected month. We pass these values in our MONTH attribute created in
context view.
Runtime
Dynamic Programming
RUNTIME CLASS: CL_WD_DATE_NAVIGATOR
Hereunder,we
present a table showing the correspondence between the view designer
name and the runtime name, with the proper types,in case of dynamic
programming of a DateNavigation UI element.
Dynamic programming
The
implementation of a dynamic DateNavigator UI element with elements:
DateNavigatorLegent and DateNavigatorMarking, contains the following
statements:
Dynamic programming of a DataNavigator UI element
METHOD wddomodifyview. DATA lr_date_navigator TYPE REF TO cl_wd_date_navigator. DATA lr_flow_data TYPE REF TO cl_wd_flow_data. DATA lr_container TYPE REF TO cl_wd_uielement_container. DATA lr_datenav_legend TYPE REF TO cl_wd_date_nav_legend. DATA lr_datenav_marking TYPE REF TO cl_wd_date_nav_marking. IF first_time EQ abap_true. lr_container ?= view->get_element('ROOTUIELEMENTCONTAINER'). lr_date_navigator = cl_wd_date_navigator=>new_date_navigator( id ='DATENAVIGATOR' first_day_of_week = cl_wd_date_navigator=>e_first_day_of_week-sunday months_per_column = 1 months_per_row = 3 selection_mode = cl_wd_date_navigator=>e_selection_mode-range starts_with ='20090801' on_day_select ='ON_DAY_SELECT' on_month_select ='ON_MONTH_SELECT' on_week_select ='ON_WEEK_SELECT' ). lr_flow_data = cl_wd_flow_data=>new_flow_data(element = lr_date_navigator). lr_container->add_child(lr_date_navigator). lr_datenav_legend = cl_wd_date_nav_legend=>new_date_nav_legend( id ='DATENAVIGATORLEGEND' bind_category ='LEGEND.CATEGORY' bind_data_source ='LEGEND' bind_text ='LEGEND.TEXT' ). lr_date_navigator->set_legend(the_legend = lr_datenav_legend). lr_datenav_marking = cl_wd_date_nav_marking=>new_date_nav_marking( id = 'DATENAVIGATORMARKING' bind_category = MARKING.CATEGORY' bind_data_source ='MARKING' bind_date ='MARKING.DATE' ). lr_date_navigator->set_marking(the_marking=lr_datenav_marking) ENDIF. ENDMETHOD.
No comments:
Post a Comment