Home | History | Annotate | Download | only in toolbar
      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