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_WRENCH_TOOLBAR_BUTTON_H_
6#define CHROME_BROWSER_UI_VIEWS_TOOLBAR_WRENCH_TOOLBAR_BUTTON_H_
7
8#include "base/macros.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/memory/weak_ptr.h"
11#include "chrome/browser/ui/toolbar/wrench_icon_painter.h"
12#include "ui/views/controls/button/menu_button.h"
13
14class ToolbarView;
15
16// TODO(gbillock): Rename this? No longer a wrench.
17class WrenchToolbarButton : public views::MenuButton,
18                            public WrenchIconPainter::Delegate {
19 public:
20  explicit WrenchToolbarButton(ToolbarView* toolbar_view);
21  virtual ~WrenchToolbarButton();
22
23  void SetSeverity(WrenchIconPainter::Severity severity, bool animate);
24
25  // views::MenuButton:
26  virtual gfx::Size GetPreferredSize() const OVERRIDE;
27  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
28
29  // WrenchIconPainter::Delegate:
30  virtual void ScheduleWrenchIconPaint() OVERRIDE;
31
32  // Opens the wrench menu immediately during a drag-and-drop operation.
33  // Used only in testing.
34  static bool g_open_wrench_immediately_for_testing;
35
36 private:
37  // views::View:
38  virtual bool GetDropFormats(int* formats,
39      std::set<ui::OSExchangeData::CustomFormat>* custom_formats) OVERRIDE;
40  virtual bool AreDropTypesRequired() OVERRIDE;
41  virtual bool CanDrop(const ui::OSExchangeData& data) OVERRIDE;
42  virtual void OnDragEntered(const ui::DropTargetEvent& event) OVERRIDE;
43  virtual int OnDragUpdated(const ui::DropTargetEvent& event) OVERRIDE;
44  virtual void OnDragExited() OVERRIDE;
45  virtual int OnPerformDrop(const ui::DropTargetEvent& event) OVERRIDE;
46
47  // Show the extension action overflow menu (which is in the app menu).
48  void ShowOverflowMenu();
49
50  scoped_ptr<WrenchIconPainter> wrench_icon_painter_;
51
52  // Our owning toolbar view.
53  ToolbarView* toolbar_view_;
54
55  // Whether or not we should allow dragging extension icons onto this button
56  // (in order to open the overflow in the app/wrench menu).
57  bool allow_extension_dragging_;
58
59  // Used to spawn weak pointers for delayed tasks to open the overflow menu.
60  base::WeakPtrFactory<WrenchToolbarButton> weak_factory_;
61
62  DISALLOW_COPY_AND_ASSIGN(WrenchToolbarButton);
63};
64
65#endif  // CHROME_BROWSER_UI_VIEWS_TOOLBAR_WRENCH_TOOLBAR_BUTTON_H_
66