summaryrefslogtreecommitdiff
path: root/chromium/ash/launcher/tabbed_launcher_button.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/launcher/tabbed_launcher_button.cc')
-rw-r--r--chromium/ash/launcher/tabbed_launcher_button.cc153
1 files changed, 153 insertions, 0 deletions
diff --git a/chromium/ash/launcher/tabbed_launcher_button.cc b/chromium/ash/launcher/tabbed_launcher_button.cc
new file mode 100644
index 00000000000..517607c4ace
--- /dev/null
+++ b/chromium/ash/launcher/tabbed_launcher_button.cc
@@ -0,0 +1,153 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/launcher/tabbed_launcher_button.h"
+
+#include <algorithm>
+
+#include "ash/launcher/launcher_button_host.h"
+#include "ash/launcher/launcher_types.h"
+#include "grit/ash_resources.h"
+#include "ui/base/accessibility/accessible_view_state.h"
+#include "ui/base/animation/multi_animation.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/image/image.h"
+#include "ui/gfx/insets.h"
+
+namespace {
+const int kIconOffsetY = 7;
+}
+
+namespace ash {
+namespace internal {
+
+TabbedLauncherButton::IconView::IconView(
+ TabbedLauncherButton* host)
+ : host_(host) {
+ if (!browser_image_) {
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+
+ browser_image_ = rb.GetImageNamed(IDR_AURA_LAUNCHER_BROWSER).ToImageSkia();
+ incognito_browser_image_ =
+ rb.GetImageNamed(IDR_AURA_LAUNCHER_INCOGNITO_BROWSER).ToImageSkia();
+ browser_panel_image_ =
+ rb.GetImageNamed(IDR_AURA_LAUNCHER_BROWSER_PANEL).ToImageSkia();
+ incognito_browser_panel_image_ =
+ rb.GetImageNamed(
+ IDR_AURA_LAUNCHER_INCOGNITO_BROWSER_PANEL).ToImageSkia();
+ }
+ set_icon_size(0);
+ if (host->is_incognito() == STATE_NOT_INCOGNITO)
+ LauncherButton::IconView::SetImage(*browser_image_);
+ else
+ LauncherButton::IconView::SetImage(*incognito_browser_image_);
+}
+
+TabbedLauncherButton::IconView::~IconView() {
+}
+
+void TabbedLauncherButton::IconView::AnimationEnded(
+ const ui::Animation* animation) {
+ AnimationProgressed(animation);
+ animating_image_ = gfx::ImageSkia();
+}
+
+void TabbedLauncherButton::IconView::AnimationProgressed(
+ const ui::Animation* animation) {
+ if (animation_->current_part_index() == 1)
+ SchedulePaint();
+}
+
+void TabbedLauncherButton::IconView::SetTabImage(const gfx::ImageSkia& image) {
+ if (image.isNull()) {
+ if (!image_.isNull()) {
+ // Pause for 500ms, then ease out for 200ms.
+ ui::MultiAnimation::Parts animation_parts;
+ animation_parts.push_back(ui::MultiAnimation::Part(500, ui::Tween::ZERO));
+ animation_parts.push_back(
+ ui::MultiAnimation::Part(200, ui::Tween::EASE_OUT));
+ animation_.reset(new ui::MultiAnimation(
+ animation_parts,
+ ui::MultiAnimation::GetDefaultTimerInterval()));
+ animation_->set_continuous(false);
+ animation_->set_delegate(this);
+ animation_->Start();
+ animating_image_ = image_;
+ image_ = image;
+ }
+ } else {
+ animation_.reset();
+ SchedulePaint();
+ image_ = image;
+ }
+}
+
+void TabbedLauncherButton::IconView::OnPaint(gfx::Canvas* canvas) {
+ LauncherButton::IconView::OnPaint(canvas);
+
+ // Only non incognito icons show the tab image.
+ if (host_->is_incognito() != STATE_NOT_INCOGNITO)
+ return;
+
+ if ((animation_.get() && animation_->is_animating() &&
+ animation_->current_part_index() == 1)) {
+ int x = (width() - animating_image_.width()) / 2;
+ canvas->SaveLayerAlpha(animation_->CurrentValueBetween(255, 0));
+ canvas->DrawImageInt(animating_image_, x, kIconOffsetY);
+ canvas->Restore();
+ } else {
+ int x = (width() - image_.width()) / 2;
+ canvas->DrawImageInt(image_, x, kIconOffsetY);
+ }
+}
+
+// static
+const gfx::ImageSkia* TabbedLauncherButton::IconView::browser_image_ = NULL;
+const gfx::ImageSkia* TabbedLauncherButton::IconView::incognito_browser_image_ =
+ NULL;
+const gfx::ImageSkia* TabbedLauncherButton::IconView::browser_panel_image_ =
+ NULL;
+const gfx::ImageSkia*
+ TabbedLauncherButton::IconView::incognito_browser_panel_image_ = NULL;
+
+TabbedLauncherButton* TabbedLauncherButton::Create(
+ views::ButtonListener* listener,
+ LauncherButtonHost* host,
+ ShelfLayoutManager* shelf_layout_manager,
+ IncognitoState is_incognito) {
+ TabbedLauncherButton* button = new TabbedLauncherButton(
+ listener, host, shelf_layout_manager, is_incognito);
+ button->Init();
+ return button;
+}
+
+TabbedLauncherButton::TabbedLauncherButton(
+ views::ButtonListener* listener,
+ LauncherButtonHost* host,
+ ShelfLayoutManager* shelf_layout_manager,
+ IncognitoState is_incognito)
+ : LauncherButton(listener, host, shelf_layout_manager),
+ is_incognito_(is_incognito) {
+ set_accessibility_focusable(true);
+}
+
+TabbedLauncherButton::~TabbedLauncherButton() {
+}
+
+void TabbedLauncherButton::SetTabImage(const gfx::ImageSkia& image) {
+ tabbed_icon_view()->SetTabImage(image);
+}
+
+void TabbedLauncherButton::GetAccessibleState(ui::AccessibleViewState* state) {
+ state->role = ui::AccessibilityTypes::ROLE_PUSHBUTTON;
+ state->name = host()->GetAccessibleName(this);
+}
+
+LauncherButton::IconView* TabbedLauncherButton::CreateIconView() {
+ return new IconView(this);
+}
+
+} // namespace internal
+} // namespace ash