OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/launcher/launcher.h" | 5 #include "ash/launcher/launcher.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #include "ash/focus_cycler.h" | 10 #include "ash/focus_cycler.h" |
11 #include "ash/launcher/launcher_delegate.h" | 11 #include "ash/launcher/launcher_delegate.h" |
12 #include "ash/launcher/launcher_model.h" | 12 #include "ash/launcher/launcher_model.h" |
13 #include "ash/launcher/launcher_navigator.h" | 13 #include "ash/launcher/launcher_navigator.h" |
14 #include "ash/launcher/launcher_view.h" | 14 #include "ash/launcher/launcher_view.h" |
15 #include "ash/root_window_controller.h" | 15 #include "ash/root_window_controller.h" |
16 #include "ash/shell.h" | 16 #include "ash/shell.h" |
17 #include "ash/shell_delegate.h" | 17 #include "ash/shell_delegate.h" |
18 #include "ash/shell_window_ids.h" | 18 #include "ash/shell_window_ids.h" |
| 19 #include "ash/wm/property_util.h" |
19 #include "ash/wm/shelf_layout_manager.h" | 20 #include "ash/wm/shelf_layout_manager.h" |
20 #include "ash/wm/window_properties.h" | 21 #include "ash/wm/window_properties.h" |
21 #include "grit/ash_resources.h" | 22 #include "grit/ash_resources.h" |
22 #include "ui/aura/client/activation_client.h" | 23 #include "ui/aura/client/activation_client.h" |
23 #include "ui/aura/root_window.h" | 24 #include "ui/aura/root_window.h" |
24 #include "ui/aura/window.h" | 25 #include "ui/aura/window.h" |
25 #include "ui/aura/window_observer.h" | 26 #include "ui/aura/window_observer.h" |
26 #include "ui/base/resource/resource_bundle.h" | 27 #include "ui/base/resource/resource_bundle.h" |
27 #include "ui/compositor/layer.h" | 28 #include "ui/compositor/layer.h" |
28 #include "ui/gfx/canvas.h" | 29 #include "ui/gfx/canvas.h" |
29 #include "ui/gfx/image/image.h" | 30 #include "ui/gfx/image/image.h" |
| 31 #include "ui/gfx/image/image_skia_operations.h" |
| 32 #include "ui/gfx/skbitmap_operations.h" |
30 #include "ui/views/accessible_pane_view.h" | 33 #include "ui/views/accessible_pane_view.h" |
31 #include "ui/views/widget/widget.h" | 34 #include "ui/views/widget/widget.h" |
32 #include "ui/views/widget/widget_delegate.h" | 35 #include "ui/views/widget/widget_delegate.h" |
33 | 36 |
34 namespace { | 37 namespace { |
35 // Size of black border at bottom (or side) of launcher. | 38 // Size of black border at bottom (or side) of launcher. |
36 const int kNumBlackPixels = 3; | 39 const int kNumBlackPixels = 3; |
37 // Alpha to paint dimming image with. | 40 // Alpha to paint dimming image with. |
38 const int kDimAlpha = 96; | 41 const int kDimAlpha = 96; |
39 } | 42 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 Launcher* launcher_; | 89 Launcher* launcher_; |
87 internal::FocusCycler* focus_cycler_; | 90 internal::FocusCycler* focus_cycler_; |
88 int alpha_; | 91 int alpha_; |
89 | 92 |
90 DISALLOW_COPY_AND_ASSIGN(DelegateView); | 93 DISALLOW_COPY_AND_ASSIGN(DelegateView); |
91 }; | 94 }; |
92 | 95 |
93 // Class used to slightly dim shelf items when maximized and visible. It also | 96 // Class used to slightly dim shelf items when maximized and visible. It also |
94 // makes sure the widget changes size to always be of the same size as the | 97 // makes sure the widget changes size to always be of the same size as the |
95 // shelf. | 98 // shelf. |
96 class DimmerView : public views::WidgetDelegateView, | 99 class Launcher::DimmerView : public views::WidgetDelegateView, |
97 public aura::WindowObserver { | 100 public aura::WindowObserver { |
98 public: | 101 public: |
99 explicit DimmerView(views::Widget* launcher) | 102 explicit DimmerView(Launcher* launcher) |
100 : launcher_(launcher) { | 103 : launcher_(launcher) { |
101 launcher_->GetNativeWindow()->AddObserver(this); | 104 launcher_->widget()->GetNativeWindow()->AddObserver(this); |
102 } | 105 } |
103 | 106 |
104 ~DimmerView() { | 107 ~DimmerView() { |
105 if (launcher_) | 108 if (launcher_) |
106 launcher_->GetNativeWindow()->RemoveObserver(this); | 109 launcher_->widget()->GetNativeWindow()->RemoveObserver(this); |
107 } | 110 } |
108 | 111 |
109 private: | 112 private: |
110 // views::View overrides: | 113 // views::View overrides: |
111 virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE { | 114 virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE { |
112 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 115 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
113 const gfx::ImageSkia* launcher_background = rb.GetImageSkiaNamed( | 116 gfx::ImageSkia background_image = |
114 internal::ShelfLayoutManager::ForLauncher( | 117 *rb.GetImageSkiaNamed(IDR_AURA_LAUNCHER_DIMMING); |
115 launcher_->GetNativeView())-> | 118 if (SHELF_ALIGNMENT_BOTTOM != launcher_->alignment_) |
116 SelectValueForShelfAlignment(IDR_AURA_LAUNCHER_DIMMING_BOTTOM, | 119 background_image = gfx::ImageSkiaOperations::CreateRotatedImage( |
117 IDR_AURA_LAUNCHER_DIMMING_LEFT, | 120 background_image, |
118 IDR_AURA_LAUNCHER_DIMMING_RIGHT)); | 121 (SHELF_ALIGNMENT_LEFT == launcher_->alignment_ ? |
| 122 SkBitmapOperations::ROTATION_90_CW : |
| 123 SkBitmapOperations::ROTATION_270_CW)); |
| 124 |
119 SkPaint paint; | 125 SkPaint paint; |
120 paint.setAlpha(kDimAlpha); | 126 paint.setAlpha(kDimAlpha); |
121 canvas->DrawImageInt( | 127 canvas->DrawImageInt( |
122 *launcher_background, | 128 background_image, |
123 0, 0, launcher_background->width(), launcher_background->height(), | 129 0, 0, background_image.width(), background_image.height(), |
124 0, 0, width(), height(), | 130 0, 0, width(), height(), |
125 false, | 131 false, |
126 paint); | 132 paint); |
127 } | 133 } |
128 | 134 |
129 // aura::WindowObserver overrides: | 135 // aura::WindowObserver overrides: |
130 virtual void OnWindowBoundsChanged(aura::Window* window, | 136 virtual void OnWindowBoundsChanged(aura::Window* window, |
131 const gfx::Rect& old_bounds, | 137 const gfx::Rect& old_bounds, |
132 const gfx::Rect& new_bounds) OVERRIDE { | 138 const gfx::Rect& new_bounds) OVERRIDE { |
133 CHECK_EQ(window, launcher_->GetNativeWindow()); | 139 CHECK_EQ(window, launcher_->widget()->GetNativeWindow()); |
134 GetWidget()->GetNativeWindow()->SetBounds(window->bounds()); | 140 GetWidget()->GetNativeWindow()->SetBounds(window->bounds()); |
135 } | 141 } |
136 | 142 |
137 virtual void OnWindowDestroying(aura::Window* window) OVERRIDE { | 143 virtual void OnWindowDestroying(aura::Window* window) OVERRIDE { |
138 CHECK_EQ(window, launcher_->GetNativeWindow()); | 144 CHECK_EQ(window, launcher_->widget()->GetNativeWindow()); |
139 launcher_->GetNativeWindow()->RemoveObserver(this); | 145 launcher_->widget()->GetNativeWindow()->RemoveObserver(this); |
140 launcher_ = NULL; | 146 launcher_ = NULL; |
141 } | 147 } |
142 | 148 |
143 views::Widget* launcher_; | 149 Launcher* launcher_; |
144 DISALLOW_COPY_AND_ASSIGN(DimmerView); | 150 DISALLOW_COPY_AND_ASSIGN(DimmerView); |
145 }; | 151 }; |
146 | 152 |
147 Launcher::DelegateView::DelegateView(Launcher* launcher) | 153 Launcher::DelegateView::DelegateView(Launcher* launcher) |
148 : launcher_(launcher), | 154 : launcher_(launcher), |
149 focus_cycler_(NULL), | 155 focus_cycler_(NULL), |
150 alpha_(0) { | 156 alpha_(0) { |
151 } | 157 } |
152 | 158 |
153 Launcher::DelegateView::~DelegateView() { | 159 Launcher::DelegateView::~DelegateView() { |
(...skipping 11 matching lines...) Expand all Loading... |
165 if (launcher_->alignment_ == SHELF_ALIGNMENT_BOTTOM) { | 171 if (launcher_->alignment_ == SHELF_ALIGNMENT_BOTTOM) { |
166 int w = std::max(0, width() - launcher_->status_size_.width()); | 172 int w = std::max(0, width() - launcher_->status_size_.width()); |
167 launcher_view->SetBounds(0, 0, w, height()); | 173 launcher_view->SetBounds(0, 0, w, height()); |
168 } else { | 174 } else { |
169 int h = std::max(0, height() - launcher_->status_size_.height()); | 175 int h = std::max(0, height() - launcher_->status_size_.height()); |
170 launcher_view->SetBounds(0, 0, width(), h); | 176 launcher_view->SetBounds(0, 0, width(), h); |
171 } | 177 } |
172 } | 178 } |
173 | 179 |
174 void Launcher::DelegateView::OnPaintBackground(gfx::Canvas* canvas) { | 180 void Launcher::DelegateView::OnPaintBackground(gfx::Canvas* canvas) { |
175 if (launcher_->alignment_ == SHELF_ALIGNMENT_BOTTOM) { | 181 ash::internal::ShelfLayoutManager* shelf = ash::GetRootWindowController( |
176 SkPaint paint; | 182 GetWidget()->GetNativeView()->GetRootWindow())->shelf(); |
177 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 183 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
178 const gfx::ImageSkia* launcher_background = rb.GetImageSkiaNamed( | 184 gfx::ImageSkia launcher_background = |
179 internal::ShelfLayoutManager::ForLauncher( | 185 *rb.GetImageSkiaNamed(IDR_AURA_LAUNCHER_BACKGROUND); |
180 launcher_->widget()->GetNativeView())-> | 186 if (launcher_->alignment_ != SHELF_ALIGNMENT_BOTTOM) |
181 SelectValueForShelfAlignment(IDR_AURA_LAUNCHER_BACKGROUND_BOTTOM, | 187 launcher_background = gfx::ImageSkiaOperations::CreateRotatedImage( |
182 IDR_AURA_LAUNCHER_BACKGROUND_LEFT, | 188 launcher_background, |
183 IDR_AURA_LAUNCHER_BACKGROUND_RIGHT)); | 189 shelf->SelectValueForShelfAlignment( |
184 paint.setAlpha(alpha_); | 190 SkBitmapOperations::ROTATION_90_CW, |
185 canvas->DrawImageInt( | 191 SkBitmapOperations::ROTATION_90_CW, |
186 *launcher_background, | 192 SkBitmapOperations::ROTATION_270_CW)); |
187 0, 0, launcher_background->width(), launcher_background->height(), | 193 |
188 0, 0, width(), height(), | 194 gfx::Rect black_rect = shelf->SelectValueForShelfAlignment( |
189 false, | 195 gfx::Rect(0, height() - kNumBlackPixels, width(), kNumBlackPixels), |
190 paint); | 196 gfx::Rect(0, 0, kNumBlackPixels, height()), |
191 canvas->FillRect( | 197 gfx::Rect(width() - kNumBlackPixels, 0, kNumBlackPixels, height())); |
192 gfx::Rect(0, height() - kNumBlackPixels, width(), kNumBlackPixels), | 198 |
193 SK_ColorBLACK); | 199 SkPaint paint; |
194 } else { | 200 paint.setAlpha(alpha_); |
195 // TODO(davemoore): when we get an image for the side launcher background | 201 canvas->DrawImageInt( |
196 // use it, and handle black border. | 202 launcher_background, |
197 canvas->DrawColor(SkColorSetARGB(alpha_, 0, 0, 0)); | 203 0, 0, launcher_background.width(), launcher_background.height(), |
198 } | 204 0, 0, width(), height(), |
| 205 false, |
| 206 paint); |
| 207 canvas->FillRect(black_rect, SK_ColorBLACK); |
199 } | 208 } |
200 | 209 |
201 void Launcher::DelegateView::UpdateBackground(int alpha) { | 210 void Launcher::DelegateView::UpdateBackground(int alpha) { |
202 alpha_ = alpha; | 211 alpha_ = alpha; |
203 SchedulePaint(); | 212 SchedulePaint(); |
204 } | 213 } |
205 | 214 |
206 // Launcher -------------------------------------------------------------------- | 215 // Launcher -------------------------------------------------------------------- |
207 | 216 |
208 Launcher::Launcher(LauncherModel* launcher_model, | 217 Launcher::Launcher(LauncherModel* launcher_model, |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 if (focus_cycler) | 276 if (focus_cycler) |
268 focus_cycler->AddWidget(widget_.get()); | 277 focus_cycler->AddWidget(widget_.get()); |
269 } | 278 } |
270 | 279 |
271 internal::FocusCycler* Launcher::GetFocusCycler() { | 280 internal::FocusCycler* Launcher::GetFocusCycler() { |
272 return delegate_view_->focus_cycler(); | 281 return delegate_view_->focus_cycler(); |
273 } | 282 } |
274 | 283 |
275 void Launcher::SetAlignment(ShelfAlignment alignment) { | 284 void Launcher::SetAlignment(ShelfAlignment alignment) { |
276 alignment_ = alignment; | 285 alignment_ = alignment; |
| 286 delegate_view_->SchedulePaint(); |
277 launcher_view_->OnShelfAlignmentChanged(); | 287 launcher_view_->OnShelfAlignmentChanged(); |
278 // ShelfLayoutManager will resize the launcher. | 288 // ShelfLayoutManager will resize the launcher. |
279 } | 289 } |
280 | 290 |
281 void Launcher::SetPaintsBackground( | 291 void Launcher::SetPaintsBackground( |
282 bool value, | 292 bool value, |
283 internal::BackgroundAnimator::ChangeType change_type) { | 293 internal::BackgroundAnimator::ChangeType change_type) { |
284 background_animator_.SetPaintsBackground(value, change_type); | 294 background_animator_.SetPaintsBackground(value, change_type); |
285 } | 295 } |
286 | 296 |
(...skipping 14 matching lines...) Expand all Loading... |
301 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 311 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
302 params.parent = Shell::GetContainer( | 312 params.parent = Shell::GetContainer( |
303 window_container_->GetRootWindow(), | 313 window_container_->GetRootWindow(), |
304 ash::internal::kShellWindowId_LauncherContainer); | 314 ash::internal::kShellWindowId_LauncherContainer); |
305 params.accept_events = false; | 315 params.accept_events = false; |
306 dimmer_->Init(params); | 316 dimmer_->Init(params); |
307 dimmer_->GetNativeWindow()->SetName("LauncherDimmer"); | 317 dimmer_->GetNativeWindow()->SetName("LauncherDimmer"); |
308 dimmer_->SetBounds(widget_->GetWindowBoundsInScreen()); | 318 dimmer_->SetBounds(widget_->GetWindowBoundsInScreen()); |
309 // The launcher should not take focus when it is initially shown. | 319 // The launcher should not take focus when it is initially shown. |
310 dimmer_->set_focus_on_creation(false); | 320 dimmer_->set_focus_on_creation(false); |
311 dimmer_->SetContentsView(new DimmerView(widget_.get())); | 321 dimmer_->SetContentsView(new DimmerView(this)); |
312 dimmer_->GetNativeView()->SetName("LauncherDimmerView"); | 322 dimmer_->GetNativeView()->SetName("LauncherDimmerView"); |
313 dimmer_->GetNativeView()->SetProperty(internal::kStayInSameRootWindowKey, | 323 dimmer_->GetNativeView()->SetProperty(internal::kStayInSameRootWindowKey, |
314 true); | 324 true); |
315 dimmer_->Show(); | 325 dimmer_->Show(); |
316 } | 326 } |
317 | 327 |
318 bool Launcher::GetDimsShelf() const { | 328 bool Launcher::GetDimsShelf() const { |
319 return dimmer_.get() && dimmer_->IsVisible(); | 329 return dimmer_.get() && dimmer_->IsVisible(); |
320 } | 330 } |
321 | 331 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 } else { | 433 } else { |
424 delegate_view_->GetFocusManager()->ClearFocus(); | 434 delegate_view_->GetFocusManager()->ClearFocus(); |
425 } | 435 } |
426 } | 436 } |
427 | 437 |
428 internal::LauncherView* Launcher::GetLauncherViewForTest() { | 438 internal::LauncherView* Launcher::GetLauncherViewForTest() { |
429 return launcher_view_; | 439 return launcher_view_; |
430 } | 440 } |
431 | 441 |
432 } // namespace ash | 442 } // namespace ash |
OLD | NEW |