UI基础五:简单的OP组件POPUP搜索帮助

本文介绍如何在SAP CRM环境中使用ABAP开发自定义的业务组件,包括创建组件、视图、事件处理及与销售订单交互的过程。通过具体步骤展示了如何实现选择框弹出功能、参数传递与结果返回等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

需求:给一个配置表,需要根据配置表来弹出选择框,并将选择的数据添加到SALES ORDER的项目

 

BSP_WD_CMPWB

新建组件:ZHSI_JPMPG

新建视图,适用VALUE NODE 参考表ZCRMT0057.(表视图,可配置,按钮)

在节点的IF_BSP_MODEL~INIT中设置选择模式:多选:

  method IF_BSP_MODEL~INIT.

    TYPES: BEGIN OF ltype_attr_struct,
             mandt        TYPE mandt,
             zzzmodeno    TYPE zmodeno,
             zpart_group  TYPE zpart_group,
             product_id   TYPE comt_product_id,
             zgroup_des   TYPE zgroup_des,
             zproduct_des TYPE comt_prshtextx,
             quantity     TYPE zcrm_quan,

           END OF ltype_attr_struct.


    super->if_bsp_model~init( id    = id
                              owner = owner ).

    SELECTION_MODE = SELMODE_MULTI."多选

    DATA: lv_struct_ref TYPE REF TO ltype_attr_struct,
          lv_value_node TYPE REF TO cl_bsp_wd_value_node,
          lv_bo_coll    TYPE REF TO if_bol_bo_col.

    CREATE DATA lv_struct_ref.
    CREATE OBJECT lv_value_node
      EXPORTING
        iv_data_ref = lv_struct_ref.
    CREATE OBJECT lv_bo_coll TYPE cl_crm_bol_bo_col.

    lv_bo_coll->add( lv_value_node ).

    set_collection( lv_bo_coll ).


  endmethod.

在组件控制器中添加参数节点:OPTION,值节点,字段参考ZCRMT0057中个别字段

在组件控制器中添加返回结果节点:ZJPPJM,值节点,字段参考ZCRMT0057

 

根据参数条件初始化查询结果TABLE:DO_INIT_CONTEXT

  METHOD do_init_context.
**SUPER->DO_INIT_CONTEXT( ).
    DATA:gt_zcrmt0057 TYPE TABLE OF zcrmt0057,
         gw_zcrmt0057 LIKE LINE OF gt_zcrmt0057,
         lr_line      TYPE REF TO zcrmt0057,
         lr_valuenode TYPE REF TO cl_bsp_wd_value_node,
         lr_col       TYPE REF TO if_bol_bo_col,
         lr_comp      TYPE REF TO zl_zhsi_jpm_bspwdcomponen_impl,
         gr_cond      TYPE REF TO if_bol_bo_property_access,
         gw_cond      TYPE zmodeno.

    lr_comp ?= me->comp_controller.
    IF lr_comp IS BOUND.
      gr_cond = lr_comp->typed_context->option->collection_wrapper->get_current( ).
      IF gr_cond IS BOUND.
        gr_cond->get_property_as_value(
          EXPORTING
            iv_attr_name = 'ZZZMODENO'
          IMPORTING
            ev_result    = gw_cond ).
        SELECT * INTO TABLE gt_zcrmt0057 FROM zcrmt0057 WHERE zzzmodeno = gw_cond.
      ENDIF.
    ENDIF.
    CREATE OBJECT lr_col TYPE cl_crm_bol_bo_col.
    LOOP AT gt_zcrmt0057 INTO gw_zcrmt0057.
      CREATE DATA lr_line.
      CREATE OBJECT lr_valuenode
        EXPORTING
          iv_data_ref = lr_line.
      lr_valuenode->set_properties( gw_zcrmt0057 ).
      lr_col->add( lr_valuenode ).
    ENDLOOP.

    me->typed_context->zjppmj->collection_wrapper->set_collection( lr_col ).
  ENDMETHOD.

 

