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