10879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga// Copyright 2013 The Chromium Authors. All rights reserved. 20879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga// Use of this source code is governed by a BSD-style license that can be 30879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga// found in the LICENSE file. 40879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 50879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga#include "chrome/browser/ui/views/toolbar/wrench_toolbar_button.h" 60879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 70879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga#include "base/message_loop/message_loop.h" 80879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga#include "base/time/time.h" 90879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga#include "chrome/browser/ui/browser.h" 100879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga#include "chrome/browser/ui/views/extensions/browser_action_drag_data.h" 110879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga#include "chrome/browser/ui/views/toolbar/toolbar_view.h" 120879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga#include "extensions/common/feature_switch.h" 130879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga#include "grit/theme_resources.h" 140879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga#include "ui/base/resource/resource_bundle.h" 150879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga#include "ui/base/theme_provider.h" 160879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga#include "ui/views/metrics.h" 170879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga#include "ui/views/painter.h" 180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 19d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown// static 200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagabool WrenchToolbarButton::g_open_wrench_immediately_for_testing = false; 210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko IkenagaWrenchToolbarButton::WrenchToolbarButton(ToolbarView* toolbar_view) 230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga : views::MenuButton(NULL, base::string16(), toolbar_view, false), 240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga wrench_icon_painter_(new WrenchIconPainter(this)), 250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga toolbar_view_(toolbar_view), 260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga allow_extension_dragging_( 270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga extensions::FeatureSwitch::extension_action_redesign()->IsEnabled()), 280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga weak_factory_(this) { 290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga} 300879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko IkenagaWrenchToolbarButton::~WrenchToolbarButton() { 320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga} 330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagavoid WrenchToolbarButton::SetSeverity(WrenchIconPainter::Severity severity, 350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga bool animate) { 36d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown wrench_icon_painter_->SetSeverity(severity, animate); 37d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown SchedulePaint(); 38d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown} 390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagagfx::Size WrenchToolbarButton::GetPreferredSize() const { 410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return ResourceBundle::GetSharedInstance(). 420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga GetImageSkiaNamed(IDR_TOOLBAR_BEZEL_HOVER)->size(); 430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga} 440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 45ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapndevoid WrenchToolbarButton::OnPaint(gfx::Canvas* canvas) { 46ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde views::MenuButton::OnPaint(canvas); 47d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown wrench_icon_painter_->Paint(canvas, 480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga GetThemeProvider(), 490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga gfx::Rect(size()), 50ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde WrenchIconPainter::BEZEL_NONE); 51ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde} 520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagavoid WrenchToolbarButton::ScheduleWrenchIconPaint() { 540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga SchedulePaint(); 550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga} 560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagabool WrenchToolbarButton::GetDropFormats( 580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int* formats, std::set<ui::OSExchangeData::CustomFormat>* custom_formats) { 590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return allow_extension_dragging_ ? 600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga BrowserActionDragData::GetDropFormats(custom_formats) : 610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga views::View::GetDropFormats(formats, custom_formats); 62d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown} 63d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brownbool WrenchToolbarButton::AreDropTypesRequired() { 64d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown return allow_extension_dragging_ ? 65d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown BrowserActionDragData::AreDropTypesRequired() : 66d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown views::View::AreDropTypesRequired(); 67d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown} 680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagabool WrenchToolbarButton::CanDrop(const ui::OSExchangeData& data) { 690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return allow_extension_dragging_ ? 700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga BrowserActionDragData::CanDrop(data, 710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga toolbar_view_->browser()->profile()) : 720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga views::View::CanDrop(data); 730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga} 740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagavoid WrenchToolbarButton::OnDragEntered(const ui::DropTargetEvent& event) { 760879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga DCHECK(allow_extension_dragging_); 770879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga DCHECK(!weak_factory_.HasWeakPtrs()); 780879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!g_open_wrench_immediately_for_testing) { 790879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga base::MessageLoop::current()->PostDelayedTask( 800879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga FROM_HERE, 810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga base::Bind(&WrenchToolbarButton::ShowOverflowMenu, 820879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga weak_factory_.GetWeakPtr()), 83ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde base::TimeDelta::FromMilliseconds(views::GetMenuShowDelay())); 840879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 85ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde ShowOverflowMenu(); 860879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 870879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga} 880879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 890879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagaint WrenchToolbarButton::OnDragUpdated(const ui::DropTargetEvent& event) { 900879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga DCHECK(allow_extension_dragging_); 910879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return ui::DragDropTypes::DRAG_MOVE; 920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga} 93ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde 940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagavoid WrenchToolbarButton::OnDragExited() { 95ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde DCHECK(allow_extension_dragging_); 960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga weak_factory_.InvalidateWeakPtrs(); 970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga} 980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 990879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagaint WrenchToolbarButton::OnPerformDrop(const ui::DropTargetEvent& event) { 1000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga DCHECK(allow_extension_dragging_); 1010879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return ui::DragDropTypes::DRAG_MOVE; 1020879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga} 1030879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 1040879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagavoid WrenchToolbarButton::ShowOverflowMenu() { 1050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga toolbar_view_->ShowAppMenu(true); // For drop. 1060879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga} 1070879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga