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