重定义GET_LOCAL_TOOLBAR_BUTTONS方法,添加选择按钮(点击将选择结果返回到程序中)

  METHOD if_bsp_wd_dyn_btn_control~get_local_toolbar_buttons.
    DATA:gw_button TYPE crmt_thtmlb_button.
    rt_result = super->if_bsp_wd_dyn_btn_control~get_local_toolbar_buttons( ).
    gw_button-id = 'CHOOSE'.
    gw_button-type = cl_thtmlb_util=>gc_done.
    gw_button-text = '選択'.
    gw_button-on_click = 'ZCHOOSE'.
    gw_button-enabled = abap_true.
    APPEND gw_button TO rt_result.
  ENDMETHOD.

重定义GET_NO_OF_VISIBLE_TOOLBAR_BTNS方法,修改显示的按钮数量

  METHOD if_bsp_wd_dyn_btn_control~get_no_of_visible_toolbar_btns.
    rv_result = super->if_bsp_wd_dyn_btn_control~get_no_of_visible_toolbar_btns( ).
    rv_result = 9.
  ENDMETHOD.

 

在Event Handler中添加前面设置的ZCHOOSE:

(将选择的结果添加到组件控制器的返回节点中)

  METHOD eh_onzchoose.
    DATA lr_context_node_tree      TYPE REF TO cl_bsp_wd_context_node_tree.
    DATA lr_node                   TYPE REF TO if_bsp_wd_tree_node.
    DATA lr_tree_event             TYPE REF TO cl_thtmlb_tree.
    DATA lr_choose               TYPE REF TO if_bol_bo_col_iterator.
    DATA:lr_bol TYPE REF TO if_bol_bo_col.
    DATA   lv_sel_index              TYPE int4.
    DATA :lv_row_index TYPE int4,
          lr_comp      TYPE REF TO zl_zhsi_jpm_bspwdcomponen_impl,
          lr_window    TYPE REF TO cl_bsp_wd_window.

    lr_choose = me->typed_context->zjppmj->collection_wrapper->get_iterator( ).
    lr_bol = lr_choose->get_marked( ).

    lr_comp ?= me->comp_controller.
    lr_comp->typed_context->zjppjm->collection_wrapper->clear_collection( ).
    lr_comp->typed_context->zjppjm->collection_wrapper->set_collection( lr_bol ).
    lr_window = me->view_manager->get_window_controller( ).
    lr_window->call_outbound_plug( iv_outbound_plug   = 'PRD_SELECT' ).
  ENDMETHOD.

WINDOW中添加外向跳转对象:

  METHOD op_prd_select.
    me->fire_outbound_plug( iv_outbound_plug   = 'PRD_SELECT'
                             iv_data_collection = iv_data_collection ).
  ENDMETHOD.

 

将组件添加InterfaceView,将组件控制器的参数节点和返回结果节点添加:

 

在使用的组件中添加ComponentUsage:

 

 

以上将搜索帮助的查询和返回值处理完成,现在来使用位置调用组件并处理返回结果:

在BT115IT_SLSO的中添加按钮:

  METHOD do_prepare_output.
    CALL METHOD super->do_prepare_output
      EXPORTING
        iv_first_time = abap_false.
*    CHECK sy-uname = zcl_crm_attributes=>gc_chenguoguang.
**********************************************************************20170501-Begin
*ZSO1/ZSO2/ZSO5 放出product ID 字段,ITEM增加exploed view按钮
***数据定义
    DATA:
      ls_button            TYPE crmt_thtmlb_button,
      ls_crmt_orgman_wrk   TYPE crmt_orgman_wrk,
      ls_crmst_adminh_btil TYPE crmst_adminh_btil,
      lr_btitems           TYPE REF TO cl_crm_bol_entity,
      lr_btorder           TYPE REF TO cl_crm_bol_entity,
      lr_btadminh          TYPE REF TO cl_crm_bol_entity.
