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/shelf/shelf_widget.h" | 5 #include "ash/shelf/shelf_widget.h" |
6 | 6 |
7 #include "ash/ash_switches.h" | 7 #include "ash/ash_switches.h" |
8 #include "ash/focus_cycler.h" | 8 #include "ash/focus_cycler.h" |
9 #include "ash/launcher/launcher_delegate.h" | 9 #include "ash/launcher/launcher_delegate.h" |
10 #include "ash/launcher/launcher_model.h" | 10 #include "ash/launcher/launcher_model.h" |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 } | 231 } |
232 | 232 |
233 } // namespace | 233 } // namespace |
234 | 234 |
235 namespace ash { | 235 namespace ash { |
236 | 236 |
237 // The contents view of the Shelf. This view contains LauncherView and | 237 // The contents view of the Shelf. This view contains LauncherView and |
238 // sizes it to the width of the shelf minus the size of the status area. | 238 // sizes it to the width of the shelf minus the size of the status area. |
239 class ShelfWidget::DelegateView : public views::WidgetDelegate, | 239 class ShelfWidget::DelegateView : public views::WidgetDelegate, |
240 public views::AccessiblePaneView, | 240 public views::AccessiblePaneView, |
241 public internal::BackgroundAnimatorDelegate { | 241 public internal::BackgroundAnimatorDelegate, |
| 242 public aura::WindowObserver { |
242 public: | 243 public: |
243 explicit DelegateView(ShelfWidget* shelf); | 244 explicit DelegateView(ShelfWidget* shelf); |
244 virtual ~DelegateView(); | 245 virtual ~DelegateView(); |
245 | 246 |
246 void set_focus_cycler(internal::FocusCycler* focus_cycler) { | 247 void set_focus_cycler(internal::FocusCycler* focus_cycler) { |
247 focus_cycler_ = focus_cycler; | 248 focus_cycler_ = focus_cycler; |
248 } | 249 } |
249 internal::FocusCycler* focus_cycler() { | 250 internal::FocusCycler* focus_cycler() { |
250 return focus_cycler_; | 251 return focus_cycler_; |
251 } | 252 } |
(...skipping 13 matching lines...) Expand all Loading... |
265 virtual views::Widget* GetWidget() OVERRIDE { | 266 virtual views::Widget* GetWidget() OVERRIDE { |
266 return View::GetWidget(); | 267 return View::GetWidget(); |
267 } | 268 } |
268 virtual const views::Widget* GetWidget() const OVERRIDE { | 269 virtual const views::Widget* GetWidget() const OVERRIDE { |
269 return View::GetWidget(); | 270 return View::GetWidget(); |
270 } | 271 } |
271 | 272 |
272 virtual bool CanActivate() const OVERRIDE; | 273 virtual bool CanActivate() const OVERRIDE; |
273 virtual void Layout() OVERRIDE; | 274 virtual void Layout() OVERRIDE; |
274 virtual void ReorderChildLayers(ui::Layer* parent_layer) OVERRIDE; | 275 virtual void ReorderChildLayers(ui::Layer* parent_layer) OVERRIDE; |
| 276 // This will be called when the parent local bounds change. |
275 virtual void OnBoundsChanged(const gfx::Rect& old_bounds) OVERRIDE; | 277 virtual void OnBoundsChanged(const gfx::Rect& old_bounds) OVERRIDE; |
276 | 278 |
| 279 // aura::WindowObserver overrides: |
| 280 // This will be called when the shelf itself changes its absolute position. |
| 281 // Since the |dimmer_| panel needs to be placed in screen coordinates it needs |
| 282 // to be repositioned. The difference to the OnBoundsChanged call above is |
| 283 // that this gets also triggered when the shelf only moves. |
| 284 virtual void OnWindowBoundsChanged(aura::Window* window, |
| 285 const gfx::Rect& old_bounds, |
| 286 const gfx::Rect& new_bounds) OVERRIDE; |
| 287 |
277 // BackgroundAnimatorDelegate overrides: | 288 // BackgroundAnimatorDelegate overrides: |
278 virtual void UpdateBackground(int alpha) OVERRIDE; | 289 virtual void UpdateBackground(int alpha) OVERRIDE; |
279 | 290 |
280 // Force the shelf to be presented in an undimmed state. | 291 // Force the shelf to be presented in an undimmed state. |
281 void ForceUndimming(bool force); | 292 void ForceUndimming(bool force); |
282 | 293 |
283 // A function to test the current alpha used by the dimming bar. If there is | 294 // A function to test the current alpha used by the dimming bar. If there is |
284 // no dimmer active, the function will return -1. | 295 // no dimmer active, the function will return -1. |
285 int GetDimmingAlphaForTest(); | 296 int GetDimmingAlphaForTest(); |
286 | 297 |
(...skipping 30 matching lines...) Expand all Loading... |
317 opaque_background_(ui::LAYER_SOLID_COLOR), | 328 opaque_background_(ui::LAYER_SOLID_COLOR), |
318 dimmer_view_(NULL), | 329 dimmer_view_(NULL), |
319 disable_dimming_animations_for_test_(false) { | 330 disable_dimming_animations_for_test_(false) { |
320 set_allow_deactivate_on_esc(true); | 331 set_allow_deactivate_on_esc(true); |
321 opaque_background_.SetColor(SK_ColorBLACK); | 332 opaque_background_.SetColor(SK_ColorBLACK); |
322 opaque_background_.SetBounds(GetLocalBounds()); | 333 opaque_background_.SetBounds(GetLocalBounds()); |
323 opaque_background_.SetOpacity(0.0f); | 334 opaque_background_.SetOpacity(0.0f); |
324 } | 335 } |
325 | 336 |
326 ShelfWidget::DelegateView::~DelegateView() { | 337 ShelfWidget::DelegateView::~DelegateView() { |
| 338 // Make sure that the dimmer goes away since it might have set an observer. |
| 339 SetDimmed(false); |
327 } | 340 } |
328 | 341 |
329 void ShelfWidget::DelegateView::SetDimmed(bool value) { | 342 void ShelfWidget::DelegateView::SetDimmed(bool value) { |
330 if (value == (dimmer_.get() != NULL)) | 343 if (value == (dimmer_.get() != NULL)) |
331 return; | 344 return; |
332 | 345 |
333 if (value) { | 346 if (value) { |
334 dimmer_.reset(new views::Widget); | 347 dimmer_.reset(new views::Widget); |
335 views::Widget::InitParams params( | 348 views::Widget::InitParams params( |
336 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); | 349 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
337 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; | 350 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
338 params.can_activate = false; | 351 params.can_activate = false; |
339 params.accept_events = false; | 352 params.accept_events = false; |
340 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 353 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
341 params.parent = shelf_->GetNativeView(); | 354 params.parent = shelf_->GetNativeView(); |
342 dimmer_->Init(params); | 355 dimmer_->Init(params); |
343 dimmer_->GetNativeWindow()->SetName("ShelfDimmer"); | 356 dimmer_->GetNativeWindow()->SetName("ShelfDimmer"); |
344 dimmer_->SetBounds(shelf_->GetWindowBoundsInScreen()); | 357 dimmer_->SetBounds(shelf_->GetWindowBoundsInScreen()); |
345 // The launcher should not take focus when it is initially shown. | 358 // The launcher should not take focus when it is initially shown. |
346 dimmer_->set_focus_on_creation(false); | 359 dimmer_->set_focus_on_creation(false); |
347 dimmer_view_ = new DimmerView(shelf_, disable_dimming_animations_for_test_); | 360 dimmer_view_ = new DimmerView(shelf_, disable_dimming_animations_for_test_); |
348 dimmer_->SetContentsView(dimmer_view_); | 361 dimmer_->SetContentsView(dimmer_view_); |
349 dimmer_->GetNativeView()->SetName("ShelfDimmerView"); | 362 dimmer_->GetNativeView()->SetName("ShelfDimmerView"); |
350 dimmer_->Show(); | 363 dimmer_->Show(); |
| 364 shelf_->GetNativeView()->AddObserver(this); |
351 } else { | 365 } else { |
| 366 // Some unit tests will come here with a destroyed window. |
| 367 if (shelf_->GetNativeView()) |
| 368 shelf_->GetNativeView()->RemoveObserver(this); |
352 dimmer_view_ = NULL; | 369 dimmer_view_ = NULL; |
353 dimmer_.reset(NULL); | 370 dimmer_.reset(NULL); |
354 } | 371 } |
355 } | 372 } |
356 | 373 |
357 bool ShelfWidget::DelegateView::GetDimmed() const { | 374 bool ShelfWidget::DelegateView::GetDimmed() const { |
358 return dimmer_.get() && dimmer_->IsVisible(); | 375 return dimmer_.get() && dimmer_->IsVisible(); |
359 } | 376 } |
360 | 377 |
361 void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { | 378 void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 views::View::ReorderChildLayers(parent_layer); | 438 views::View::ReorderChildLayers(parent_layer); |
422 parent_layer->StackAtBottom(&opaque_background_); | 439 parent_layer->StackAtBottom(&opaque_background_); |
423 } | 440 } |
424 | 441 |
425 void ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) { | 442 void ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) { |
426 opaque_background_.SetBounds(GetLocalBounds()); | 443 opaque_background_.SetBounds(GetLocalBounds()); |
427 if (dimmer_) | 444 if (dimmer_) |
428 dimmer_->SetBounds(GetBoundsInScreen()); | 445 dimmer_->SetBounds(GetBoundsInScreen()); |
429 } | 446 } |
430 | 447 |
| 448 void ShelfWidget::DelegateView::OnWindowBoundsChanged( |
| 449 aura::Window* window, |
| 450 const gfx::Rect& old_bounds, |
| 451 const gfx::Rect& new_bounds) { |
| 452 // Coming here the shelf got repositioned and since the |dimmer_| is placed |
| 453 // in screen coordinates and not relative to the parent it needs to be |
| 454 // repositioned accordingly. |
| 455 dimmer_->SetBounds(GetBoundsInScreen()); |
| 456 } |
| 457 |
431 void ShelfWidget::DelegateView::ForceUndimming(bool force) { | 458 void ShelfWidget::DelegateView::ForceUndimming(bool force) { |
432 if (GetDimmed()) | 459 if (GetDimmed()) |
433 dimmer_view_->ForceUndimming(force); | 460 dimmer_view_->ForceUndimming(force); |
434 } | 461 } |
435 | 462 |
436 int ShelfWidget::DelegateView::GetDimmingAlphaForTest() { | 463 int ShelfWidget::DelegateView::GetDimmingAlphaForTest() { |
437 if (GetDimmed()) | 464 if (GetDimmed()) |
438 return dimmer_view_->get_dimming_alpha_for_test(); | 465 return dimmer_view_->get_dimming_alpha_for_test(); |
439 return -1; | 466 return -1; |
440 } | 467 } |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 return delegate_view_->GetDimmerBoundsForTest(); | 674 return delegate_view_->GetDimmerBoundsForTest(); |
648 return gfx::Rect(); | 675 return gfx::Rect(); |
649 } | 676 } |
650 | 677 |
651 void ShelfWidget::DisableDimmingAnimationsForTest() { | 678 void ShelfWidget::DisableDimmingAnimationsForTest() { |
652 DCHECK(delegate_view_); | 679 DCHECK(delegate_view_); |
653 return delegate_view_->disable_dimming_animations_for_test(); | 680 return delegate_view_->disable_dimming_animations_for_test(); |
654 } | 681 } |
655 | 682 |
656 } // namespace ash | 683 } // namespace ash |
OLD | NEW |