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/root_window_controller.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ash/session/session_state_delegate.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/shelf/shelf_constants.h" 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/shelf/shelf_delegate.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/shelf/shelf_model.h" 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/shelf/shelf_navigator.h" 168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ash/shelf/shelf_view.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_window_ids.h" 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/system/tray/system_tray_delegate.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/window.h" 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_observer.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" 31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia_operations.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/skbitmap_operations.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/accessible_pane_view.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget_delegate.h" 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/wm/core/easy_resize_window_targeter.h" 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/activation_client.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Size of black border at bottom (or side) of shelf. 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kNumBlackPixels = 3; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Alpha to paint dimming image with. 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kDimAlpha = 128; 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// The time to dim and un-dim. 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kTimeToDimMs = 3000; // Slow in dimming. 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kTimeToUnDimMs = 200; // Fast in activating. 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, 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::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) 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // ash::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: 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This class monitors mouse events to see if it is on top of the shelf. 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. 129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ash::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, 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::BACKGROUND_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_ ? 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ash::BACKGROUND_CHANGE_IMMEDIATE : ash::BACKGROUND_CHANGE_ANIMATE); 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DimmerView::ForceUndimming(bool force) { 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool previous = force_hovered_; 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) force_hovered_ = force; 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If the forced change does change the result we apply the change. 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (is_hovered_ || force_hovered_ != is_hovered_ || previous) 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetHovered(is_hovered_); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DimmerView::OnPaintBackground(gfx::Canvas* canvas) { 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkPaint paint; 178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::ImageSkia shelf_background = 180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *rb.GetImageNamed(IDR_ASH_SHELF_DIMMING).ToImageSkia(); 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (shelf_->GetAlignment() != ash::SHELF_ALIGNMENT_BOTTOM) { 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_background = gfx::ImageSkiaOperations::CreateRotatedImage( 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_background, 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) shelf_->shelf_layout_manager()->SelectValueForShelfAlignment( 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmapOperations::ROTATION_90_CW, 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmapOperations::ROTATION_90_CW, 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmapOperations::ROTATION_270_CW, 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkBitmapOperations::ROTATION_180_CW)); 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint.setAlpha(alpha_); 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) canvas->DrawImageInt(shelf_background, 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_background.width(), 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_background.height(), 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) width(), 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) height(), 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) paint); 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DimmerView::DimmerEventFilter::DimmerEventFilter(DimmerView* owner) 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : owner_(owner), 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mouse_inside_(false), 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_inside_(false) { 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::Shell::GetInstance()->AddPreTargetHandler(this); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DimmerView::DimmerEventFilter::~DimmerEventFilter() { 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ash::Shell::GetInstance()->RemovePreTargetHandler(this); 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DimmerView::DimmerEventFilter::OnMouseEvent(ui::MouseEvent* event) { 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (event->type() != ui::ET_MOUSE_MOVED && 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event->type() != ui::ET_MOUSE_DRAGGED) 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool inside = owner_->GetBoundsInScreen().Contains(event->root_location()); 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (mouse_inside_ || touch_inside_ != inside || touch_inside_) 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) owner_->SetHovered(inside || touch_inside_); 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mouse_inside_ = inside; 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DimmerView::DimmerEventFilter::OnTouchEvent(ui::TouchEvent* event) { 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool touch_inside = false; 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (event->type() != ui::ET_TOUCH_RELEASED && 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event->type() != ui::ET_TOUCH_CANCELLED) 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_inside = owner_->GetBoundsInScreen().Contains(event->root_location()); 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (mouse_inside_ || touch_inside_ != mouse_inside_ || touch_inside) 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) owner_->SetHovered(mouse_inside_ || touch_inside); 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_inside_ = touch_inside; 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochusing ash::ShelfLayoutManager; 2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// ShelfWindowTargeter makes it easier to resize windows with the mouse when the 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// window-edge slightly overlaps with the shelf edge. The targeter also makes it 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// easier to drag the shelf out with touch while it is hidden. 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ShelfWindowTargeter : public wm::EasyResizeWindowTargeter, 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public ash::ShelfLayoutManagerObserver { 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShelfWindowTargeter(aura::Window* container, 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShelfLayoutManager* shelf) 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : wm::EasyResizeWindowTargeter(container, gfx::Insets(), gfx::Insets()), 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_(shelf) { 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WillChangeVisibilityState(shelf_->visibility_state()); 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_->AddObserver(this); 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~ShelfWindowTargeter() { 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |shelf_| may have been destroyed by this time. 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (shelf_) 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_->RemoveObserver(this); 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Insets GetInsetsForAlignment(int distance, 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::ShelfAlignment alignment) { 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (alignment) { 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ash::SHELF_ALIGNMENT_BOTTOM: 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return gfx::Insets(distance, 0, 0, 0); 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ash::SHELF_ALIGNMENT_LEFT: 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return gfx::Insets(0, 0, 0, distance); 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ash::SHELF_ALIGNMENT_RIGHT: 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return gfx::Insets(0, distance, 0, 0); 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ash::SHELF_ALIGNMENT_TOP: 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return gfx::Insets(0, 0, distance, 0); 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return gfx::Insets(); 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ash::ShelfLayoutManagerObserver: 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void WillDeleteShelf() OVERRIDE { 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_ = NULL; 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void WillChangeVisibilityState( 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ash::ShelfVisibilityState new_state) OVERRIDE { 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Insets mouse_insets; 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Insets touch_insets; 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_state == ash::SHELF_VISIBLE) { 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Let clicks at the very top of the shelf through so windows can be 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // resized with the bottom-right corner and bottom edge. 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mouse_insets = GetInsetsForAlignment( 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShelfLayoutManager::kWorkspaceAreaVisibleInset, 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_->GetAlignment()); 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else if (new_state == ash::SHELF_AUTO_HIDE) { 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Extend the touch hit target out a bit to allow users to drag shelf out 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // while hidden. 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) touch_insets = GetInsetsForAlignment( 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) -ShelfLayoutManager::kWorkspaceAreaAutoHideInset, 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_->GetAlignment()); 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_mouse_extend(mouse_insets); 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_touch_extend(touch_insets); 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShelfLayoutManager* shelf_; 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ShelfWindowTargeter); 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ash { 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// The contents view of the Shelf. This view contains ShelfView and 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// sizes it to the width of the shelf minus the size of the status area. 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ShelfWidget::DelegateView : public views::WidgetDelegate, 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public views::AccessiblePaneView, 316c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public BackgroundAnimatorDelegate, 31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public aura::WindowObserver { 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit DelegateView(ShelfWidget* shelf); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~DelegateView(); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void set_focus_cycler(FocusCycler* focus_cycler) { 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_cycler_ = focus_cycler; 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FocusCycler* focus_cycler() { return focus_cycler_; } 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::Layer* opaque_background() { return &opaque_background_; } 3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::Layer* opaque_foreground() { return &opaque_foreground_; } 3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set if the shelf area is dimmed (eg when a window is maximized). 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetDimmed(bool dimmed); 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool GetDimmed() const; 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetParentLayer(ui::Layer* layer); 3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // views::View overrides: 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE; 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // views::WidgetDelegateView overrides: 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual views::Widget* GetWidget() OVERRIDE { 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return View::GetWidget(); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const views::Widget* GetWidget() const OVERRIDE { 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return View::GetWidget(); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool CanActivate() const OVERRIDE; 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE; 3497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void ReorderChildLayers(ui::Layer* parent_layer) OVERRIDE; 35058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This will be called when the parent local bounds change. 3517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnBoundsChanged(const gfx::Rect& old_bounds) OVERRIDE; 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // aura::WindowObserver overrides: 35458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // This will be called when the shelf itself changes its absolute position. 35558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Since the |dimmer_| panel needs to be placed in screen coordinates it needs 35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // to be repositioned. The difference to the OnBoundsChanged call above is 35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // that this gets also triggered when the shelf only moves. 35858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnWindowBoundsChanged(aura::Window* window, 35958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Rect& old_bounds, 36058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Rect& new_bounds) OVERRIDE; 36158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BackgroundAnimatorDelegate overrides: 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UpdateBackground(int alpha) OVERRIDE; 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Force the shelf to be presented in an undimmed state. 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ForceUndimming(bool force); 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A function to test the current alpha used by the dimming bar. If there is 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // no dimmer active, the function will return -1. 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int GetDimmingAlphaForTest(); 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // A function to test the bounds of the dimming bar. Returns gfx::Rect() if 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the dimmer is inactive. 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect GetDimmerBoundsForTest(); 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Disable dimming animations for running tests. This needs to be called 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // prior to the creation of of the |dimmer_|. 378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void disable_dimming_animations_for_test() { 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disable_dimming_animations_for_test_ = true; 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShelfWidget* shelf_; 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<views::Widget> dimmer_; 385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FocusCycler* focus_cycler_; 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int alpha_; 3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // A black background layer which is shown when a maximized window is visible. 3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::Layer opaque_background_; 3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // A black foreground layer which is shown while transitioning between users. 3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Note: Since the back- and foreground layers have different functions they 3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // can be used simultaneously - so no repurposing possible. 3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::Layer opaque_foreground_; 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The view which does the dimming. 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DimmerView* dimmer_view_; 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // True if dimming animations should be turned off. 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool disable_dimming_animations_for_test_; 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DelegateView); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShelfWidget::DelegateView::DelegateView(ShelfWidget* shelf) 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : shelf_(shelf), 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_cycler_(NULL), 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) alpha_(0), 4077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_(ui::LAYER_SOLID_COLOR), 4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) opaque_foreground_(ui::LAYER_SOLID_COLOR), 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_view_(NULL), 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disable_dimming_animations_for_test_(false) { 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) set_allow_deactivate_on_esc(true); 4127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_.SetColor(SK_ColorBLACK); 4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_.SetBounds(GetLocalBounds()); 4147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_.SetOpacity(0.0f); 4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) opaque_foreground_.SetColor(SK_ColorBLACK); 4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) opaque_foreground_.SetBounds(GetLocalBounds()); 4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) opaque_foreground_.SetOpacity(0.0f); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShelfWidget::DelegateView::~DelegateView() { 42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make sure that the dimmer goes away since it might have set an observer. 42258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SetDimmed(false); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::DelegateView::SetDimmed(bool value) { 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (value == (dimmer_.get() != NULL)) 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (value) { 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_.reset(new views::Widget); 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::InitParams params( 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params.activatable = views::Widget::InitParams::ACTIVATABLE_NO; 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.accept_events = false; 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.parent = shelf_->GetNativeView(); 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->Init(params); 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->GetNativeWindow()->SetName("ShelfDimmer"); 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->SetBounds(shelf_->GetWindowBoundsInScreen()); 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The shelf should not take focus when it is initially shown. 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->set_focus_on_creation(false); 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_view_ = new DimmerView(shelf_, disable_dimming_animations_for_test_); 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->SetContentsView(dimmer_view_); 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->GetNativeView()->SetName("ShelfDimmerView"); 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_->Show(); 44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shelf_->GetNativeView()->AddObserver(this); 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Some unit tests will come here with a destroyed window. 45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (shelf_->GetNativeView()) 45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) shelf_->GetNativeView()->RemoveObserver(this); 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_view_ = NULL; 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_.reset(NULL); 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ShelfWidget::DelegateView::GetDimmed() const { 458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return dimmer_.get() && dimmer_->IsVisible(); 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { 4627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer->Add(&opaque_background_); 4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) layer->Add(&opaque_foreground_); 4647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ReorderLayers(); 4657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::DelegateView::OnPaintBackground(gfx::Canvas* canvas) { 468c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::ImageSkia shelf_background = 470c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *rb.GetImageSkiaNamed(IDR_ASH_SHELF_BACKGROUND); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (SHELF_ALIGNMENT_BOTTOM != shelf_->GetAlignment()) 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_background = gfx::ImageSkiaOperations::CreateRotatedImage( 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_background, 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf_->shelf_layout_manager()->SelectValueForShelfAlignment( 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmapOperations::ROTATION_90_CW, 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmapOperations::ROTATION_90_CW, 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmapOperations::ROTATION_270_CW, 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmapOperations::ROTATION_180_CW)); 479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Rect dock_bounds(shelf_->shelf_layout_manager()->dock_bounds()); 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPaint paint; 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setAlpha(alpha_); 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) canvas->DrawImageInt(shelf_background, 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_background.width(), 4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_background.height(), 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (SHELF_ALIGNMENT_BOTTOM == shelf_->GetAlignment() && 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dock_bounds.x() == 0 && dock_bounds.width() > 0) 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ? dock_bounds.width() 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : 0, 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SHELF_ALIGNMENT_BOTTOM == shelf_->GetAlignment() 4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ? width() - dock_bounds.width() 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : width(), 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) height(), 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) paint); 498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (SHELF_ALIGNMENT_BOTTOM == shelf_->GetAlignment() && 499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) dock_bounds.width() > 0) { 500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The part of the shelf background that is in the corner below the docked 501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // windows close to the work area is an arched gradient that blends 502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // vertically oriented docked background and horizontal shelf. 503c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::ImageSkia shelf_corner = *rb.GetImageSkiaNamed(IDR_ASH_SHELF_CORNER); 504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (dock_bounds.x() == 0) { 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_corner = gfx::ImageSkiaOperations::CreateRotatedImage( 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_corner, SkBitmapOperations::ROTATION_90_CW); 507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) canvas->DrawImageInt( 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_corner, 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_corner.width(), 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_corner.height(), 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) dock_bounds.x() > 0 ? dock_bounds.x() : dock_bounds.width() - height(), 515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0, 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) height(), 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) height(), 518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) false, 519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) paint); 520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The part of the shelf background that is just below the docked windows 521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // is drawn using the last (lowest) 1-pixel tall strip of the image asset. 522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This avoids showing the border 3D shadow between the shelf and the dock. 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) canvas->DrawImageInt(shelf_background, 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_background.height() - 1, 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_background.width(), 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dock_bounds.x() > 0 ? dock_bounds.x() + height() : 0, 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dock_bounds.width() - height(), 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) height(), 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) paint); 534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect black_rect = 536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shelf_->shelf_layout_manager()->SelectValueForShelfAlignment( 537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect(0, height() - kNumBlackPixels, width(), kNumBlackPixels), 538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect(0, 0, kNumBlackPixels, height()), 539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect(width() - kNumBlackPixels, 0, kNumBlackPixels, height()), 540a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect(0, 0, width(), kNumBlackPixels)); 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(black_rect, SK_ColorBLACK); 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShelfWidget::DelegateView::CanActivate() const { 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow to activate as fallback. 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shelf_->activating_as_fallback_) 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow to activate from the focus cycler. 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (focus_cycler_ && focus_cycler_->widget_activating() == GetWidget()) 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Disallow activating in other cases, especially when using mouse. 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::DelegateView::Layout() { 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for(int i = 0; i < child_count(); ++i) { 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (shelf_->shelf_layout_manager()->IsHorizontalAlignment()) { 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_at(i)->SetBounds(child_at(i)->x(), child_at(i)->y(), 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_at(i)->width(), height()); 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child_at(i)->SetBounds(child_at(i)->x(), child_at(i)->y(), 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) width(), child_at(i)->height()); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ShelfWidget::DelegateView::ReorderChildLayers(ui::Layer* parent_layer) { 5687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch views::View::ReorderChildLayers(parent_layer); 5697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_layer->StackAtBottom(&opaque_background_); 5705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent_layer->StackAtTop(&opaque_foreground_); 5717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) { 5747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_.SetBounds(GetLocalBounds()); 5755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) opaque_foreground_.SetBounds(GetLocalBounds()); 5763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (dimmer_) 5773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) dimmer_->SetBounds(GetBoundsInScreen()); 5787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void ShelfWidget::DelegateView::OnWindowBoundsChanged( 58158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) aura::Window* window, 58258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Rect& old_bounds, 58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Rect& new_bounds) { 58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Coming here the shelf got repositioned and since the |dimmer_| is placed 58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // in screen coordinates and not relative to the parent it needs to be 58658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // repositioned accordingly. 58758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) dimmer_->SetBounds(GetBoundsInScreen()); 58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 58958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::DelegateView::ForceUndimming(bool force) { 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetDimmed()) 592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dimmer_view_->ForceUndimming(force); 593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int ShelfWidget::DelegateView::GetDimmingAlphaForTest() { 596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetDimmed()) 597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return dimmer_view_->get_dimming_alpha_for_test(); 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return -1; 599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Rect ShelfWidget::DelegateView::GetDimmerBoundsForTest() { 602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetDimmed()) 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return dimmer_view_->GetBoundsInScreen(); 604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Rect(); 605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::DelegateView::UpdateBackground(int alpha) { 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) alpha_ = alpha; 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SchedulePaint(); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)ShelfWidget::ShelfWidget(aura::Window* shelf_container, 6137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::Window* status_container, 614c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch WorkspaceController* workspace_controller) 6157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : delegate_view_(new DelegateView(this)), 6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) background_animator_(delegate_view_, 0, kShelfBackgroundAlpha), 6177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) activating_as_fallback_(false), 6187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) window_container_(shelf_container) { 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::InitParams params( 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.parent = shelf_container; 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.delegate = delegate_view_; 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Init(params); 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The shelf should not take focus when initially shown. 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_focus_on_creation(false); 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetContentsView(delegate_view_); 6307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch delegate_view_->SetParentLayer(GetLayer()); 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch status_area_widget_ = new StatusAreaWidget(status_container); 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_area_widget_->CreateTrayViews(); 634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (Shell::GetInstance()->session_state_delegate()-> 635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IsActiveUserSessionStarted()) { 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_area_widget_->Show(); 637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shell::GetInstance()->focus_cycler()->AddWidget(status_area_widget_); 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 640c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch shelf_layout_manager_ = new ShelfLayoutManager(this); 6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_layout_manager_->AddObserver(this); 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf_container->SetLayoutManager(shelf_layout_manager_); 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shelf_layout_manager_->set_workspace_controller(workspace_controller); 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) workspace_controller->SetShelf(shelf_layout_manager_); 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) status_container->SetLayoutManager( 6475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new StatusAreaLayoutManager(status_container, this)); 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_container->SetEventTargeter(scoped_ptr<ui::EventTargeter>(new 6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShelfWindowTargeter(shelf_container, shelf_layout_manager_))); 6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) status_container->SetEventTargeter(scoped_ptr<ui::EventTargeter>(new 6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShelfWindowTargeter(status_container, shelf_layout_manager_))); 6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::Widget::AddObserver(this); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShelfWidget::~ShelfWidget() { 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveObserver(this); 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::SetPaintsBackground( 6627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ShelfBackgroundType background_type, 663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) BackgroundAnimatorChangeType change_type) { 6647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ui::Layer* opaque_background = delegate_view_->opaque_background(); 6657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch float target_opacity = 6667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch (background_type == SHELF_BACKGROUND_MAXIMIZED) ? 1.0f : 0.0f; 6677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<ui::ScopedLayerAnimationSettings> opaque_background_animation; 668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (change_type != BACKGROUND_CHANGE_IMMEDIATE) { 6697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_animation.reset(new ui::ScopedLayerAnimationSettings( 6707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background->GetAnimator())); 6717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background_animation->SetTransitionDuration( 6727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::TimeDelta::FromMilliseconds(kTimeToSwitchBackgroundMs)); 6737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 6747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch opaque_background->SetOpacity(target_opacity); 6757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(mukai): use ui::Layer on both opaque_background and normal background 6777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // retire background_animator_ at all. It would be simpler. 678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // See also DockedBackgroundWidget::SetPaintsBackground. 6797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch background_animator_.SetPaintsBackground( 6807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch background_type != SHELF_BACKGROUND_DEFAULT, 6817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch change_type); 682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) delegate_view_->SchedulePaint(); 6837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 6847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6857dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochShelfBackgroundType ShelfWidget::GetBackgroundType() const { 6867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (delegate_view_->opaque_background()->GetTargetOpacity() == 1.0f) 6877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return SHELF_BACKGROUND_MAXIMIZED; 6887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (background_animator_.paints_background()) 6897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return SHELF_BACKGROUND_OVERLAP; 6907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return SHELF_BACKGROUND_DEFAULT; 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ShelfWidget::HideShelfBehindBlackBar(bool hide, int animation_time_ms) { 6955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (IsShelfHiddenBehindBlackBar() == hide) 6965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 6975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::Layer* opaque_foreground = delegate_view_->opaque_foreground(); 6995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) float target_opacity = hide ? 1.0f : 0.0f; 7005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<ui::ScopedLayerAnimationSettings> opaque_foreground_animation; 7015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) opaque_foreground_animation.reset(new ui::ScopedLayerAnimationSettings( 7025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) opaque_foreground->GetAnimator())); 7035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) opaque_foreground_animation->SetTransitionDuration( 7045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::TimeDelta::FromMilliseconds(animation_time_ms)); 7055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) opaque_foreground_animation->SetPreemptionStrategy( 7065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS); 7075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) opaque_foreground->SetOpacity(target_opacity); 7095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 7105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool ShelfWidget::IsShelfHiddenBehindBlackBar() const { 7125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return delegate_view_->opaque_foreground()->GetTargetOpacity() != 0.0f; 7135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 7145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// static 7163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool ShelfWidget::ShelfAlignmentAllowed() { 7171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (Shell::GetInstance()->system_tray_delegate()->IsUserSupervised()) 7181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 7191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) user::LoginStatus login_status = 7213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Shell::GetInstance()->system_tray_delegate()->GetUserLoginStatus(); 7223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 7233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) switch (login_status) { 7243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_USER: 7253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_OWNER: 7263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return true; 7273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_LOCKED: 7283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_PUBLIC: 7295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) case user::LOGGED_IN_SUPERVISED: 7303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_GUEST: 7313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_RETAIL_MODE: 7323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_KIOSK_APP: 7333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case user::LOGGED_IN_NONE: 7343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 7353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 7363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 7373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(false); 7383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 7393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 7403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ShelfAlignment ShelfWidget::GetAlignment() const { 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shelf_layout_manager_->GetAlignment(); 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::SetAlignment(ShelfAlignment alignment) { 7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (shelf_) 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_->SetAlignment(alignment); 74890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) status_area_widget_->SetShelfAlignment(alignment); 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->SchedulePaint(); 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::SetDimsShelf(bool dimming) { 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->SetDimmed(dimming); 754ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Repaint all children, allowing updates to reflect dimmed state eg: 755ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // status area background, app list button and overflow button. 7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (shelf_) 7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_->SchedulePaint(); 75846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) status_area_widget_->SchedulePaint(); 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShelfWidget::GetDimsShelf() const { 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_view_->GetDimmed(); 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShelfWidget::CreateShelf() { 7665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (shelf_) 767868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 769868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Shell* shell = Shell::GetInstance(); 770f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This needs to be called before shelf_model(). 771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ShelfDelegate* shelf_delegate = shell->GetShelfDelegate(); 772a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!shelf_delegate) 7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; // Not ready to create Shelf. 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_.reset( 7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new Shelf(shell->shelf_model(), shell->GetShelfDelegate(), this)); 777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetFocusCycler(shell->focus_cycler()); 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Inform the root window controller. 780c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch RootWindowController::ForWindow(window_container_)->OnShelfCreated(); 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_->SetVisible( 783868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) shell->session_state_delegate()->IsActiveUserSessionStarted()); 784eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch shelf_layout_manager_->LayoutShelf(); 785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Show(); 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ShelfWidget::IsShelfVisible() const { 7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return shelf_.get() && shelf_->IsVisible(); 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShelfWidget::SetShelfVisibility(bool visible) { 7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (shelf_) 7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_->SetVisible(visible); 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 797c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ShelfWidget::SetFocusCycler(FocusCycler* focus_cycler) { 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->set_focus_cycler(focus_cycler); 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (focus_cycler) 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_cycler->AddWidget(this); 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 803c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochFocusCycler* ShelfWidget::GetFocusCycler() { 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delegate_view_->focus_cycler(); 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::ShutdownStatusAreaWidget() { 808c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (status_area_widget_) 809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status_area_widget_->Shutdown(); 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status_area_widget_ = NULL; 811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 813c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::ForceUndimming(bool force) { 814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delegate_view_->ForceUndimming(force); 815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShelfWidget::OnWidgetActivationChanged(views::Widget* widget, 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool active) { 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) activating_as_fallback_ = false; 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (active) 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->SetPaneFocusAndFocusDefault(); 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_view_->GetFocusManager()->ClearFocus(); 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int ShelfWidget::GetDimmingAlphaForTest() { 827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_view_) 828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return delegate_view_->GetDimmingAlphaForTest(); 829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return -1; 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Rect ShelfWidget::GetDimmerBoundsForTest() { 833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_view_) 834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return delegate_view_->GetDimmerBoundsForTest(); 835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Rect(); 836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ShelfWidget::DisableDimmingAnimationsForTest() { 839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(delegate_view_); 840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return delegate_view_->disable_dimming_animations_for_test(); 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShelfWidget::WillDeleteShelf() { 8445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_layout_manager_->RemoveObserver(this); 8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shelf_layout_manager_ = NULL; 8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ash 849