wrench_toolbar_button.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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#include "chrome/browser/ui/views/toolbar/wrench_toolbar_button.h"
6
7#include "base/message_loop/message_loop.h"
8#include "base/time/time.h"
9#include "chrome/browser/ui/browser.h"
10#include "chrome/browser/ui/views/extensions/browser_action_drag_data.h"
11#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
12#include "extensions/common/feature_switch.h"
13#include "grit/theme_resources.h"
14#include "ui/base/resource/resource_bundle.h"
15#include "ui/base/theme_provider.h"
16#include "ui/views/metrics.h"
17#include "ui/views/painter.h"
18
19// static
20bool WrenchToolbarButton::g_open_wrench_immediately_for_testing = false;
21
22WrenchToolbarButton::WrenchToolbarButton(ToolbarView* toolbar_view)
23    : views::MenuButton(NULL, base::string16(), toolbar_view, false),
24      wrench_icon_painter_(new WrenchIconPainter(this)),
25      toolbar_view_(toolbar_view),
26      allow_extension_dragging_(
27          extensions::FeatureSwitch::extension_action_redesign()->IsEnabled()),
28      weak_factory_(this) {
29}
30
31WrenchToolbarButton::~WrenchToolbarButton() {
32}
33
34void WrenchToolbarButton::SetSeverity(WrenchIconPainter::Severity severity,
35                                      bool animate) {
36  wrench_icon_painter_->SetSeverity(severity, animate);
37  SchedulePaint();
38}
39
40gfx::Size WrenchToolbarButton::GetPreferredSize() const {
41  return ResourceBundle::GetSharedInstance().
42      GetImageSkiaNamed(IDR_TOOLBAR_BEZEL_HOVER)->size();
43}
44
45void WrenchToolbarButton::OnPaint(gfx::Canvas* canvas) {
46  views::MenuButton::OnPaint(canvas);
47  wrench_icon_painter_->Paint(canvas,
48                              GetThemeProvider(),
49                              gfx::Rect(size()),
50                              WrenchIconPainter::BEZEL_NONE);
51}
52
53void WrenchToolbarButton::ScheduleWrenchIconPaint() {
54  SchedulePaint();
55}
56
57bool WrenchToolbarButton::GetDropFormats(
58    int* formats, std::set<ui::OSExchangeData::CustomFormat>* custom_formats) {
59  return allow_extension_dragging_ ?
60      BrowserActionDragData::GetDropFormats(custom_formats) :
61      views::View::GetDropFormats(formats, custom_formats);
62}
63bool WrenchToolbarButton::AreDropTypesRequired() {
64  return allow_extension_dragging_ ?
65      BrowserActionDragData::AreDropTypesRequired() :
66      views::View::AreDropTypesRequired();
67}
68bool WrenchToolbarButton::CanDrop(const ui::OSExchangeData& data) {
69  return allow_extension_dragging_ ?
70      BrowserActionDragData::CanDrop(data,
71                                     toolbar_view_->browser()->profile()) :
72      views::View::CanDrop(data);
73}
74
75void WrenchToolbarButton::OnDragEntered(const ui::DropTargetEvent& event) {
76  DCHECK(allow_extension_dragging_);
77  DCHECK(!weak_factory_.HasWeakPtrs());
78  if (!g_open_wrench_immediately_for_testing) {
79    base::MessageLoop::current()->PostDelayedTask(
80        FROM_HERE,
81        base::Bind(&WrenchToolbarButton::ShowOverflowMenu,
82                   weak_factory_.GetWeakPtr()),
83        base::TimeDelta::FromMilliseconds(views::GetMenuShowDelay()));
84  } else {
85    ShowOverflowMenu();
86  }
87}
88
89int WrenchToolbarButton::OnDragUpdated(const ui::DropTargetEvent& event) {
90  DCHECK(allow_extension_dragging_);
91  return ui::DragDropTypes::DRAG_MOVE;
92}
93
94void WrenchToolbarButton::OnDragExited() {
95  DCHECK(allow_extension_dragging_);
96  weak_factory_.InvalidateWeakPtrs();
97}
98
99int WrenchToolbarButton::OnPerformDrop(const ui::DropTargetEvent& event) {
100  DCHECK(allow_extension_dragging_);
101  return ui::DragDropTypes::DRAG_MOVE;
102}
103
104void WrenchToolbarButton::ShowOverflowMenu() {
105  toolbar_view_->ShowAppMenu(true);  // For drop.
106}
107