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() const 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::AXViewState* state) OVERRIDE; 48 virtual scoped_ptr<views::LabelButtonBorder> CreateDefaultBorder() const 49 OVERRIDE; 50 51 // views::ContextMenuController: 52 virtual void ShowContextMenuForView(View* source, 53 const gfx::Point& point, 54 ui::MenuSourceType source_type) OVERRIDE; 55 56 protected: 57 // Overridden from CustomButton. Returns true if the button should become 58 // pressed when a user holds the mouse down over the button. For this 59 // implementation, both left and right mouse buttons can trigger a change 60 // to the PUSHED state. 61 virtual bool ShouldEnterPushedState(const ui::Event& event) OVERRIDE; 62 63 // Returns if menu should be shown. Override this to change default behavior. 64 virtual bool ShouldShowMenu(); 65 66 // Function to show the dropdown menu. 67 virtual void ShowDropDownMenu(ui::MenuSourceType source_type); 68 69 private: 70 // The model that populates the attached menu. 71 scoped_ptr<ui::MenuModel> model_; 72 73 // Indicates if menu is currently showing. 74 bool menu_showing_; 75 76 // Y position of mouse when left mouse button is pressed 77 int y_position_on_lbuttondown_; 78 79 // Menu runner to display drop down menu. 80 scoped_ptr<views::MenuRunner> menu_runner_; 81 82 // A factory for tasks that show the dropdown context menu for the button. 83 base::WeakPtrFactory<ToolbarButton> show_menu_factory_; 84 85 DISALLOW_COPY_AND_ASSIGN(ToolbarButton); 86 }; 87 88 #endif // CHROME_BROWSER_UI_VIEWS_TOOLBAR_TOOLBAR_BUTTON_H_ 89