***数据准备
    lr_btitems ?= me->typed_context->btitems->collection_wrapper->get_current( ).
    IF lr_btitems IS BOUND.
      lr_btorder = lr_btitems->get_root( ).
    ENDIF.
    IF lr_btorder IS BOUND.
      lr_btadminh = lr_btorder->get_related_entity( iv_relation_name = 'BTOrderHeader' ).
    ENDIF.
    CHECK lr_btadminh IS BOUND.
    lr_btadminh->get_properties( IMPORTING  es_attributes = ls_crmst_adminh_btil ).
    CALL FUNCTION 'CRM_ORGMAN_READ_OW'
      EXPORTING
        iv_ref_guid          = ls_crmst_adminh_btil-guid
        iv_ref_kind          = 'A'
      IMPORTING
        es_orgman_wrk        = ls_crmt_orgman_wrk
      EXCEPTIONS
        entry_does_not_exist = 1
        OTHERS               = 2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.

    zl_bt115it__items_impl=>gv_sales_org = ls_crmt_orgman_wrk-sales_org.
    ls_button-type     = cl_thtmlb_util=>gc_icon_goto..
    ls_button-on_click = 'ZEXPLODE'.
    ls_button-text = 'Explode view'.
    ls_button-enabled  = abap_true.
    APPEND ls_button TO gt_button_tib.
    "在ZSO5的行项目中增加“部品リスト選択”按钮,只针对日本分公司显示。在点击该按钮时,弹出对话框,显示字段如下:
    "ADD BY LY 20171031
    IF ls_crmt_orgman_wrk-sales_org = 'O 50000231' AND ls_crmst_adminh_btil-process_type = 'ZSO5'.
      ls_button-type     = cl_thtmlb_util=>gc_icon_add..
      ls_button-on_click = 'ZPDEX'.
      ls_button-text = '部品リスト選択'.
      ls_button-enabled  = abap_true.
      APPEND ls_button TO gt_button_tib.
    ENDIF.
**********************************************************************20170501-End
    "日语登陆,默认带出日语的物料描述,如无则取英语描述
    "ADD BY LY 20170613
    DATA:
      lv_langu TYPE sy-langu,
      lv_text  TYPE abap_bool.
    DATA lr_item_iter TYPE REF TO if_bol_bo_col_iterator.
    DATA lr_admini TYPE REF TO cl_crm_bol_entity.
    DATA ls_admini TYPE crmst_admini_btil.
    DATA:lr_core   TYPE REF TO cl_crm_bol_core.
    CLEAR:lv_langu.
    IF sy-langu = 'J'"加的by 李渊 20170613
      OR sy-langu = 'F'."20170731 法国逻辑
      lv_langu = sy-langu.
    ENDIF.

    IF lv_langu IS NOT INITIAL.
      lr_item_iter = me->typed_context->btadmini->collection_wrapper->if_bol_bo_col~get_iterator( ).
      CHECK lr_item_iter IS BOUND.
      lr_admini ?= lr_item_iter->get_first( ).
      WHILE lr_admini IS BOUND.
        lr_admini->get_properties( IMPORTING es_attributes = ls_admini ).
        IF sy-langu = lv_langu."加的by 李渊 20170606
          SELECT SINGLE short_text INTO ls_admini-description
            FROM comm_prshtext
            WHERE product_guid = ls_admini-product
            AND   langu        = lv_langu.
          IF sy-subrc <> 0.
            SELECT SINGLE short_text INTO ls_admini-description
             FROM comm_prshtext
             WHERE product_guid = ls_admini-product
             AND   langu        = 'E'.
          ENDIF.
        ENDIF.
        lr_admini->set_properties( EXPORTING is_attributes = ls_admini ).
        lr_admini ?= lr_item_iter->get_next( ).
      ENDWHILE.
      lr_core = cl_crm_bol_core=>get_instance( ).
      lr_core->modify( ).
    ENDIF.

  ENDMETHOD.

 

事件控制器中添加处理事件:ZPDEX

  METHOD eh_onzpdex.
* Added by wizard: Handler for event 'ZPDEX'
    OP_PRD_SELECT( ).
  ENDMETHOD.

添加外向链接:PRD_SELECT

  METHOD op_prd_select.
