WDA演练二:主界面设计(一)

前面已经完成了登陆界面的开发,下面就是主页面的展示了。

一、新建菜单表:

这里说明一下,考虑到简单点,这里只用了两级菜单展示,表里在配置的时候也指挥有一级,二级。

AUGRP对应前面用户表的GROUP

ZLEVEL对应层级,最多2级。

INX是层级对应的序号。

ID为WDA程序名称。

LANGU为语言,这里可以做多语言翻译,显示不同语言下的菜单。

TEXT为菜单显示的名字。

SUB_LEVEL为上级菜单对应的序号。

INTERFACE_WINDOW是调用的显示主窗口。

二、程序设计:

1.将全局节点拖到MAIN视图中。

2.新建NODE节点,对应菜单树。

3.NODE下新建LEAF节点,对应树叶,菜单:

4.新建NODE的属性:除了EXPAND是WDA_BOOLEAN类型,其他均为STRING类型。

5.新建LEAF属性:

 三、主页菜单设计:

1.按通常显示来,抬头是标题或者图片LOGO,上传抬头LOGO

2.接着前面的来,添加抬头图片到视图:

3.新建SPLITTER,将页面分为左右两部分。

4.给SPLITTER添加菜单控制器和右边的显示容器:

5.右侧添加视图控制器:

6.左侧加TREE:

7.将TREE绑定到前面建的节点NODE上:

8.添加树节点:

9.添加树叶节点:

10.节点绑定:

 三、初始化看看效果:

METHOD init_menu .
**-------------------------------------------------------------------------
**                          初始化菜单项
**
**        一级菜单               二级菜单
**
*
**-------------------------------------------------------------------------
  DATA lo_nd_node TYPE REF TO if_wd_context_node.
  DATA lo_nd_leaf TYPE REF TO if_wd_context_node.
  DATA lo_el_leaf TYPE REF TO if_wd_context_element.
  DATA ls_leaf TYPE wd_this->element_leaf.
  DATA lt_leaf TYPE wd_this->elements_leaf.
  DATA lo_el_node TYPE REF TO if_wd_context_element.
  DATA ls_node TYPE wd_this->element_node.
  DATA lt_node TYPE wd_this->elements_node.
  DATA l_menuid TYPE i.
*  DATA lt_auth  TYPE TABLE OF zauth.
*  DATA ls_auth  TYPE zauth.

  lo_nd_node = wd_context->get_child_node( name = wd_this->wdctx_node ).
  lo_nd_node->bind_table( lt_node )."清空节点

  DATA: lt_fir_level TYPE TABLE OF zlymenu,
        ls_fir_level TYPE zlymenu.

  DATA: lt_sec_level TYPE TABLE OF zlymenu,
        ls_sec_level TYPE zlymenu.
  DATA: lv_char TYPE string.

  SELECT * INTO TABLE lt_fir_level FROM zlymenu WHERE augrp = augrp AND zlevel IN (0,1)
    AND langu = sy-langu.

  SORT lt_fir_level BY inx.

  IF lt_fir_level IS NOT INITIAL.
    SELECT * INTO TABLE lt_sec_level FROM zlymenu
      FOR ALL ENTRIES IN lt_fir_level
      WHERE sub_level = lt_fir_level-inx  AND augrp = augrp AND zlevel = 2
      AND langu = sy-langu.
    SORT lt_sec_level BY sub_level inx.
    LOOP AT lt_fir_level INTO ls_fir_level.
      CLEAR:lt_leaf.
      LOOP AT lt_sec_level INTO ls_sec_level WHERE sub_level = ls_fir_level-inx.
        ls_leaf-leafid = ls_sec_level-id.
        ls_leaf-leafname = ls_sec_level-text.
        ls_leaf-interface_window = ls_sec_level-interface_window.
        APPEND ls_leaf TO lt_leaf.
      ENDLOOP.
      "IF lt_leaf IS NOT INITIAL.
      lv_char = ls_fir_level-inx.
      CONCATENATE 'S' lv_char INTO ls_node-nodeid.
      ls_node-nodename = ls_fir_level-text.
      ls_node-expand = 'X'.
      ls_node-icon_source = 'ICON_OBJECT_FOLDER'.
      l_menuid = l_menuid + 1.
      CALL METHOD lo_nd_node->bind_element
        EXPORTING
          new_item             = ls_node
          set_initial_elements = abap_false
          index                = l_menuid
        RECEIVING
          element              = lo_el_node.
      lo_nd_leaf = lo_el_node->get_child_node( wd_this->wdctx_leaf ).
      lo_nd_leaf->bind_table( lt_leaf ).
      REFRESH lt_leaf.
      "ENDIF.
    ENDLOOP.
  ENDIF.


