alternate_app_list_button.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 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 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/ash_switches.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/launcher/launcher_button_host.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/launcher/launcher_types.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/shelf/shelf_layout_manager.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/shelf/shelf_widget.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/shell.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "grit/ash_resources.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "grit/ash_strings.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/accessibility/accessible_view_state.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/l10n/l10n_util.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/resource/resource_bundle.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/compositor/layer.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/compositor/layer_animation_element.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/compositor/layer_animation_sequence.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/compositor/scoped_layer_animation_settings.h" 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/canvas.h" 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/image/image_skia_operations.h" 249ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "ui/views/controls/button/image_button.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace ash { 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace internal { 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// static 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst int AlternateAppListButton::kImageBoundsSize = 7; 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochAlternateAppListButton::AlternateAppListButton(views::ButtonListener* listener, 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LauncherButtonHost* host, 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShelfWidget* shelf_widget) 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : views::ImageButton(listener), 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_(host), 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch shelf_widget_(shelf_widget) { 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetAccessibleName(l10n_util::GetStringUTF16(IDS_AURA_APP_LIST_TITLE)); 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetSize(gfx::Size(ShelfLayoutManager::kShelfSize, 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ShelfLayoutManager::kShelfSize)); 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochAlternateAppListButton::~AlternateAppListButton() { 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AlternateAppListButton::OnMousePressed(const ui::MouseEvent& event) { 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImageButton::OnMousePressed(event); 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_->PointerPressedOnButton(this, LauncherButtonHost::MOUSE, event); 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AlternateAppListButton::OnMouseReleased(const ui::MouseEvent& event) { 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImageButton::OnMouseReleased(event); 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_->PointerReleasedOnButton(this, LauncherButtonHost::MOUSE, false); 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AlternateAppListButton::OnMouseCaptureLost() { 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_->PointerReleasedOnButton(this, LauncherButtonHost::MOUSE, true); 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImageButton::OnMouseCaptureLost(); 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool AlternateAppListButton::OnMouseDragged(const ui::MouseEvent& event) { 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImageButton::OnMouseDragged(event); 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_->PointerDraggedOnButton(this, LauncherButtonHost::MOUSE, event); 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AlternateAppListButton::OnMouseMoved(const ui::MouseEvent& event) { 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImageButton::OnMouseMoved(event); 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_->MouseMovedOverButton(this); 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AlternateAppListButton::OnMouseEntered(const ui::MouseEvent& event) { 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImageButton::OnMouseEntered(event); 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_->MouseEnteredButton(this); 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AlternateAppListButton::OnMouseExited(const ui::MouseEvent& event) { 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImageButton::OnMouseExited(event); 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_->MouseExitedButton(this); 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void AlternateAppListButton::OnGestureEvent(ui::GestureEvent* event) { 8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) switch (event->type()) { 8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case ui::ET_GESTURE_SCROLL_BEGIN: 8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) host_->PointerPressedOnButton(this, LauncherButtonHost::TOUCH, *event); 8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) event->SetHandled(); 8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case ui::ET_GESTURE_SCROLL_UPDATE: 9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) host_->PointerDraggedOnButton(this, LauncherButtonHost::TOUCH, *event); 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) event->SetHandled(); 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case ui::ET_GESTURE_SCROLL_END: 9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case ui::ET_SCROLL_FLING_START: 9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) host_->PointerReleasedOnButton(this, LauncherButtonHost::TOUCH, false); 9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) event->SetHandled(); 9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) default: 10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ImageButton::OnGestureEvent(event); 10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AlternateAppListButton::OnPaint(gfx::Canvas* canvas) { 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Call the base class first to paint any background/borders. 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch View::OnPaint(canvas); 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int background_image_id = 0; 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (Shell::GetInstance()->GetAppListTargetVisibility()) { 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch background_image_id = IDR_AURA_NOTIFICATION_BACKGROUND_PRESSED; 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (shelf_widget_->GetDimsShelf()) 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch background_image_id = IDR_AURA_NOTIFICATION_BACKGROUND_ON_BLACK; 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch background_image_id = IDR_AURA_NOTIFICATION_BACKGROUND_NORMAL; 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::ImageSkia* background_image = 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch rb.GetImageNamed(background_image_id).ToImageSkia(); 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::ImageSkia* forground_image = 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch rb.GetImageNamed(IDR_AURA_LAUNCHER_ICON_APPLIST_ALTERNATE).ToImageSkia(); 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Rect contents_bounds = GetContentsBounds(); 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Rect background_bounds, forground_bounds; 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 127ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ShelfAlignment alignment = shelf_widget_->GetAlignment(); 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch background_bounds.set_size(background_image->size()); 129ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (alignment == SHELF_ALIGNMENT_LEFT) { 130ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch background_bounds.set_x(contents_bounds.width() - 131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ShelfLayoutManager::kShelfItemInset - background_image->width()); 132ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch background_bounds.set_y(contents_bounds.y() + 133ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch (contents_bounds.height() - background_image->height()) / 2); 134ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } else if(alignment == SHELF_ALIGNMENT_RIGHT) { 135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) background_bounds.set_x(ShelfLayoutManager::kShelfItemInset); 136ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch background_bounds.set_y(contents_bounds.y() + 137ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch (contents_bounds.height() - background_image->height()) / 2); 138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } else { 139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) background_bounds.set_y(ShelfLayoutManager::kShelfItemInset); 140ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch background_bounds.set_x(contents_bounds.x() + 141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch (contents_bounds.width() - background_image->width()) / 2); 142ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch forground_bounds.set_size(forground_image->size()); 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch forground_bounds.set_x(background_bounds.x() + 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::max(0, 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (background_bounds.width() - forground_bounds.width()) / 2)); 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch forground_bounds.set_y(background_bounds.y() + 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::max(0, 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (background_bounds.height() - forground_bounds.height()) / 2)); 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch canvas->DrawImageInt(*background_image, 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch background_bounds.x(), 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch background_bounds.y()); 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch canvas->DrawImageInt(*forground_image, 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch forground_bounds.x(), 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch forground_bounds.y()); 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnPaintFocusBorder(canvas); 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AlternateAppListButton::GetAccessibleState( 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::AccessibleViewState* state) { 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->role = ui::AccessibilityTypes::ROLE_PUSHBUTTON; 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch state->name = host_->GetAccessibleName(this); 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace internal 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace ash 170