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 20 bool WrenchToolbarButton::g_open_wrench_immediately_for_testing = false; 21 22 WrenchToolbarButton::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 31 WrenchToolbarButton::~WrenchToolbarButton() { 32 } 33 34 void WrenchToolbarButton::SetSeverity(WrenchIconPainter::Severity severity, 35 bool animate) { 36 wrench_icon_painter_->SetSeverity(severity, animate); 37 SchedulePaint(); 38 } 39 40 gfx::Size WrenchToolbarButton::GetPreferredSize() const { 41 return ResourceBundle::GetSharedInstance(). 42 GetImageSkiaNamed(IDR_TOOLBAR_BEZEL_HOVER)->size(); 43 } 44 45 void 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 53 void WrenchToolbarButton::ScheduleWrenchIconPaint() { 54 SchedulePaint(); 55 } 56 57 bool 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 } 63 bool WrenchToolbarButton::AreDropTypesRequired() { 64 return allow_extension_dragging_ ? 65 BrowserActionDragData::AreDropTypesRequired() : 66 views::View::AreDropTypesRequired(); 67 } 68 bool 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 75 void 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 89 int WrenchToolbarButton::OnDragUpdated(const ui::DropTargetEvent& event) { 90 DCHECK(allow_extension_dragging_); 91 return ui::DragDropTypes::DRAG_MOVE; 92 } 93 94 void WrenchToolbarButton::OnDragExited() { 95 DCHECK(allow_extension_dragging_); 96 weak_factory_.InvalidateWeakPtrs(); 97 } 98 99 int WrenchToolbarButton::OnPerformDrop(const ui::DropTargetEvent& event) { 100 DCHECK(allow_extension_dragging_); 101 return ui::DragDropTypes::DRAG_MOVE; 102 } 103 104 void WrenchToolbarButton::ShowOverflowMenu() { 105 toolbar_view_->ShowAppMenu(true); // For drop. 106 } 107