ENDMETHOD.

将上面的方法在处理LOGON跳转里调用:

METHOD handlefromlogon .
  DATA lo_nd_zhis_user TYPE REF TO if_wd_context_node.
  DATA lo_el_zhis_user TYPE REF TO if_wd_context_element.
  DATA ls_zhis_user TYPE wd_this->element_zhis_user.

*   navigate from <CONTEXT> to <ZHIS_USER> via lead selection
  lo_nd_zhis_user = wd_context->get_child_node( name = wd_this->wdctx_zhis_user ).
  lo_el_zhis_user = lo_nd_zhis_user->get_element( ).
*   @TODO handle not set lead selection
  IF lo_el_zhis_user IS INITIAL.
    EXIT.
  ENDIF.

  lo_el_zhis_user->get_static_attributes(
    IMPORTING
      static_attributes = ls_zhis_user ).

  wd_this->init_menu( ls_zhis_user-augrp ).


ENDMETHOD.

添加事件处理逻辑:

METHOD onactionselect_item .
  DATA ls_leaf  TYPE wd_this->element_leaf.
  DATA ls_zlymenu TYPE zlymenu.

  DATA lo_nd_zhis_user TYPE REF TO if_wd_context_node.

  DATA lo_el_zhis_user TYPE REF TO if_wd_context_element.
  DATA ls_zhis_user TYPE wd_this->element_zhis_user.
  DATA lv_augrp TYPE wd_this->element_zhis_user-augrp.

* navigate from <CONTEXT> to <ZHIS_USER> via lead selection
  lo_nd_zhis_user = wd_context->get_child_node( name = wd_this->wdctx_zhis_user ).

* @TODO handle non existant child
* IF lo_nd_zhis_user IS INITIAL.
* ENDIF.

* get element via lead selection
  lo_el_zhis_user = lo_nd_zhis_user->get_element( ).
* @TODO handle not set lead selection
  IF lo_el_zhis_user IS INITIAL.
  ENDIF.

* get single attribute
  lo_el_zhis_user->get_attribute(
    EXPORTING
      name =  `AUGRP`
    IMPORTING
      value = lv_augrp ).


  IF context_element IS INITIAL.

    IF wd_this->iv_context_element IS NOT INITIAL.
      wd_this->iv_context_element->get_static_attributes(
       IMPORTING
         static_attributes = ls_leaf ).
    ENDIF.

    IF ls_leaf IS INITIAL.
      SELECT SINGLE * INTO ls_zlymenu FROM zlymenu
        WHERE augrp = lv_augrp
        AND zlevel = 2
        AND sub_level = 0
        AND langu = sy-langu.
      IF sy-subrc EQ 0.
        ls_leaf-leafid = ls_zlymenu-id.
        ls_leaf-leafname = ls_zlymenu-text.
        ls_leaf-interface_window = ls_zlymenu-interface_window.
      ELSE.
        EXIT.
      ENDIF.

    ENDIF.

  ELSE.

    context_element->get_static_attributes(
      IMPORTING
        static_attributes = ls_leaf ).

  ENDIF.

* 得到window名称
  DATA l_current_controller TYPE REF TO if_wd_controller.
  DATA l_message_manager    TYPE REF TO if_wd_message_manager.
  DATA lr_view_controller   TYPE REF TO if_wd_view_controller.
  DATA lr_window_controller TYPE REF TO if_wd_window_controller.
  DATA lv_window_name       TYPE string.
*
  l_current_controller ?= wd_this->wd_get_api( ).
  l_message_manager = l_current_controller->get_message_manager( ).

  lr_view_controller = wd_this->wd_get_api( ).
  lr_window_controller = lr_view_controller->get_embedding_window_ctlr( ).
  lv_window_name = lr_window_controller->if_wd_controller~name.