* Added by wizard: Outbound plug 'PRD_SELECT'
    TYPES:BEGIN OF ty_cond,
            product_id TYPE comt_product_id,
            zzzmodeno  TYPE zmodeno,
          END OF ty_cond.
    DATA:lr_entity              TYPE REF TO cl_crm_bol_entity,
         lv_interface_view_name TYPE string,
         lv_title               TYPE string,
         gw_cond                TYPE ty_cond,
         gr_cond                TYPE REF TO ty_cond,
         lr_valuenode           TYPE REF TO cl_bsp_wd_value_node,
         lr_context             TYPE REF TO cl_bsp_wd_context_node.
    DATA:ls_crmst_adminh_btil TYPE crmst_adminh_btil,
         lr_btitems           TYPE REF TO cl_crm_bol_entity,
         lr_btorder           TYPE REF TO cl_crm_bol_entity,
         lr_btadminh          TYPE REF TO cl_crm_bol_entity.
***数据准备
”not use begin lr_btitems ?= me->typed_context->btitems->collection_wrapper->get_current( ). IF lr_btitems IS BOUND. lr_btorder = lr_btitems->get_root( ). ENDIF. IF lr_btorder IS BOUND. lr_btadminh = lr_btorder->get_related_entity( iv_relation_name = 'BTOrderHeader' ). ENDIF. CHECK lr_btadminh IS BOUND. lr_btadminh->get_properties( IMPORTING es_attributes = ls_crmst_adminh_btil ). "not use end lv_interface_view_name = 'ZHSI_JPMPG/MainWindow'. lv_title = '部品リスト選択'. "弹出框的标题 comp_popup = comp_controller->window_manager->create_popup("实例化弹出框,search_belnr_popup iv_interface_view_name = lv_interface_view_name "对应的类型为IF_BSP_WD_POPUP为全局变量 iv_usage_name = 'PRD_SELECT ' iv_title = lv_title ). comp_popup->set_on_close_event( iv_view = me iv_event_name = 'ZJPP_CLOSE' ). "设置弹出窗口对应的关闭事件 ** set display mode "此事件用于接受对应的选中返回值 comp_popup->set_display_mode( if_bsp_wd_popup=>c_display_mode_surrounded ). ** Open the Popup comp_popup->set_window_width( 700 ). comp_popup->set_window_height( 500 ). DATA:lr_cond TYPE REF TO if_bol_bo_col. CREATE OBJECT lr_cond TYPE cl_crm_bol_bo_col. CREATE DATA gr_cond. CREATE OBJECT lr_valuenode EXPORTING iv_data_ref = gr_cond. gw_cond-zzzmodeno = ls_crmst_adminh_btil-zzzmodeno. lr_valuenode->set_properties( gw_cond ). lr_cond->add( lr_valuenode ). " Get Query Context node lr_context = comp_popup->get_context_node( 'OPTION' ). CHECK lr_context IS BOUND. lr_context->set_collection( collection = lr_cond ). comp_popup->open( iv_inbound_plug = 'PRD_SELECT' iv_collection = lr_cond ). ENDMETHOD.

 

处理返回结果:新建事件:ZJPP_CLOSE

  METHOD eh_onzjpp_close.
