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