shelf_widget.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ash/ash_switches.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/focus_cycler.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/launcher/launcher_delegate.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/launcher/launcher_model.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/launcher/launcher_navigator.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/launcher/launcher_view.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/root_window_controller.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/session_state_delegate.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_window_ids.h" 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/property_util.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/status_area_layout_manager.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/window_properties.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/workspace_controller.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_resources.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/activation_client.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/root_window.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_observer.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/layer.h" 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ui/compositor/scoped_layer_animation_settings.h" 32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/skbitmap_operations.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/accessible_pane_view.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget_delegate.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Size of black border at bottom (or side) of launcher. 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kNumBlackPixels = 3; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Alpha to paint dimming image with. 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kDimAlpha = 128; 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The time to dim and un-dim. 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kTimeToDimMs = 3000; // Slow in dimming. 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kTimeToUnDimMs = 200; // Fast in activating. 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst int kTimeToSwitchBackgroundMs = 1000; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Class used to slightly dim shelf items when maximized and visible. 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DimmerView : public views::View, 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public views::WidgetDelegate, 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::internal::BackgroundAnimatorDelegate { 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If |disable_dimming_animations_for_test| is set, all alpha animations will 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // be performed instantly. 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DimmerView(ash::ShelfWidget* shelf_widget, 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool disable_dimming_animations_for_test); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~DimmerView(); 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Called by |DimmerEventFilter| when the mouse |hovered| state changes. 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetHovered(bool hovered); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Force the dimmer to be undimmed. 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ForceUndimming(bool force); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // views::WidgetDelegate overrides: 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual views::Widget* GetWidget() OVERRIDE { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return View::GetWidget(); 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual const views::Widget* GetWidget() const OVERRIDE { 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return View::GetWidget(); 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // ash::internal::BackgroundAnimatorDelegate overrides: 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void UpdateBackground(int alpha) OVERRIDE { 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) alpha_ = alpha; 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SchedulePaint(); 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // views::View overrides: 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE; 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A function to test the current alpha used. 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int get_dimming_alpha_for_test() { return alpha_; } 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This class monitors mouse events to see if it is on top of the launcher. 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class DimmerEventFilter : public ui::EventHandler { 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit DimmerEventFilter(DimmerView* owner); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~DimmerEventFilter(); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Overridden from ui::EventHandler: 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The owning class. 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DimmerView* owner_; 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TRUE if the mouse is inside the shelf. 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool mouse_inside_; 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TRUE if a touch event is inside the shelf. 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool touch_inside_; 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DimmerEventFilter); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The owning shelf. 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::ShelfWidget* shelf_; 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The alpha to use for covering the shelf. 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int alpha_; 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // True if the event filter claims that we should not be dimmed. 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_hovered_; 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // True if someone forces us not to be dimmed (e.g. a menu is open). 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool force_hovered_; 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // True if animations should be suppressed for a test. 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool disable_dimming_animations_for_test_; 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The animator for the background transitions. 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::internal::BackgroundAnimator background_animator_; 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Notification of entering / exiting of the shelf area by mouse. 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<DimmerEventFilter> event_filter_; 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DimmerView); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DimmerView::DimmerView(ash::ShelfWidget* shelf_widget, 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool disable_dimming_animations_for_test) 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : shelf_(shelf_widget), 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) alpha_(kDimAlpha), 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_hovered_(false), 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) force_hovered_(false), 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disable_dimming_animations_for_test_(disable_dimming_animations_for_test), 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) background_animator_(this, 0, kDimAlpha) { 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event_filter_.reset(new DimmerEventFilter(this)); 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure it is undimmed at the beginning and then fire off the dimming 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // animation. 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) background_animator_.SetPaintsBackground(false, 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::internal::BackgroundAnimator::CHANGE_IMMEDIATE); 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetHovered(false); 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DimmerView::~DimmerView() { 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DimmerView::SetHovered(bool hovered) { 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Remember the hovered state so that we can correct the state once a 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // possible force state has disappeared. 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_hovered_ = hovered; 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Undimm also if we were forced to by e.g. an open menu. 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) hovered |= force_hovered_; 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) background_animator_.SetDuration(hovered ? kTimeToUnDimMs : kTimeToDimMs); 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) background_animator_.SetPaintsBackground(!hovered, 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disable_dimming_animations_for_test_ ? 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::internal::BackgroundAnimator::CHANGE_IMMEDIATE : 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::internal::BackgroundAnimator::CHANGE_ANIMATE); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DimmerView::ForceUndimming(bool force) { 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool previous = force_hovered_; 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) force_hovered_ = force; 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the forced change does change the result we apply the change. 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_hovered_ || force_hovered_ != is_hovered_ || previous) 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetHovered(is_hovered_); 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DimmerView::OnPaintBackground(gfx::Canvas* canvas) { 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkPaint paint; 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ImageSkia launcher_background = 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *rb.GetImageNamed(IDR_AURA_LAUNCHER_DIMMING).ToImageSkia(); 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (shelf_->GetAlignment() != ash::SHELF_ALIGNMENT_BOTTOM) { 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) launcher_background = gfx::ImageSkiaOperations::CreateRotatedImage( 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) launcher_background, 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shelf_->shelf_layout_manager()->SelectValueForShelfAlignment( 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmapOperations::ROTATION_90_CW, 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmapOperations::ROTATION_90_CW, 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmapOperations::ROTATION_270_CW, 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmapOperations::ROTATION_180_CW)); 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint.setAlpha(alpha_); 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) canvas->DrawImageInt( 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) launcher_background, 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, 0, launcher_background.width(), launcher_background.height(), 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, 0, width(), height(), 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint); 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DimmerView::DimmerEventFilter::DimmerEventFilter(DimmerView* owner) 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : owner_(owner), 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mouse_inside_(false), 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_inside_(false) { 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::Shell::GetInstance()->AddPreTargetHandler(this); 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DimmerView::DimmerEventFilter::~DimmerEventFilter() { 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::Shell::GetInstance()->RemovePreTargetHandler(this); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DimmerView::DimmerEventFilter::OnMouseEvent(ui::MouseEvent* event) { 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (event->type() != ui::ET_MOUSE_MOVED && 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event->type() != ui::ET_MOUSE_DRAGGED) 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool inside = owner_->GetBoundsInScreen().Contains(event->root_location()); 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (mouse_inside_ || touch_inside_ != inside || touch_inside_) 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) owner_->SetHovered(inside || touch_inside_); 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mouse_inside_ = inside; 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DimmerView::DimmerEventFilter::OnTouchEvent(ui::TouchEvent* event) { 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool touch_inside = false; 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (event->type() != ui::ET_TOUCH_RELEASED && 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event->type() != ui::ET_TOUCH_CANCELLED) 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_inside = owner_->GetBoundsInScreen().Contains(event->root_location()); 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (mouse_inside_ || touch_inside_ != mouse_inside_ || touch_inside) 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) owner_->SetHovered(mouse_inside_ || touch_inside); 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_inside_ = touch_inside; 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ash { 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The contents view of the Shelf. This view contains LauncherView and 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sizes it to the width of the shelf minus the size of the status area. 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ShelfWidget::DelegateView : public views::WidgetDelegate, 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public views::AccessiblePaneView, 24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public internal::BackgroundAnimatorDelegate, 24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public aura::WindowObserver { 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit DelegateView(ShelfWidget* shelf); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~DelegateView(); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_focus_cycler(internal::FocusCycler* focus_cycler) { 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_cycler_ = focus_cycler; 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::FocusCycler* focus_cycler() { 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return focus_cycler_; 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::Layer* opaque_background() { return &opaque_background_; } 2557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set if the shelf area is dimmed (eg when a window is maximized). 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetDimmed(bool dimmed); 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool GetDimmed() const; 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetParentLayer(ui::Layer* layer); 2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // views::View overrides: 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE; 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // views::WidgetDelegateView overrides: 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual views::Widget* GetWidget() OVERRIDE { 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return View::GetWidget(); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const views::Widget* GetWidget() const OVERRIDE { 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return View::GetWidget(); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool CanActivate() const OVERRIDE; 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE; 2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void ReorderChildLayers(ui::Layer* parent_layer) OVERRIDE; 27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This will be called when the parent local bounds change. 2777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnBoundsChanged(const gfx::Rect& old_bounds) OVERRIDE; 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // aura::WindowObserver overrides: 28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This will be called when the shelf itself changes its absolute position. 28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Since the |dimmer_| panel needs to be placed in screen coordinates it needs 28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // to be repositioned. The difference to the OnBoundsChanged call above is 28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // that this gets also triggered when the shelf only moves. 28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnWindowBoundsChanged(aura::Window* window, 28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Rect& old_bounds, 28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Rect& new_bounds) OVERRIDE; 28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BackgroundAnimatorDelegate overrides: 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UpdateBackground(int alpha) OVERRIDE; 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Force the shelf to be presented in an undimmed state. 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ForceUndimming(bool force); 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A function to test the current alpha used by the dimming bar. If there is 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // no dimmer active, the function will return -1. 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int GetDimmingAlphaForTest(); 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A function to test the bounds of the dimming bar. Returns gfx::Rect() if 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the dimmer is inactive. 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect GetDimmerBoundsForTest(); 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Disable dimming animations for running tests. This needs to be called 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // prior to the creation of of the |dimmer_|. 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void disable_dimming_animations_for_test() { 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disable_dimming_animations_for_test_ = true; 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShelfWidget* shelf_; 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<views::Widget> dimmer_; 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::FocusCycler* focus_cycler_; 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int alpha_; 3137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::Layer opaque_background_; 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The view which does the dimming. 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DimmerView* dimmer_view_; 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // True if dimming animations should be turned off. 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool disable_dimming_animations_for_test_; 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DelegateView); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShelfWidget::DelegateView::DelegateView(ShelfWidget* shelf) 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : shelf_(shelf), 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_cycler_(NULL), 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) alpha_(0), 3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_(ui::LAYER_SOLID_COLOR), 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_view_(NULL), 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disable_dimming_animations_for_test_(false) { 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) set_allow_deactivate_on_esc(true); 3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_.SetColor(SK_ColorBLACK); 3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_.SetBounds(GetLocalBounds()); 3347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_.SetOpacity(0.0f); 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShelfWidget::DelegateView::~DelegateView() { 33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make sure that the dimmer goes away since it might have set an observer. 33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetDimmed(false); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::DelegateView::SetDimmed(bool value) { 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (value == (dimmer_.get() != NULL)) 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (value) { 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_.reset(new views::Widget); 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::InitParams params( 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.can_activate = false; 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.accept_events = false; 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.parent = shelf_->GetNativeView(); 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->Init(params); 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->GetNativeWindow()->SetName("ShelfDimmer"); 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->SetBounds(shelf_->GetWindowBoundsInScreen()); 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The launcher should not take focus when it is initially shown. 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->set_focus_on_creation(false); 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_view_ = new DimmerView(shelf_, disable_dimming_animations_for_test_); 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->SetContentsView(dimmer_view_); 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->GetNativeView()->SetName("ShelfDimmerView"); 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->Show(); 36458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shelf_->GetNativeView()->AddObserver(this); 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Some unit tests will come here with a destroyed window. 36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (shelf_->GetNativeView()) 36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shelf_->GetNativeView()->RemoveObserver(this); 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_view_ = NULL; 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_.reset(NULL); 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShelfWidget::DelegateView::GetDimmed() const { 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return dimmer_.get() && dimmer_->IsVisible(); 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { 3797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer->Add(&opaque_background_); 3807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ReorderLayers(); 3817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::DelegateView::OnPaintBackground(gfx::Canvas* canvas) { 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ImageSkia launcher_background = 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *rb.GetImageSkiaNamed(IDR_AURA_LAUNCHER_BACKGROUND); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SHELF_ALIGNMENT_BOTTOM != shelf_->GetAlignment()) 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) launcher_background = gfx::ImageSkiaOperations::CreateRotatedImage( 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) launcher_background, 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf_->shelf_layout_manager()->SelectValueForShelfAlignment( 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmapOperations::ROTATION_90_CW, 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmapOperations::ROTATION_90_CW, 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmapOperations::ROTATION_270_CW, 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmapOperations::ROTATION_180_CW)); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect black_rect = 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf_->shelf_layout_manager()->SelectValueForShelfAlignment( 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, height() - kNumBlackPixels, width(), kNumBlackPixels), 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, kNumBlackPixels, height()), 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(width() - kNumBlackPixels, 0, kNumBlackPixels, height()), 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, width(), kNumBlackPixels)); 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPaint paint; 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setAlpha(alpha_); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->DrawImageInt( 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) launcher_background, 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 0, launcher_background.width(), launcher_background.height(), 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 0, width(), height(), 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(black_rect, SK_ColorBLACK); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShelfWidget::DelegateView::CanActivate() const { 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow to activate as fallback. 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shelf_->activating_as_fallback_) 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow to activate from the focus cycler. 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (focus_cycler_ && focus_cycler_->widget_activating() == GetWidget()) 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Disallow activating in other cases, especially when using mouse. 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::DelegateView::Layout() { 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for(int i = 0; i < child_count(); ++i) { 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shelf_->shelf_layout_manager()->IsHorizontalAlignment()) { 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_at(i)->SetBounds(child_at(i)->x(), child_at(i)->y(), 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_at(i)->width(), height()); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_at(i)->SetBounds(child_at(i)->x(), child_at(i)->y(), 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) width(), child_at(i)->height()); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ShelfWidget::DelegateView::ReorderChildLayers(ui::Layer* parent_layer) { 4387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch views::View::ReorderChildLayers(parent_layer); 4397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer->StackAtBottom(&opaque_background_); 4407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) { 4437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_.SetBounds(GetLocalBounds()); 4443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (dimmer_) 4453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) dimmer_->SetBounds(GetBoundsInScreen()); 4467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void ShelfWidget::DelegateView::OnWindowBoundsChanged( 44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) aura::Window* window, 45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Rect& old_bounds, 45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Rect& new_bounds) { 45258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Coming here the shelf got repositioned and since the |dimmer_| is placed 45358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // in screen coordinates and not relative to the parent it needs to be 45458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // repositioned accordingly. 45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) dimmer_->SetBounds(GetBoundsInScreen()); 45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::DelegateView::ForceUndimming(bool force) { 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetDimmed()) 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_view_->ForceUndimming(force); 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int ShelfWidget::DelegateView::GetDimmingAlphaForTest() { 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetDimmed()) 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return dimmer_view_->get_dimming_alpha_for_test(); 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return -1; 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Rect ShelfWidget::DelegateView::GetDimmerBoundsForTest() { 470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetDimmed()) 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return dimmer_view_->GetBoundsInScreen(); 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Rect(); 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::DelegateView::UpdateBackground(int alpha) { 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) alpha_ = alpha; 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SchedulePaint(); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)ShelfWidget::ShelfWidget(aura::Window* shelf_container, 4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::Window* status_container, 4827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) internal::WorkspaceController* workspace_controller) 4837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : delegate_view_(new DelegateView(this)), 4847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) background_animator_(delegate_view_, 0, kLauncherBackgroundAlpha), 4857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) activating_as_fallback_(false), 4867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_container_(shelf_container) { 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::InitParams params( 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.parent = shelf_container; 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.delegate = delegate_view_; 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Init(params); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The shelf should not take focus when initially shown. 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_focus_on_creation(false); 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetContentsView(delegate_view_); 4987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch delegate_view_->SetParentLayer(GetLayer()); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_area_widget_ = new internal::StatusAreaWidget(status_container); 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_area_widget_->CreateTrayViews(); 502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (Shell::GetInstance()->session_state_delegate()-> 503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IsActiveUserSessionStarted()) { 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_area_widget_->Show(); 505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->focus_cycler()->AddWidget(status_area_widget_); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf_layout_manager_ = new internal::ShelfLayoutManager(this); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf_container->SetLayoutManager(shelf_layout_manager_); 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf_layout_manager_->set_workspace_controller(workspace_controller); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) workspace_controller->SetShelf(shelf_layout_manager_); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_container->SetLayoutManager( 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new internal::StatusAreaLayoutManager(this)); 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::AddObserver(this); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShelfWidget::~ShelfWidget() { 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveObserver(this); 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::SetPaintsBackground( 5247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ShelfBackgroundType background_type, 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::BackgroundAnimator::ChangeType change_type) { 5267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::Layer* opaque_background = delegate_view_->opaque_background(); 5277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch float target_opacity = 5287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch (background_type == SHELF_BACKGROUND_MAXIMIZED) ? 1.0f : 0.0f; 5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<ui::ScopedLayerAnimationSettings> opaque_background_animation; 5307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (change_type != internal::BackgroundAnimator::CHANGE_IMMEDIATE) { 5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_animation.reset(new ui::ScopedLayerAnimationSettings( 5327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background->GetAnimator())); 5337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_animation->SetTransitionDuration( 5347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::TimeDelta::FromMilliseconds(kTimeToSwitchBackgroundMs)); 5357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 5367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background->SetOpacity(target_opacity); 5377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(mukai): use ui::Layer on both opaque_background and normal background 5397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // retire background_animator_ at all. It would be simpler. 5407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch background_animator_.SetPaintsBackground( 5417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch background_type != SHELF_BACKGROUND_DEFAULT, 5427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch change_type); 5437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5457dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochShelfBackgroundType ShelfWidget::GetBackgroundType() const { 5467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (delegate_view_->opaque_background()->GetTargetOpacity() == 1.0f) 5477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return SHELF_BACKGROUND_MAXIMIZED; 5487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (background_animator_.paints_background()) 5497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return SHELF_BACKGROUND_OVERLAP; 5507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return SHELF_BACKGROUND_DEFAULT; 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// static 5553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool ShelfWidget::ShelfAlignmentAllowed() { 5563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!ash::switches::ShowShelfAlignmentMenu()) 5573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 5583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) user::LoginStatus login_status = 5593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus(); 5603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) switch (login_status) { 5623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_USER: 5633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_OWNER: 5643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 5653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_LOCKED: 5663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_PUBLIC: 5673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_LOCALLY_MANAGED: 5683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_GUEST: 5693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_RETAIL_MODE: 5703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_KIOSK_APP: 5713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_NONE: 5723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 5733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 5743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(false); 5763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 5773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 5783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShelfAlignment ShelfWidget::GetAlignment() const { 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shelf_layout_manager_->GetAlignment(); 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::SetAlignment(ShelfAlignment alignment) { 58490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (launcher_) 58590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) launcher_->SetAlignment(alignment); 58690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) status_area_widget_->SetShelfAlignment(alignment); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->SchedulePaint(); 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::SetDimsShelf(bool dimming) { 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->SetDimmed(dimming); 592ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Repaint all children, allowing updates to reflect dimmed state eg: 593ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // status area background, app list button and overflow button. 594eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (launcher_) 595ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch launcher_->SchedulePaint(); 5967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch status_area_widget_->GetContentsView()->SchedulePaint(); 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShelfWidget::GetDimsShelf() const { 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_view_->GetDimmed(); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::CreateLauncher() { 604868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (launcher_) 605868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Shell* shell = Shell::GetInstance(); 608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This needs to be called before launcher_model(). 609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LauncherDelegate* launcher_delegate = shell->GetLauncherDelegate(); 610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!launcher_delegate) 611868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; // Not ready to create Launcher 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) launcher_.reset(new Launcher(shell->launcher_model(), 614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) shell->GetLauncherDelegate(), 615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) this)); 616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetFocusCycler(shell->focus_cycler()); 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Inform the root window controller. 619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) internal::RootWindowController::ForWindow(window_container_)-> 620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnLauncherCreated(); 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) launcher_->SetVisible( 623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) shell->session_state_delegate()->IsActiveUserSessionStarted()); 624eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch shelf_layout_manager_->LayoutShelf(); 625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Show(); 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShelfWidget::IsLauncherVisible() const { 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return launcher_.get() && launcher_->IsVisible(); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::SetLauncherVisibility(bool visible) { 633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (launcher_) 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) launcher_->SetVisible(visible); 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::SetFocusCycler(internal::FocusCycler* focus_cycler) { 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->set_focus_cycler(focus_cycler); 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (focus_cycler) 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_cycler->AddWidget(this); 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)internal::FocusCycler* ShelfWidget::GetFocusCycler() { 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_view_->focus_cycler(); 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::ShutdownStatusAreaWidget() { 648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (status_area_widget_) 649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status_area_widget_->Shutdown(); 650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status_area_widget_ = NULL; 651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::ForceUndimming(bool force) { 654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delegate_view_->ForceUndimming(force); 655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::OnWidgetActivationChanged(views::Widget* widget, 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool active) { 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) activating_as_fallback_ = false; 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active) 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->SetPaneFocusAndFocusDefault(); 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->GetFocusManager()->ClearFocus(); 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int ShelfWidget::GetDimmingAlphaForTest() { 667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_view_) 668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return delegate_view_->GetDimmingAlphaForTest(); 669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return -1; 670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Rect ShelfWidget::GetDimmerBoundsForTest() { 673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_view_) 674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return delegate_view_->GetDimmerBoundsForTest(); 675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Rect(); 676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::DisableDimmingAnimationsForTest() { 679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(delegate_view_); 680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return delegate_view_->disable_dimming_animations_for_test(); 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ash 684