*
  DATA lv_vusage_name TYPE string.
  lv_vusage_name = 'MAIN_USAGE_0'.

  DATA ls_component_usages TYPE wdapi_component_usage.
  DATA l_view  TYPE string.

  DATA l_view_controller TYPE REF TO if_wd_view_controller.
  DATA l_view_name TYPE string.
  DATA: s_plug_name TYPE string.


*  ls_component_usages-component_usage_name = ls_leaf-leafid."aaaa
  ls_component_usages-embedding_position = 'MAIN/RIGHT'.

  DATA: l_view_controller_api TYPE REF TO if_wd_view_controller.
  l_view_controller_api = wd_this->wd_get_api( ).

  IF wd_this->component_usage IS NOT INITIAL.
    IF wd_this->component_usage-component_usage->has_active_component( ) IS NOT INITIAL.
      wd_this->component_usage-component_usage->delete_component(  ).
      CALL METHOD l_view_controller_api->remove_dynamic_meta_data
        EXPORTING
          source_window_name        = lv_window_name
          source_vusage_name        = lv_vusage_name
*         source_plug_name          = s_plug_name
          source_plug_name          = 'TO_WDA'
          target_component_name     = wd_this->component_usage-used_component
          target_component_usage    = wd_this->component_usage-component_usage_name
          target_view_name          = wd_this->old_view
          target_plug_name          = 'DEFAULT'
          target_embedding_position = wd_this->component_usage-embedding_position.
    ENDIF.
  ENDIF.


  TRY.
      l_view_name = ls_leaf-interface_window.
      lv_window_name = 'ZLY_PORTAL'.
      ls_component_usages-used_component = ls_leaf-leafid.
      ls_component_usages-component_usage_name = ls_leaf-leafid.
      ls_component_usages-component_usage = l_view_controller_api->prepare_dynamic_navigation(
                  source_window_name          = lv_window_name
                  source_vusage_name          = lv_vusage_name
                  source_plug_name            = 'TO_WDA'
                  target_component_name       = ls_component_usages-used_component
                  target_component_usage      = ls_component_usages-component_usage_name
                  target_view_name            = l_view_name
                  target_plug_name            = 'DEFAULT'
                  target_embedding_position   = ls_component_usages-embedding_position ).

    CATCH cx_wd_runtime_repository.
      RAISE EXCEPTION TYPE cx_wdr_rt_exception.
      EXIT.
  ENDTRY.


  DATA lo_cmp_usage TYPE REF TO if_wd_component_usage.

  IF ls_component_usages-component_usage->has_active_component( ) IS NOT INITIAL.
    ls_component_usages-component_usage->delete_component(  ).
  ENDIF.
  ls_component_usages-component_usage->create_component( ls_component_usages-used_component ).
  wd_this->component_usage = ls_component_usages.
  wd_this->old_view = l_view_name.

*-------------------------->绑interface结点<----------------------

  DATA l_intf_controller     TYPE REF TO ziwci_crm_interface.
  DATA l_wd_controller       TYPE REF TO if_wd_controller.
  DATA l_wd_context          TYPE REF TO if_wd_context.
  DATA l_wd_context_node     TYPE REF TO if_wd_context_node.


  wd_this->fire_to_WDA_plg( ).

  CLEAR ls_component_usages.




ENDMETHOD.

树叶节点绑定事件:

METHOD onactionselect_item2 .
  DATA lo_nd_leaf TYPE REF TO if_wd_context_node.
  DATA lo_el_leaf TYPE REF TO if_wd_context_element.
  DATA ls_leaf TYPE wd_this->element_leaf.


  wd_this->iv_context_element = context_element.

  context_element->get_static_attributes(
    IMPORTING
      static_attributes = ls_leaf ).


  DATA zwdevent TYPE REF TO cl_wd_custom_event.

  wd_this->onactionselect_item(
    context_element =  context_element                 " ref to if_wd_context_element
    wdevent = zwdevent                          " ref to cl_wd_custom_event
  ).

ENDMETHOD.

效果如图:

程序里默认选择了主页面。取消效果如下:

到此结束。

原文地址:https://www.cnblogs.com/sapSB/p/11098615.html