16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file.
46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "athena/wm/overview_toolbar.h"
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "athena/resources/grit/athena_resources.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "athena/strings/grit/athena_strings.h"
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/bind.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/time/time.h"
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/aura/window.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/l10n/l10n_util.h"
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/compositor/closure_animation_observer.h"
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/compositor/layer.h"
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/compositor/layer_delegate.h"
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/compositor/scoped_layer_animation_settings.h"
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/events/event.h"
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/gfx/canvas.h"
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/gfx/transform.h"
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace {
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const int kActionButtonImageSize = 54;
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const int kActionButtonTextSize = 20;
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const int kActionButtonPaddingFromRight = 32;
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace athena {
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class ActionButton : public ui::LayerDelegate {
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public:
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ActionButton(int resource_id, const base::string16& label)
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : resource_id_(resource_id), label_(label) {
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer_.reset(new ui::Layer(ui::LAYER_TEXTURED));
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer_->set_delegate(this);
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer_->SetFillsBoundsOpaquely(false);
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer_->SetVisible(true);
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer_->SetOpacity(0);
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual ~ActionButton() {}
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  static void DestroyAfterFadeout(scoped_ptr<ActionButton> button) {
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ui::Layer* layer = button->layer();
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ui::ScopedLayerAnimationSettings settings(layer->GetAnimator());
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    settings.AddObserver(new ui::ClosureAnimationObserver(
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        base::Bind(&ActionButton::DestroyImmediately, base::Passed(&button))));
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer->SetOpacity(0);
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void SetPosition(const gfx::Point& position) {
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    layer_->SetBounds(
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        gfx::Rect(position,
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                  gfx::Size(kActionButtonImageSize,
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                            kActionButtonImageSize + kActionButtonTextSize)));
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui::Layer* layer() { return layer_.get(); }
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private:
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  static void DestroyImmediately(scoped_ptr<ActionButton> button) {
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    button.reset();
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // ui::LayerDelegate:
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnPaintLayer(gfx::Canvas* canvas) OVERRIDE {
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    canvas->DrawImageInt(*bundle.GetImageSkiaNamed(resource_id_), 0, 0);
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    gfx::ShadowValues shadow;
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    shadow.push_back(gfx::ShadowValue(gfx::Point(0, 1), 2, SK_ColorBLACK));
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    shadow.push_back(gfx::ShadowValue(gfx::Point(0, -1), 2, SK_ColorBLACK));
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    canvas->DrawStringRectWithShadows(label_,
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                      gfx::FontList(),
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                      SK_ColorWHITE,
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                      gfx::Rect(0,
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                                kActionButtonImageSize,
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                                kActionButtonImageSize,
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                                kActionButtonTextSize),
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                      0,
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                      gfx::Canvas::TEXT_ALIGN_CENTER,
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                      shadow);
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnDelegatedFrameDamage(
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const gfx::Rect& damage_rect_in_dip) OVERRIDE {}
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE {}
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual base::Closure PrepareForLayerBoundsChange() OVERRIDE {
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return base::Closure();
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  int resource_id_;
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::string16 label_;
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_ptr<ui::Layer> layer_;
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ActionButton);
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)OverviewToolbar::OverviewToolbar(aura::Window* container)
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : shown_(false),
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      disabled_action_bitfields_(0),
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      close_(new ActionButton(
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          IDR_ATHENA_OVERVIEW_TRASH,
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          l10n_util::GetStringUTF16(IDS_ATHENA_OVERVIEW_CLOSE))),
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      split_(new ActionButton(
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          IDR_ATHENA_OVERVIEW_SPLIT,
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          l10n_util::GetStringUTF16(IDS_ATHENA_OVERVIEW_SPLIT))),
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      current_action_(ACTION_TYPE_NONE),
1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      container_bounds_(container->bounds()) {
1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const int kPaddingFromBottom = 200;
1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const int kPaddingBetweenButtons = 200;
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  int x = container_bounds_.right() -
1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          (kActionButtonPaddingFromRight + kActionButtonImageSize);
1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  int y = container_bounds_.bottom() -
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          (kPaddingFromBottom + kActionButtonImageSize);
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  split_->SetPosition(gfx::Point(x, y));
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  y -= kPaddingBetweenButtons;
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  close_->SetPosition(gfx::Point(x, y));
1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  container->layer()->Add(split_->layer());
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  container->layer()->Add(close_->layer());
1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)OverviewToolbar::~OverviewToolbar() {
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // If the buttons are visible, then fade them out, instead of destroying them
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // immediately.
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (shown_) {
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ActionButton::DestroyAfterFadeout(split_.Pass());
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ActionButton::DestroyAfterFadeout(close_.Pass());
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)OverviewToolbar::ActionType OverviewToolbar::GetHighlightAction(
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const ui::GestureEvent& event) const {
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (IsActionEnabled(ACTION_TYPE_SPLIT) &&
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      IsEventOverButton(split_.get(), event))
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return ACTION_TYPE_SPLIT;
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (IsActionEnabled(ACTION_TYPE_CLOSE) &&
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      IsEventOverButton(close_.get(), event))
1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return ACTION_TYPE_CLOSE;
1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return ACTION_TYPE_NONE;
1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void OverviewToolbar::SetHighlightAction(ActionType action) {
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(IsActionEnabled(action));
1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (current_action_ == action)
1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  current_action_ = action;
1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!shown_) {
1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ShowActionButtons();
1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } else {
1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    TransformButton(close_.get());
1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    TransformButton(split_.get());
1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void OverviewToolbar::ShowActionButtons() {
1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!shown_)
1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ToggleActionButtonsVisibility();
1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void OverviewToolbar::HideActionButtons() {
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (shown_)
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ToggleActionButtonsVisibility();
1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid OverviewToolbar::DisableAction(ActionType action) {
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_NE(current_action_, action);
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  disabled_action_bitfields_ |= (1u << action);
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void OverviewToolbar::ToggleActionButtonsVisibility() {
1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  shown_ = !shown_;
1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  TransformButton(close_.get());
1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  TransformButton(split_.get());
1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool OverviewToolbar::IsActionEnabled(ActionType action) const {
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return !(disabled_action_bitfields_ & (1u << action));
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool OverviewToolbar::IsEventOverButton(ActionButton* button,
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                        const ui::GestureEvent& event) const {
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const int kBoundsInsetForTarget = 30;
1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  gfx::RectF bounds = button->layer()->bounds();
1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bounds.Inset(-kBoundsInsetForTarget, -kBoundsInsetForTarget);
1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return bounds.Contains(event.location());
1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)gfx::Transform OverviewToolbar::ComputeTransformFor(
1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ActionButton* button) const {
1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!shown_)
1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return gfx::Transform();
1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const float kHighlightScale = 1.5;
1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool button_is_highlighted =
1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      (current_action_ == ACTION_TYPE_CLOSE && button == close_.get()) ||
2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      (current_action_ == ACTION_TYPE_SPLIT && button == split_.get());
2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  gfx::Transform transform;
2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (button_is_highlighted) {
2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    transform.Translate(-kActionButtonImageSize * (kHighlightScale - 1) / 2, 0);
2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    transform.Scale(kHighlightScale, kHighlightScale);
2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return transform;
2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void OverviewToolbar::TransformButton(ActionButton* button) {
2106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ui::ScopedLayerAnimationSettings split_settings(
2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      button->layer()->GetAnimator());
2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  split_settings.SetTweenType(gfx::Tween::SMOOTH_IN_OUT);
2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  button->layer()->SetTransform(ComputeTransformFor(button));
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool button_is_enabled =
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (button == close_.get() && IsActionEnabled(ACTION_TYPE_CLOSE)) ||
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (button == split_.get() && IsActionEnabled(ACTION_TYPE_SPLIT));
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  button->layer()->SetOpacity((button_is_enabled && shown_) ? 1 : 0);
2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace athena
221