* Added by wizard: Handler for event 'ZJPP_CLOSE'
    DATA lr_item TYPE REF TO cl_crm_bol_entity.
    DATA:lr_schedext TYPE REF TO cl_crm_bol_entity,
         lr_schedlin TYPE REF TO cl_crm_bol_entity.
    DATA:lr_btitems                  TYPE REF TO cl_crm_bol_entity,
         lr_btorder                  TYPE REF TO cl_crm_bol_entity,
         lr_btadminh                 TYPE REF TO cl_crm_bol_entity,
         lr_context_node             TYPE REF TO cl_bsp_wd_context_node,
         lr_iterator                 TYPE REF TO if_bol_bo_col_iterator,
         lr_access                   TYPE REF TO if_bol_bo_property_access,
         ls_crmt0057                 TYPE zcrmt0057,
         gw_item                     TYPE crmst_admini_btil,
         gv_quantity                 TYPE crmt_schedlin_quan,
         ls_schedlin                 TYPE crmst_schedlin_btil,
         gv_string                   TYPE string,
         gr_cx_crm_genil_model_error TYPE REF TO cx_crm_genil_model_error.

    CHECK comp_popup IS BOUND.
    lr_context_node = comp_popup->get_context_node( iv_cnode_name = 'ZJPPJM' ).
    CHECK lr_context_node IS BOUND.
    lr_iterator = lr_context_node->collection_wrapper->get_iterator( ).
    IF lr_iterator->size( ) > 0.
      lr_btitems ?= me->typed_context->btitems->collection_wrapper->get_current( ).
      lr_access = lr_iterator->get_first( ).
      WHILE lr_access IS BOUND.
        CLEAR:gv_string.
        lr_access->get_properties( IMPORTING es_attributes = ls_crmt0057 ).
        TRY.
            lr_item ?= lr_btitems->create_related_entity( 'BTOrderItemAll' ).
          CATCH cx_crm_genil_model_error INTO gr_cx_crm_genil_model_error.
            gv_string = gr_cx_crm_genil_model_error->get_text( ).
        ENDTRY.
        IF lr_item IS BOUND.
          CLEAR:gw_item.
          lr_item->get_properties( IMPORTING es_attributes = gw_item ).
          IF gw_item-guid IS INITIAL.
            CALL FUNCTION 'CRM_GUID_CREATE'
              IMPORTING
                ev_guid = gw_item-guid.
          ENDIF.
          gw_item-ordered_prod = ls_crmt0057-product_id.
          lr_item->set_properties( EXPORTING  is_attributes = gw_item ).
          lr_schedext ?= lr_item->get_related_entity( 'BTItemSchedlinExt' ).
          IF lr_schedext IS NOT BOUND.
            lr_schedext ?= lr_item->create_related_entity( 'BTItemSchedlinExt' ).
          ENDIF.
          IF lr_schedext IS BOUND.
            lr_schedlin ?= lr_schedext->get_related_entity( 'BTSchedlinAll' ).
            IF lr_schedlin IS NOT BOUND.
              lr_schedlin ?= lr_schedext->create_related_entity( 'BTSchedlinAll' ).
            ENDIF.
            IF lr_schedlin IS BOUND.
              CLEAR:ls_schedlin.
              ls_schedlin-quantity = ls_crmt0057-quantity.
              lr_schedlin->if_bol_bo_property_access~set_properties( is_attributes = ls_schedlin ).
            ENDIF.
          ENDIF.
          typed_context->btitems->collection_wrapper->add( lr_item ).
        ENDIF.
        lr_access = lr_iterator->get_next( ).
      ENDWHILE.
    ENDIF.

  ENDMETHOD.

 

 

效果:

 

转载于:https://www.cnblogs.com/sapSB/p/7770645.html

