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