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) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/focus_cycler.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/launcher/launcher_delegate.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/launcher/launcher_model.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/launcher/launcher_navigator.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/launcher/launcher_view.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/root_window_controller.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/session_state_delegate.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_window_ids.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/property_util.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/status_area_layout_manager.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/window_properties.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/workspace_controller.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/ash_resources.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/activation_client.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/root_window.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_observer.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/events/event_constants.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/layer.h" 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ui/compositor/scoped_layer_animation_settings.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/skbitmap_operations.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/accessible_pane_view.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget_delegate.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Size of black border at bottom (or side) of launcher. 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kNumBlackPixels = 3; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Alpha to paint dimming image with. 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kDimAlpha = 128; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The time to dim and un-dim. 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kTimeToDimMs = 3000; // Slow in dimming. 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kTimeToUnDimMs = 200; // Fast in activating. 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst int kTimeToSwitchBackgroundMs = 1000; 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Class used to slightly dim shelf items when maximized and visible. 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class DimmerView : public views::View, 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public views::WidgetDelegate, 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::internal::BackgroundAnimatorDelegate { 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If |disable_dimming_animations_for_test| is set, all alpha animations will 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // be performed instantly. 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DimmerView(ash::ShelfWidget* shelf_widget, 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool disable_dimming_animations_for_test); 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~DimmerView(); 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Called by |DimmerEventFilter| when the mouse |hovered| state changes. 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetHovered(bool hovered); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Force the dimmer to be undimmed. 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ForceUndimming(bool force); 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // views::WidgetDelegate overrides: 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual views::Widget* GetWidget() OVERRIDE { 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return View::GetWidget(); 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual const views::Widget* GetWidget() const OVERRIDE { 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return View::GetWidget(); 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // ash::internal::BackgroundAnimatorDelegate overrides: 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void UpdateBackground(int alpha) OVERRIDE { 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) alpha_ = alpha; 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SchedulePaint(); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // views::View overrides: 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A function to test the current alpha used. 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int get_dimming_alpha_for_test() { return alpha_; } 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This class monitors mouse events to see if it is on top of the launcher. 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class DimmerEventFilter : public ui::EventHandler { 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit DimmerEventFilter(DimmerView* owner); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~DimmerEventFilter(); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Overridden from ui::EventHandler: 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The owning class. 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DimmerView* owner_; 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TRUE if the mouse is inside the shelf. 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool mouse_inside_; 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TRUE if a touch event is inside the shelf. 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool touch_inside_; 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DimmerEventFilter); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The owning shelf. 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::ShelfWidget* shelf_; 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The alpha to use for covering the shelf. 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int alpha_; 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // True if the event filter claims that we should not be dimmed. 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_hovered_; 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // True if someone forces us not to be dimmed (e.g. a menu is open). 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool force_hovered_; 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // True if animations should be suppressed for a test. 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool disable_dimming_animations_for_test_; 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The animator for the background transitions. 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::internal::BackgroundAnimator background_animator_; 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Notification of entering / exiting of the shelf area by mouse. 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<DimmerEventFilter> event_filter_; 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DimmerView); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DimmerView::DimmerView(ash::ShelfWidget* shelf_widget, 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool disable_dimming_animations_for_test) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : shelf_(shelf_widget), 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) alpha_(kDimAlpha), 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_hovered_(false), 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) force_hovered_(false), 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disable_dimming_animations_for_test_(disable_dimming_animations_for_test), 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) background_animator_(this, 0, kDimAlpha) { 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event_filter_.reset(new DimmerEventFilter(this)); 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make sure it is undimmed at the beginning and then fire off the dimming 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // animation. 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) background_animator_.SetPaintsBackground(false, 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::internal::BackgroundAnimator::CHANGE_IMMEDIATE); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetHovered(false); 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DimmerView::~DimmerView() { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DimmerView::SetHovered(bool hovered) { 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Remember the hovered state so that we can correct the state once a 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // possible force state has disappeared. 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_hovered_ = hovered; 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Undimm also if we were forced to by e.g. an open menu. 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) hovered |= force_hovered_; 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) background_animator_.SetDuration(hovered ? kTimeToUnDimMs : kTimeToDimMs); 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) background_animator_.SetPaintsBackground(!hovered, 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disable_dimming_animations_for_test_ ? 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::internal::BackgroundAnimator::CHANGE_IMMEDIATE : 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::internal::BackgroundAnimator::CHANGE_ANIMATE); 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DimmerView::ForceUndimming(bool force) { 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool previous = force_hovered_; 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) force_hovered_ = force; 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the forced change does change the result we apply the change. 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_hovered_ || force_hovered_ != is_hovered_ || previous) 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetHovered(is_hovered_); 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DimmerView::OnPaintBackground(gfx::Canvas* canvas) { 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkPaint paint; 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ImageSkia launcher_background = 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *rb.GetImageNamed(IDR_AURA_LAUNCHER_DIMMING).ToImageSkia(); 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (shelf_->GetAlignment() != ash::SHELF_ALIGNMENT_BOTTOM) { 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) launcher_background = gfx::ImageSkiaOperations::CreateRotatedImage( 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) launcher_background, 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shelf_->shelf_layout_manager()->SelectValueForShelfAlignment( 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmapOperations::ROTATION_90_CW, 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmapOperations::ROTATION_90_CW, 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmapOperations::ROTATION_270_CW, 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmapOperations::ROTATION_180_CW)); 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint.setAlpha(alpha_); 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) canvas->DrawImageInt( 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) launcher_background, 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, 0, launcher_background.width(), launcher_background.height(), 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, 0, width(), height(), 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint); 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DimmerView::DimmerEventFilter::DimmerEventFilter(DimmerView* owner) 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : owner_(owner), 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mouse_inside_(false), 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_inside_(false) { 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::Shell::GetInstance()->AddPreTargetHandler(this); 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DimmerView::DimmerEventFilter::~DimmerEventFilter() { 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::Shell::GetInstance()->RemovePreTargetHandler(this); 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DimmerView::DimmerEventFilter::OnMouseEvent(ui::MouseEvent* event) { 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (event->type() != ui::ET_MOUSE_MOVED && 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event->type() != ui::ET_MOUSE_DRAGGED) 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool inside = owner_->GetBoundsInScreen().Contains(event->root_location()); 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (mouse_inside_ || touch_inside_ != inside || touch_inside_) 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) owner_->SetHovered(inside || touch_inside_); 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mouse_inside_ = inside; 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DimmerView::DimmerEventFilter::OnTouchEvent(ui::TouchEvent* event) { 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool touch_inside = false; 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (event->type() != ui::ET_TOUCH_RELEASED && 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event->type() != ui::ET_TOUCH_CANCELLED) 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_inside = owner_->GetBoundsInScreen().Contains(event->root_location()); 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (mouse_inside_ || touch_inside_ != mouse_inside_ || touch_inside) 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) owner_->SetHovered(mouse_inside_ || touch_inside); 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_inside_ = touch_inside; 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ash { 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The contents view of the Shelf. This view contains LauncherView and 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sizes it to the width of the shelf minus the size of the status area. 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ShelfWidget::DelegateView : public views::WidgetDelegate, 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public views::AccessiblePaneView, 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public internal::BackgroundAnimatorDelegate { 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit DelegateView(ShelfWidget* shelf); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~DelegateView(); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_focus_cycler(internal::FocusCycler* focus_cycler) { 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_cycler_ = focus_cycler; 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::FocusCycler* focus_cycler() { 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return focus_cycler_; 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::Layer* opaque_background() { return &opaque_background_; } 2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set if the shelf area is dimmed (eg when a window is maximized). 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetDimmed(bool dimmed); 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool GetDimmed() const; 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set the bounds of the widget. 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetWidgetBounds(const gfx::Rect bounds); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (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; 2767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnBoundsChanged(const gfx::Rect& old_bounds) OVERRIDE; 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BackgroundAnimatorDelegate overrides: 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UpdateBackground(int alpha) OVERRIDE; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Force the shelf to be presented in an undimmed state. 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ForceUndimming(bool force); 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A function to test the current alpha used by the dimming bar. If there is 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // no dimmer active, the function will return -1. 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int GetDimmingAlphaForTest(); 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A function to test the bounds of the dimming bar. Returns gfx::Rect() if 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the dimmer is inactive. 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect GetDimmerBoundsForTest(); 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Disable dimming animations for running tests. This needs to be called 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // prior to the creation of of the |dimmer_|. 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void disable_dimming_animations_for_test() { 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disable_dimming_animations_for_test_ = true; 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShelfWidget* shelf_; 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<views::Widget> dimmer_; 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::FocusCycler* focus_cycler_; 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int alpha_; 3037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::Layer opaque_background_; 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The view which does the dimming. 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DimmerView* dimmer_view_; 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // True if dimming animations should be turned off. 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool disable_dimming_animations_for_test_; 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DelegateView); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShelfWidget::DelegateView::DelegateView(ShelfWidget* shelf) 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : shelf_(shelf), 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_cycler_(NULL), 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) alpha_(0), 3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_(ui::LAYER_SOLID_COLOR), 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_view_(NULL), 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disable_dimming_animations_for_test_(false) { 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) set_allow_deactivate_on_esc(true); 3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_.SetColor(SK_ColorBLACK); 3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_.SetBounds(GetLocalBounds()); 3247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_.SetOpacity(0.0f); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShelfWidget::DelegateView::~DelegateView() { 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::DelegateView::SetDimmed(bool value) { 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (value == (dimmer_.get() != NULL)) 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (value) { 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_.reset(new views::Widget); 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::InitParams params( 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.can_activate = false; 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.accept_events = false; 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.parent = shelf_->GetNativeView(); 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->Init(params); 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->GetNativeWindow()->SetName("ShelfDimmer"); 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->SetBounds(shelf_->GetWindowBoundsInScreen()); 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The launcher should not take focus when it is initially shown. 347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->set_focus_on_creation(false); 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_view_ = new DimmerView(shelf_, disable_dimming_animations_for_test_); 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->SetContentsView(dimmer_view_); 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->GetNativeView()->SetName("ShelfDimmerView"); 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->Show(); 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_view_ = NULL; 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_.reset(NULL); 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShelfWidget::DelegateView::GetDimmed() const { 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return dimmer_.get() && dimmer_->IsVisible(); 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::DelegateView::SetWidgetBounds(const gfx::Rect bounds) { 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (dimmer_) 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->SetBounds(bounds); 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { 3687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer->Add(&opaque_background_); 3697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ReorderLayers(); 3707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::DelegateView::OnPaintBackground(gfx::Canvas* canvas) { 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ImageSkia launcher_background = 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *rb.GetImageSkiaNamed(IDR_AURA_LAUNCHER_BACKGROUND); 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SHELF_ALIGNMENT_BOTTOM != shelf_->GetAlignment()) 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) launcher_background = gfx::ImageSkiaOperations::CreateRotatedImage( 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) launcher_background, 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf_->shelf_layout_manager()->SelectValueForShelfAlignment( 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmapOperations::ROTATION_90_CW, 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmapOperations::ROTATION_90_CW, 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmapOperations::ROTATION_270_CW, 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmapOperations::ROTATION_180_CW)); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect black_rect = 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf_->shelf_layout_manager()->SelectValueForShelfAlignment( 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, height() - kNumBlackPixels, width(), kNumBlackPixels), 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, kNumBlackPixels, height()), 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(width() - kNumBlackPixels, 0, kNumBlackPixels, height()), 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(0, 0, width(), kNumBlackPixels)); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPaint paint; 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setAlpha(alpha_); 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->DrawImageInt( 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) launcher_background, 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 0, launcher_background.width(), launcher_background.height(), 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 0, width(), height(), 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint); 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(black_rect, SK_ColorBLACK); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShelfWidget::DelegateView::CanActivate() const { 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow to activate as fallback. 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shelf_->activating_as_fallback_) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow to activate from the focus cycler. 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (focus_cycler_ && focus_cycler_->widget_activating() == GetWidget()) 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Disallow activating in other cases, especially when using mouse. 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::DelegateView::Layout() { 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for(int i = 0; i < child_count(); ++i) { 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shelf_->shelf_layout_manager()->IsHorizontalAlignment()) { 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_at(i)->SetBounds(child_at(i)->x(), child_at(i)->y(), 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_at(i)->width(), height()); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_at(i)->SetBounds(child_at(i)->x(), child_at(i)->y(), 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) width(), child_at(i)->height()); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ShelfWidget::DelegateView::ReorderChildLayers(ui::Layer* parent_layer) { 4277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch views::View::ReorderChildLayers(parent_layer); 4287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer->StackAtBottom(&opaque_background_); 4297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) { 4327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_.SetBounds(GetLocalBounds()); 4337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::DelegateView::ForceUndimming(bool force) { 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetDimmed()) 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_view_->ForceUndimming(force); 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int ShelfWidget::DelegateView::GetDimmingAlphaForTest() { 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetDimmed()) 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return dimmer_view_->get_dimming_alpha_for_test(); 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return -1; 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Rect ShelfWidget::DelegateView::GetDimmerBoundsForTest() { 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetDimmed()) 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return dimmer_view_->GetBoundsInScreen(); 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Rect(); 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::DelegateView::UpdateBackground(int alpha) { 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) alpha_ = alpha; 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SchedulePaint(); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)ShelfWidget::ShelfWidget(aura::Window* shelf_container, 4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::Window* status_container, 4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) internal::WorkspaceController* workspace_controller) 4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : delegate_view_(new DelegateView(this)), 4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) background_animator_(delegate_view_, 0, kLauncherBackgroundAlpha), 4627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) activating_as_fallback_(false), 4637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_container_(shelf_container) { 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::InitParams params( 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.parent = shelf_container; 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.delegate = delegate_view_; 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Init(params); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The shelf should not take focus when initially shown. 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_focus_on_creation(false); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetContentsView(delegate_view_); 4757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch delegate_view_->SetParentLayer(GetLayer()); 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_area_widget_ = new internal::StatusAreaWidget(status_container); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_area_widget_->CreateTrayViews(); 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (Shell::GetInstance()->session_state_delegate()-> 480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IsActiveUserSessionStarted()) { 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_area_widget_->Show(); 482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->focus_cycler()->AddWidget(status_area_widget_); 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf_layout_manager_ = new internal::ShelfLayoutManager(this); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf_container->SetLayoutManager(shelf_layout_manager_); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf_layout_manager_->set_workspace_controller(workspace_controller); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) workspace_controller->SetShelf(shelf_layout_manager_); 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_container->SetLayoutManager( 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new internal::StatusAreaLayoutManager(this)); 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::AddObserver(this); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShelfWidget::~ShelfWidget() { 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveObserver(this); 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::SetPaintsBackground( 5017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ShelfBackgroundType background_type, 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::BackgroundAnimator::ChangeType change_type) { 5037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::Layer* opaque_background = delegate_view_->opaque_background(); 5047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch float target_opacity = 5057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch (background_type == SHELF_BACKGROUND_MAXIMIZED) ? 1.0f : 0.0f; 5067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<ui::ScopedLayerAnimationSettings> opaque_background_animation; 5077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (change_type != internal::BackgroundAnimator::CHANGE_IMMEDIATE) { 5087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_animation.reset(new ui::ScopedLayerAnimationSettings( 5097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background->GetAnimator())); 5107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_animation->SetTransitionDuration( 5117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::TimeDelta::FromMilliseconds(kTimeToSwitchBackgroundMs)); 5127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 5137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background->SetOpacity(target_opacity); 5147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(mukai): use ui::Layer on both opaque_background and normal background 5167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // retire background_animator_ at all. It would be simpler. 5177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch background_animator_.SetPaintsBackground( 5187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch background_type != SHELF_BACKGROUND_DEFAULT, 5197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch change_type); 5207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5227dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochShelfBackgroundType ShelfWidget::GetBackgroundType() const { 5237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (delegate_view_->opaque_background()->GetTargetOpacity() == 1.0f) 5247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return SHELF_BACKGROUND_MAXIMIZED; 5257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (background_animator_.paints_background()) 5267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return SHELF_BACKGROUND_OVERLAP; 5277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return SHELF_BACKGROUND_DEFAULT; 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShelfAlignment ShelfWidget::GetAlignment() const { 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shelf_layout_manager_->GetAlignment(); 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::SetAlignment(ShelfAlignment alignment) { 53690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (launcher_) 53790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) launcher_->SetAlignment(alignment); 53890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) status_area_widget_->SetShelfAlignment(alignment); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->SchedulePaint(); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::SetDimsShelf(bool dimming) { 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->SetDimmed(dimming); 5444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // Repaint all children, allowing updates to reflect dimmed state eg: 5454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // status area background, app list button and overflow button. 546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (launcher_) 5474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch launcher_->SchedulePaint(); 5487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch status_area_widget_->GetContentsView()->SchedulePaint(); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShelfWidget::GetDimsShelf() const { 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_view_->GetDimmed(); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::CreateLauncher() { 556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (launcher_) 557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Shell* shell = Shell::GetInstance(); 560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // This needs to be called before launcher_model(). 561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LauncherDelegate* launcher_delegate = shell->GetLauncherDelegate(); 562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!launcher_delegate) 563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; // Not ready to create Launcher 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) launcher_.reset(new Launcher(shell->launcher_model(), 566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) shell->GetLauncherDelegate(), 567868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) this)); 568868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetFocusCycler(shell->focus_cycler()); 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 570868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Inform the root window controller. 571868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) internal::RootWindowController::ForWindow(window_container_)-> 572868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OnLauncherCreated(); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 574868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) launcher_->SetVisible( 575868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) shell->session_state_delegate()->IsActiveUserSessionStarted()); 576eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch shelf_layout_manager_->LayoutShelf(); 577868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Show(); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShelfWidget::IsLauncherVisible() const { 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return launcher_.get() && launcher_->IsVisible(); 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::SetLauncherVisibility(bool visible) { 585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (launcher_) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) launcher_->SetVisible(visible); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::SetFocusCycler(internal::FocusCycler* focus_cycler) { 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->set_focus_cycler(focus_cycler); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (focus_cycler) 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_cycler->AddWidget(this); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)internal::FocusCycler* ShelfWidget::GetFocusCycler() { 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_view_->focus_cycler(); 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::ShutdownStatusAreaWidget() { 600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (status_area_widget_) 601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status_area_widget_->Shutdown(); 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status_area_widget_ = NULL; 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::SetWidgetBounds(const gfx::Rect& rect) { 606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Widget::SetBounds(rect); 607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delegate_view_->SetWidgetBounds(rect); 608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::ForceUndimming(bool force) { 611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delegate_view_->ForceUndimming(force); 612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::OnWidgetActivationChanged(views::Widget* widget, 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool active) { 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) activating_as_fallback_ = false; 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active) 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->SetPaneFocusAndFocusDefault(); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->GetFocusManager()->ClearFocus(); 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int ShelfWidget::GetDimmingAlphaForTest() { 624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_view_) 625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return delegate_view_->GetDimmingAlphaForTest(); 626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return -1; 627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Rect ShelfWidget::GetDimmerBoundsForTest() { 630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_view_) 631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return delegate_view_->GetDimmerBoundsForTest(); 632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Rect(); 633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::DisableDimmingAnimationsForTest() { 636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(delegate_view_); 637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return delegate_view_->disable_dimming_animations_for_test(); 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ash 641