详细分析解释一下chromium源码中的下面的函数: class OmniboxViewViews : public OmniboxView, public views::Textfield, #if BUILDFLAG(IS_CHROMEOS) public ash::input_method::InputMethodManager::CandidateWindowObserver, #endif public views::TextfieldController, public ui::CompositorObserver, public TemplateURLServiceObserver { METADATA_HEADER(OmniboxViewViews, views::Textfield) public: // Max width of the gradient mask used to smooth ElideAnimation edges. static const int kSmoothingGradientMaxWidth = 15; OmniboxViewViews(std::unique_ptr<OmniboxClient> client, bool popup_window_mode, LocationBarView* location_bar_view, const gfx::FontList& font_list); OmniboxViewViews(const OmniboxViewViews&) = delete; OmniboxViewViews& operator=(const OmniboxViewViews&) = delete; ~OmniboxViewViews() override; // Initialize, create the underlying views, etc. void Init(); // Exposes the RenderText for tests. #if defined(UNIT_TEST) gfx::RenderText* GetRenderText() { return views::Textfield::GetRenderText(); } #endif // For use when switching tabs, this saves the current state onto the tab so // that it can be restored during a later call to Update(). void SaveStateToTab(content::WebContents* tab); // Called when the window's active tab changes. void OnTabChanged(const content::WebContents* web_contents); // Called to clear the saved state for |web_contents|. void ResetTabState(content::WebContents* web_contents); // Installs the placeholder text with the name of the current default search // provider. For example, if Google is the default search provider, this shows // "Search Google or type a URL" when the Omnibox is empty and unfocused. void InstallPlaceholderText(); // Indicates if the cursor is at the end of the input. Requires that both // ends of the selection reside there. bool GetSelectionAtEnd() const; // Returns the width in pixels needed to display the current text. The // returned value includes margins. int GetTextWidth() const; // Returns the width in pixels needed to display the current text unelided. int GetUnelidedTextWidth() const; // Returns the omnibox's width in pixels. int GetWidth() const; // OmniboxView: void EmphasizeURLComponents() override; void Update() override; std::u16string GetText() const override; using OmniboxView::SetUserText; void SetUserText(const std::u16string& text, bool update_popup) override; void SetWindowTextAndCaretPos(const std::u16string& text, size_t caret_pos, bool update_popup, bool notify_text_changed) override; void SetAdditionalText(const std::u16string& additional_text) override; void EnterKeywordModeForDefaultSearchProvider() override; bool IsSelectAll() const override; void GetSelectionBounds(std::u16string::size_type* start, std::u16string::size_type* end) const override; void SelectAll(bool reversed) override; void RevertAll() override; void SetFocus(bool is_user_initiated) override; bool IsImeComposing() const override; gfx::NativeView GetRelativeWindowForPopup() const override; bool IsImeShowingPopup() const override; // views::Textfield: gfx::Size GetMinimumSize() const override; bool OnMousePressed(const ui::MouseEvent& event) override; bool OnMouseDragged(const ui::MouseEvent& event) override; void OnMouseReleased(const ui::MouseEvent& event) override; void OnPaint(gfx::Canvas* canvas) override; void ExecuteCommand(int command_id, int event_flags) override; void OnInputMethodChanged() override; void AddedToWidget() override; void RemovedFromWidget() override; std::u16string GetLabelForCommandId(int command_id) const override; bool IsCommandIdEnabled(int command_id) const override; // For testing only. OmniboxPopupView* GetPopupViewForTesting() const; protected: // OmniboxView: void UpdateSchemeStyle(const gfx::Range& range) override; // views::Textfield: void OnThemeChanged() override; bool IsDropCursorForInsertion() const override; // Wrappers around Textfield methods that tests can override. virtual void ApplyColor(SkColor color, const gfx::Range& range); virtual void ApplyStyle(gfx::TextStyle style, bool value, const gfx::Range& range); private: friend class TestingOmniboxView; FRIEND_TEST_ALL_PREFIXES(OmniboxPopupViewViewsTest, EmitAccessibilityEvents); // TODO(tommycli): Remove the rest of these friends after porting these // browser tests to unit tests. FRIEND_TEST_ALL_PREFIXES(OmniboxViewViewsTest, CloseOmniboxPopupOnTextDrag); FRIEND_TEST_ALL_PREFIXES(OmniboxViewViewsTest, FriendlyAccessibleLabel); FRIEND_TEST_ALL_PREFIXES(OmniboxViewViewsTest, DoNotNavigateOnDrop); FRIEND_TEST_ALL_PREFIXES(OmniboxViewViewsTest, AyncDropCallback); FRIEND_TEST_ALL_PREFIXES(OmniboxViewViewsTest, AccessibleTextSelectBoundTest); enum class UnelisionGesture { HOME_KEY_PRESSED, MOUSE_RELEASE, OTHER, }; // Update the field with |text| and set the selection. |ranges| should not be // empty; even text with no selections must have at least 1 empty range in // |ranges| to indicate the cursor position. void SetTextAndSelectedRange(const std::u16string& text, const gfx::Range& selection); // Returns the selected text. std::u16string_view GetSelectedText() const; void UpdateAccessibleTextSelection() override; // Paste text from the clipboard into the omnibox. // Textfields implementation of Paste() pastes the contents of the clipboard // as is. We want to strip whitespace and other things (see GetClipboardText() // for details). The function invokes OnBefore/AfterPossibleChange() as // necessary. void OnOmniboxPaste(); // Handle keyword hint tab-to-search and tabbing through dropdown results. bool HandleEarlyTabActions(const ui::KeyEvent& event); void ClearAccessibilityLabel(); void SetAccessibilityLabel(const std::u16string& display_text, const AutocompleteMatch& match, bool notify_text_changed) override; // Returns true if the user text was updated with the full URL (without // steady-state elisions). |gesture| is the user gesture causing unelision. bool UnapplySteadyStateElisions(UnelisionGesture gesture); #if BUILDFLAG(IS_MAC) void AnnounceFriendlySuggestionText(); #endif // Get the preferred text input type, this checks the IME locale on Windows. ui::TextInputType GetPreferredTextInputType() const; // OmniboxView: void SetCaretPos(size_t caret_pos) override; void UpdatePopup() override; void ApplyCaretVisibility() override; void OnTemporaryTextMaybeChanged(const std::u16string& display_text, const AutocompleteMatch& match, bool save_original_selection, bool notify_text_changed) override; void OnInlineAutocompleteTextMaybeChanged( const std::u16string& user_text, const std::u16string& inline_autocompletion) override; void OnInlineAutocompleteTextCleared() override; void OnRevertTemporaryText(const std::u16string& display_text, const AutocompleteMatch& match) override; void OnBeforePossibleChange() override; bool OnAfterPossibleChange(bool allow_keyword_ui_change) override; void OnKeywordPlaceholderTextChange() override; gfx::NativeView GetNativeView() const override; void ShowVirtualKeyboardIfEnabled() override; void HideImeIfNeeded() override; int GetOmniboxTextLength() const override; void SetEmphasis(bool emphasize, const gfx::Range& range) override; // views::View void OnMouseMoved(const ui::MouseEvent& event) override; void OnMouseExited(const ui::MouseEvent& event) override; // views::Textfield: bool IsItemForCommandIdDynamic(int command_id) const override; void OnGestureEvent(ui::GestureEvent* event) override; bool SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) override; bool HandleAccessibleAction(const ui::AXActionData& action_data) override; void OnFocus() override; void OnBlur() override; std::u16string GetSelectionClipboardText() const override; void DoInsertChar(char16_t ch) override; bool IsTextEditCommandEnabled(ui::TextEditCommand command) const override; void ExecuteTextEditCommand(ui::TextEditCommand command) override; bool ShouldShowPlaceholderText() const override; void UpdateAccessibleValue() override; // ash::input_method::InputMethodManager::CandidateWindowObserver: #if BUILDFLAG(IS_CHROMEOS) void CandidateWindowOpened( ash::input_method::InputMethodManager* manager) override; void CandidateWindowClosed( ash::input_method::InputMethodManager* manager) override; #endif // views::TextfieldController: void ContentsChanged(views::Textfield* sender, const std::u16string& new_contents) override; bool HandleKeyEvent(views::Textfield* sender, const ui::KeyEvent& key_event) override; void OnBeforeUserAction(views::Textfield* sender) override; void OnAfterUserAction(views::Textfield* sender) override; void OnAfterCutOrCopy(ui::ClipboardBuffer clipboard_buffer) override; void OnWriteDragData(ui::OSExchangeData* data) override; void OnGetDragOperationsForTextfield(int* drag_operations) override; void AppendDropFormats( int* formats, std::set<ui::ClipboardFormatType>* format_types) override; ui::mojom::DragOperation OnDrop(const ui::DropTargetEvent& event) override; views::View::DropCallback CreateDropCallback( const ui::DropTargetEvent& event) override; void UpdateContextMenu(ui::SimpleMenuModel* menu_contents) override; // ui::SimpleMenuModel::Delegate: bool IsCommandIdChecked(int id) const override; // ui::CompositorObserver: void OnCompositingDidCommit(ui::Compositor* compositor) override; void OnCompositingStarted(ui::Compositor* compositor, base::TimeTicks start_time) override; void OnDidPresentCompositorFrame( uint32_t frame_token, const gfx::PresentationFeedback& feedback) override; void OnCompositingShuttingDown(ui::Compositor* compositor) override; // TemplateURLServiceObserver: void OnTemplateURLServiceChanged() override; // Permits launch of the external protocol handler after user actions in // the omnibox. The handler needs to be informed that omnibox input should // always be considered "user gesture-triggered", lest it always return BLOCK. void PermitExternalProtocolHandler(); // Drops dragged text and updates `output_drag_op` accordingly. void PerformDrop(const ui::DropTargetEvent& event, ui::mojom::DragOperation& output_drag_op, std::unique_ptr<ui::LayerTreeOwner> drag_image_layer_owner); // Helper method to construct part of the context menu. void MaybeAddSendTabToSelfItem(ui::SimpleMenuModel* menu_contents); // Called when the popup view becomes visible. void OnPopupOpened(); // Helper for updating placeholder color depending on whether its a keyword or // DSE placeholder. void UpdatePlaceholderTextColor(); // When true, the location bar view is read only and also is has a slightly // different presentation (smaller font size). This is used for popups. bool popup_window_mode_; // Owns either an OmniboxPopupViewViews or an OmniboxPopupViewWebUI. std::unique_ptr<OmniboxPopupView> popup_view_; base::CallbackListSubscription popup_view_opened_subscription_; // Selection persisted across temporary text changes, like popup suggestions. gfx::Range saved_temporary_selection_; // Holds the user's selection across focus changes. There is only a saved // selection if this range IsValid(). gfx::Range saved_selection_for_focus_change_; // Tracking state before and after a possible change. State state_before_change_; bool ime_composing_before_change_ = false; // |location_bar_view_| can be NULL in tests. raw_ptr<LocationBarView> location_bar_view_; #if BUILDFLAG(IS_CHROMEOS) // True if the IME candidate window is open. When this is true, we want to // avoid showing the popup. So far, the candidate window is detected only // on Chrome OS. bool ime_candidate_window_open_ = false; #endif // True if any mouse button is currently depressed. bool is_mouse_pressed_ = false; // Applies a minimum threshold to drag events after unelision. Because the // text shifts after unelision, we don't want unintentional mouse drags to // change the selection. bool filter_drag_events_for_unelision_ = false; // Should we select all the text when we see the mouse button get released? // We select in response to a click that focuses the omnibox, but we defer // until release, setting this variable back to false if we saw a drag, to // allow the user to select just a portion of the text. bool select_all_on_mouse_release_ = false; // Indicates if we want to select all text in the omnibox when we get a // GESTURE_TAP. We want to select all only when the textfield is not in focus // and gets a tap. So we use this variable to remember focus state before tap. bool select_all_on_gesture_tap_ = false; // Whether the user should be notified if the clipboard is restricted. bool show_rejection_ui_if_any_ = false; // Keep track of the word that would be selected if URL is unelided between // a single and double click. This is an edge case where the elided URL is // selected. On the double click, unelision is performed in between the first // and second clicks. This results in both the wrong word to be selected and // the wrong selection length. For example, if example.com is shown and you // try to double click on the "x", it unelides to https://example.com after // the first click, resulting in "https" being selected. size_t next_double_click_selection_len_ = 0; size_t next_double_click_selection_offset_ = 0; // The time of the first character insert operation that has not yet been // painted. Used to measure omnibox responsiveness with a histogram. base::TimeTicks insert_char_time_; // The state machine for logging the Omnibox.CharTypedToRepaintLatency // histogram. enum { NOT_ACTIVE, // Not currently tracking a char typed event. CHAR_TYPED, // Character was typed. ON_PAINT_CALLED, // Character was typed and OnPaint() called. COMPOSITING_COMMIT, // Compositing was committed after OnPaint(). COMPOSITING_STARTED, // Compositing was started. } latency_histogram_state_; // The currently selected match, if any, with additional labelling text // such as the document title and the type of search, for example: // "Google https://google.com location from bookmark", or // "cats are liquid search suggestion". std::u16string friendly_suggestion_text_; // The number of added labelling characters before editable text begins. // For example, "Google https://google.com location from history", // this is set to 7 (the length of "Google "). int friendly_suggestion_text_prefix_length_; base::ScopedObservation<ui::Compositor, ui::CompositorObserver> scoped_compositor_observation_{this}; base::ScopedObservation<TemplateURLService, TemplateURLServiceObserver> scoped_template_url_service_observation_{this}; PrefChangeRegistrar pref_change_registrar_; base::WeakPtrFactory<OmniboxViewViews> weak_factory_{this}; };
最新发布
08-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值