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