1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_UI_VIEWS_TOOLBAR_TOOLBAR_BUTTON_H_ 6 #define CHROME_BROWSER_UI_VIEWS_TOOLBAR_TOOLBAR_BUTTON_H_ 7 8 #include "ui/views/context_menu_controller.h" 9 #include "ui/views/controls/button/button.h" 10 #include "ui/views/controls/button/label_button.h" 11 12 namespace ui { 13 class MenuModel; 14 } 15 16 namespace views { 17 class MenuRunner; 18 } 19 20 // This class provides basic drawing and mouse-over behavior for buttons 21 // appearing in the toolbar. 22 class ToolbarButton : public views::LabelButton, 23 public views::ContextMenuController { 24 public: 25 // Takes ownership of the |model|, which can be null if no menu 26 // is to be shown. 27 ToolbarButton(views::ButtonListener* listener, ui::MenuModel* model); 28 virtual ~ToolbarButton(); 29 30 // Set up basic mouseover border behavior. 31 // Should be called before first paint. 32 void Init(); 33 34 // Methods for handling ButtonDropDown-style menus. 35 void ClearPendingMenu(); 36 bool IsMenuShowing() const; 37 38 // views::LabelButton: 39 virtual gfx::Size GetPreferredSize() OVERRIDE; 40 virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE; 41 virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE; 42 virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE; 43 // Showing the drop down results in a MouseCaptureLost, we need to ignore it. 44 virtual void OnMouseCaptureLost() OVERRIDE; 45 virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE; 46 virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE; 47 virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; 48 49 // views::ContextMenuController: 50 virtual void ShowContextMenuForView(View* source, 51 const gfx::Point& point, 52 ui::MenuSourceType source_type) OVERRIDE; 53 54 protected: 55 // Overridden from CustomButton. Returns true if the button should become 56 // pressed when a user holds the mouse down over the button. For this 57 // implementation, both left and right mouse buttons can trigger a change 58 // to the PUSHED state. 59 virtual bool ShouldEnterPushedState(const ui::Event& event) OVERRIDE; 60 61 // Returns if menu should be shown. Override this to change default behavior. 62 virtual bool ShouldShowMenu(); 63 64 // Function to show the dropdown menu. 65 virtual void ShowDropDownMenu(ui::MenuSourceType source_type); 66 67 private: 68 // The model that populates the attached menu. 69 scoped_ptr<ui::MenuModel> model_; 70 71 // Indicates if menu is currently showing. 72 bool menu_showing_; 73 74 // Y position of mouse when left mouse button is pressed 75 int y_position_on_lbuttondown_; 76 77 // Menu runner to display drop down menu. 78 scoped_ptr<views::MenuRunner> menu_runner_; 79 80 // A factory for tasks that show the dropdown context menu for the button. 81 base::WeakPtrFactory<ToolbarButton> show_menu_factory_; 82 83 DISALLOW_COPY_AND_ASSIGN(ToolbarButton); 84 }; 85 86 #endif // CHROME_BROWSER_UI_VIEWS_TOOLBAR_TOOLBAR_BUTTON_H_ 87