1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ash/shelf/alternate_app_list_button.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/ash_constants.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/ash_switches.h"
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/shelf/shelf_button.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/shelf/shelf_button_host.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/shelf/shelf_item_types.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/shelf/shelf_layout_manager.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/shelf/shelf_widget.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/shell.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "grit/ash_resources.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "grit/ash_strings.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/l10n/l10n_util.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/resource/resource_bundle.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/compositor/layer.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/compositor/layer_animation_element.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/compositor/layer_animation_sequence.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/compositor/scoped_layer_animation_settings.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/canvas.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/image/image_skia_operations.h"
269ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "ui/views/controls/button/image_button.h"
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/painter.h"
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace ash {
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst int AlternateAppListButton::kImageBoundsSize = 7;
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochAlternateAppListButton::AlternateAppListButton(views::ButtonListener* listener,
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                               ShelfButtonHost* host,
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                               ShelfWidget* shelf_widget)
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : views::ImageButton(listener),
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      host_(host),
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      shelf_widget_(shelf_widget) {
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SetAccessibleName(l10n_util::GetStringUTF16(IDS_ASH_SHELF_APP_LIST_TITLE));
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SetSize(gfx::Size(ShelfLayoutManager::kShelfSize,
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                    ShelfLayoutManager::kShelfSize));
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SetFocusPainter(views::Painter::CreateSolidFocusPainter(
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      kFocusBorderColor, gfx::Insets(1, 1, 1, 1)));
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochAlternateAppListButton::~AlternateAppListButton() {
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AlternateAppListButton::OnMousePressed(const ui::MouseEvent& event) {
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ImageButton::OnMousePressed(event);
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  host_->PointerPressedOnButton(this, ShelfButtonHost::MOUSE, event);
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return true;
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AlternateAppListButton::OnMouseReleased(const ui::MouseEvent& event) {
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ImageButton::OnMouseReleased(event);
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  host_->PointerReleasedOnButton(this, ShelfButtonHost::MOUSE, false);
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AlternateAppListButton::OnMouseCaptureLost() {
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  host_->PointerReleasedOnButton(this, ShelfButtonHost::MOUSE, true);
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ImageButton::OnMouseCaptureLost();
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AlternateAppListButton::OnMouseDragged(const ui::MouseEvent& event) {
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ImageButton::OnMouseDragged(event);
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  host_->PointerDraggedOnButton(this, ShelfButtonHost::MOUSE, event);
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return true;
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AlternateAppListButton::OnMouseMoved(const ui::MouseEvent& event) {
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ImageButton::OnMouseMoved(event);
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  host_->MouseMovedOverButton(this);
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AlternateAppListButton::OnMouseEntered(const ui::MouseEvent& event) {
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ImageButton::OnMouseEntered(event);
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  host_->MouseEnteredButton(this);
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AlternateAppListButton::OnMouseExited(const ui::MouseEvent& event) {
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ImageButton::OnMouseExited(event);
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  host_->MouseExitedButton(this);
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void AlternateAppListButton::OnGestureEvent(ui::GestureEvent* event) {
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  switch (event->type()) {
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)   case ui::ET_GESTURE_SCROLL_BEGIN:
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)     host_->PointerPressedOnButton(this, ShelfButtonHost::TOUCH, *event);
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     event->SetHandled();
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     return;
9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)   case ui::ET_GESTURE_SCROLL_UPDATE:
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)     host_->PointerDraggedOnButton(this, ShelfButtonHost::TOUCH, *event);
9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     event->SetHandled();
9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     return;
9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)   case ui::ET_GESTURE_SCROLL_END:
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)   case ui::ET_SCROLL_FLING_START:
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)     host_->PointerReleasedOnButton(this, ShelfButtonHost::TOUCH, false);
10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     event->SetHandled();
10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     return;
10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)   default:
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     ImageButton::OnGestureEvent(event);
10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)     return;
10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AlternateAppListButton::OnPaint(gfx::Canvas* canvas) {
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Call the base class first to paint any background/borders.
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  View::OnPaint(canvas);
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int background_image_id = 0;
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (Shell::GetInstance()->GetAppListTargetVisibility()) {
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    background_image_id = IDR_AURA_NOTIFICATION_BACKGROUND_PRESSED;
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (shelf_widget_->GetDimsShelf())
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      background_image_id = IDR_AURA_NOTIFICATION_BACKGROUND_ON_BLACK;
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    else
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      background_image_id = IDR_AURA_NOTIFICATION_BACKGROUND_NORMAL;
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const gfx::ImageSkia* background_image =
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      rb.GetImageNamed(background_image_id).ToImageSkia();
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const gfx::ImageSkia* forground_image =
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      rb.GetImageNamed(IDR_ASH_SHELF_ICON_APPLIST_ALTERNATE).ToImageSkia();
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect contents_bounds = GetContentsBounds();
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::Rect background_bounds, forground_bounds;
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
130ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ShelfAlignment alignment = shelf_widget_->GetAlignment();
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  background_bounds.set_size(background_image->size());
132ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (alignment == SHELF_ALIGNMENT_LEFT) {
133ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    background_bounds.set_x(contents_bounds.width() -
134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        ShelfLayoutManager::kShelfItemInset - background_image->width());
135ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    background_bounds.set_y(contents_bounds.y() +
136ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        (contents_bounds.height() - background_image->height()) / 2);
137ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  } else if(alignment == SHELF_ALIGNMENT_RIGHT) {
138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    background_bounds.set_x(ShelfLayoutManager::kShelfItemInset);
139ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    background_bounds.set_y(contents_bounds.y() +
140ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        (contents_bounds.height() - background_image->height()) / 2);
141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  } else {
142d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    background_bounds.set_y(ShelfLayoutManager::kShelfItemInset);
143ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    background_bounds.set_x(contents_bounds.x() +
144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        (contents_bounds.width() - background_image->width()) / 2);
145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  forground_bounds.set_size(forground_image->size());
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  forground_bounds.set_x(background_bounds.x() +
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      std::max(0,
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          (background_bounds.width() - forground_bounds.width()) / 2));
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  forground_bounds.set_y(background_bounds.y() +
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      std::max(0,
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          (background_bounds.height() - forground_bounds.height()) / 2));
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  canvas->DrawImageInt(*background_image,
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       background_bounds.x(),
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       background_bounds.y());
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  canvas->DrawImageInt(*forground_image,
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       forground_bounds.x(),
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       forground_bounds.y());
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  views::Painter::PaintFocusPainter(this, canvas, focus_painter());
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AlternateAppListButton::GetAccessibleState(
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ui::AXViewState* state) {
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  state->role = ui::AX_ROLE_BUTTON;
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  state->name = host_->GetAccessibleName(this);
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace ash
172