| 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/root_window_controller.h" | 9 #include "ash/root_window_controller.h" |
| 10 #include "ash/session_state_delegate.h" | 10 #include "ash/session_state_delegate.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 // Alpha to paint dimming image with. | 45 // Alpha to paint dimming image with. |
| 46 const int kDimAlpha = 128; | 46 const int kDimAlpha = 128; |
| 47 | 47 |
| 48 // The time to dim and un-dim. | 48 // The time to dim and un-dim. |
| 49 const int kTimeToDimMs = 3000; // Slow in dimming. | 49 const int kTimeToDimMs = 3000; // Slow in dimming. |
| 50 const int kTimeToUnDimMs = 200; // Fast in activating. | 50 const int kTimeToUnDimMs = 200; // Fast in activating. |
| 51 | 51 |
| 52 // Class used to slightly dim shelf items when maximized and visible. | 52 // Class used to slightly dim shelf items when maximized and visible. |
| 53 class DimmerView : public views::View, | 53 class DimmerView : public views::View, |
| 54 public views::WidgetDelegate, | 54 public views::WidgetDelegate, |
| 55 ash::internal::BackgroundAnimatorDelegate { | 55 ash::BackgroundAnimatorDelegate { |
| 56 public: | 56 public: |
| 57 // If |disable_dimming_animations_for_test| is set, all alpha animations will | 57 // If |disable_dimming_animations_for_test| is set, all alpha animations will |
| 58 // be performed instantly. | 58 // be performed instantly. |
| 59 DimmerView(ash::ShelfWidget* shelf_widget, | 59 DimmerView(ash::ShelfWidget* shelf_widget, |
| 60 bool disable_dimming_animations_for_test); | 60 bool disable_dimming_animations_for_test); |
| 61 virtual ~DimmerView(); | 61 virtual ~DimmerView(); |
| 62 | 62 |
| 63 // Called by |DimmerEventFilter| when the mouse |hovered| state changes. | 63 // Called by |DimmerEventFilter| when the mouse |hovered| state changes. |
| 64 void SetHovered(bool hovered); | 64 void SetHovered(bool hovered); |
| 65 | 65 |
| 66 // Force the dimmer to be undimmed. | 66 // Force the dimmer to be undimmed. |
| 67 void ForceUndimming(bool force); | 67 void ForceUndimming(bool force); |
| 68 | 68 |
| 69 // views::WidgetDelegate overrides: | 69 // views::WidgetDelegate overrides: |
| 70 virtual views::Widget* GetWidget() OVERRIDE { | 70 virtual views::Widget* GetWidget() OVERRIDE { |
| 71 return View::GetWidget(); | 71 return View::GetWidget(); |
| 72 } | 72 } |
| 73 virtual const views::Widget* GetWidget() const OVERRIDE { | 73 virtual const views::Widget* GetWidget() const OVERRIDE { |
| 74 return View::GetWidget(); | 74 return View::GetWidget(); |
| 75 } | 75 } |
| 76 | 76 |
| 77 // ash::internal::BackgroundAnimatorDelegate overrides: | 77 // ash::BackgroundAnimatorDelegate overrides: |
| 78 virtual void UpdateBackground(int alpha) OVERRIDE { | 78 virtual void UpdateBackground(int alpha) OVERRIDE { |
| 79 alpha_ = alpha; | 79 alpha_ = alpha; |
| 80 SchedulePaint(); | 80 SchedulePaint(); |
| 81 } | 81 } |
| 82 | 82 |
| 83 // views::View overrides: | 83 // views::View overrides: |
| 84 virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE; | 84 virtual void OnPaintBackground(gfx::Canvas* canvas) OVERRIDE; |
| 85 | 85 |
| 86 // A function to test the current alpha used. | 86 // A function to test the current alpha used. |
| 87 int get_dimming_alpha_for_test() { return alpha_; } | 87 int get_dimming_alpha_for_test() { return alpha_; } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 // True if the event filter claims that we should not be dimmed. | 119 // True if the event filter claims that we should not be dimmed. |
| 120 bool is_hovered_; | 120 bool is_hovered_; |
| 121 | 121 |
| 122 // True if someone forces us not to be dimmed (e.g. a menu is open). | 122 // True if someone forces us not to be dimmed (e.g. a menu is open). |
| 123 bool force_hovered_; | 123 bool force_hovered_; |
| 124 | 124 |
| 125 // True if animations should be suppressed for a test. | 125 // True if animations should be suppressed for a test. |
| 126 bool disable_dimming_animations_for_test_; | 126 bool disable_dimming_animations_for_test_; |
| 127 | 127 |
| 128 // The animator for the background transitions. | 128 // The animator for the background transitions. |
| 129 ash::internal::BackgroundAnimator background_animator_; | 129 ash::BackgroundAnimator background_animator_; |
| 130 | 130 |
| 131 // Notification of entering / exiting of the shelf area by mouse. | 131 // Notification of entering / exiting of the shelf area by mouse. |
| 132 scoped_ptr<DimmerEventFilter> event_filter_; | 132 scoped_ptr<DimmerEventFilter> event_filter_; |
| 133 | 133 |
| 134 DISALLOW_COPY_AND_ASSIGN(DimmerView); | 134 DISALLOW_COPY_AND_ASSIGN(DimmerView); |
| 135 }; | 135 }; |
| 136 | 136 |
| 137 DimmerView::DimmerView(ash::ShelfWidget* shelf_widget, | 137 DimmerView::DimmerView(ash::ShelfWidget* shelf_widget, |
| 138 bool disable_dimming_animations_for_test) | 138 bool disable_dimming_animations_for_test) |
| 139 : shelf_(shelf_widget), | 139 : shelf_(shelf_widget), |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 bool touch_inside = false; | 227 bool touch_inside = false; |
| 228 if (event->type() != ui::ET_TOUCH_RELEASED && | 228 if (event->type() != ui::ET_TOUCH_RELEASED && |
| 229 event->type() != ui::ET_TOUCH_CANCELLED) | 229 event->type() != ui::ET_TOUCH_CANCELLED) |
| 230 touch_inside = owner_->GetBoundsInScreen().Contains(event->root_location()); | 230 touch_inside = owner_->GetBoundsInScreen().Contains(event->root_location()); |
| 231 | 231 |
| 232 if (mouse_inside_ || touch_inside_ != mouse_inside_ || touch_inside) | 232 if (mouse_inside_ || touch_inside_ != mouse_inside_ || touch_inside) |
| 233 owner_->SetHovered(mouse_inside_ || touch_inside); | 233 owner_->SetHovered(mouse_inside_ || touch_inside); |
| 234 touch_inside_ = touch_inside; | 234 touch_inside_ = touch_inside; |
| 235 } | 235 } |
| 236 | 236 |
| 237 using ash::internal::ShelfLayoutManager; | 237 using ash::ShelfLayoutManager; |
| 238 | 238 |
| 239 // ShelfWindowTargeter makes it easier to resize windows with the mouse when the | 239 // ShelfWindowTargeter makes it easier to resize windows with the mouse when the |
| 240 // window-edge slightly overlaps with the shelf edge. The targeter also makes it | 240 // window-edge slightly overlaps with the shelf edge. The targeter also makes it |
| 241 // easier to drag the shelf out with touch while it is hidden. | 241 // easier to drag the shelf out with touch while it is hidden. |
| 242 class ShelfWindowTargeter : public wm::EasyResizeWindowTargeter, | 242 class ShelfWindowTargeter : public wm::EasyResizeWindowTargeter, |
| 243 public ash::ShelfLayoutManagerObserver { | 243 public ash::ShelfLayoutManagerObserver { |
| 244 public: | 244 public: |
| 245 ShelfWindowTargeter(aura::Window* container, | 245 ShelfWindowTargeter(aura::Window* container, |
| 246 ShelfLayoutManager* shelf) | 246 ShelfLayoutManager* shelf) |
| 247 : wm::EasyResizeWindowTargeter(container, gfx::Insets(), gfx::Insets()), | 247 : wm::EasyResizeWindowTargeter(container, gfx::Insets(), gfx::Insets()), |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 }; | 306 }; |
| 307 | 307 |
| 308 } // namespace | 308 } // namespace |
| 309 | 309 |
| 310 namespace ash { | 310 namespace ash { |
| 311 | 311 |
| 312 // The contents view of the Shelf. This view contains ShelfView and | 312 // The contents view of the Shelf. This view contains ShelfView and |
| 313 // sizes it to the width of the shelf minus the size of the status area. | 313 // sizes it to the width of the shelf minus the size of the status area. |
| 314 class ShelfWidget::DelegateView : public views::WidgetDelegate, | 314 class ShelfWidget::DelegateView : public views::WidgetDelegate, |
| 315 public views::AccessiblePaneView, | 315 public views::AccessiblePaneView, |
| 316 public internal::BackgroundAnimatorDelegate, | 316 public BackgroundAnimatorDelegate, |
| 317 public aura::WindowObserver { | 317 public aura::WindowObserver { |
| 318 public: | 318 public: |
| 319 explicit DelegateView(ShelfWidget* shelf); | 319 explicit DelegateView(ShelfWidget* shelf); |
| 320 virtual ~DelegateView(); | 320 virtual ~DelegateView(); |
| 321 | 321 |
| 322 void set_focus_cycler(internal::FocusCycler* focus_cycler) { | 322 void set_focus_cycler(FocusCycler* focus_cycler) { |
| 323 focus_cycler_ = focus_cycler; | 323 focus_cycler_ = focus_cycler; |
| 324 } | 324 } |
| 325 internal::FocusCycler* focus_cycler() { | 325 FocusCycler* focus_cycler() { return focus_cycler_; } |
| 326 return focus_cycler_; | |
| 327 } | |
| 328 | 326 |
| 329 ui::Layer* opaque_background() { return &opaque_background_; } | 327 ui::Layer* opaque_background() { return &opaque_background_; } |
| 330 | 328 |
| 331 // Set if the shelf area is dimmed (eg when a window is maximized). | 329 // Set if the shelf area is dimmed (eg when a window is maximized). |
| 332 void SetDimmed(bool dimmed); | 330 void SetDimmed(bool dimmed); |
| 333 bool GetDimmed() const; | 331 bool GetDimmed() const; |
| 334 | 332 |
| 335 void SetParentLayer(ui::Layer* layer); | 333 void SetParentLayer(ui::Layer* layer); |
| 336 | 334 |
| 337 // views::View overrides: | 335 // views::View overrides: |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 | 374 |
| 377 // Disable dimming animations for running tests. This needs to be called | 375 // Disable dimming animations for running tests. This needs to be called |
| 378 // prior to the creation of of the |dimmer_|. | 376 // prior to the creation of of the |dimmer_|. |
| 379 void disable_dimming_animations_for_test() { | 377 void disable_dimming_animations_for_test() { |
| 380 disable_dimming_animations_for_test_ = true; | 378 disable_dimming_animations_for_test_ = true; |
| 381 } | 379 } |
| 382 | 380 |
| 383 private: | 381 private: |
| 384 ShelfWidget* shelf_; | 382 ShelfWidget* shelf_; |
| 385 scoped_ptr<views::Widget> dimmer_; | 383 scoped_ptr<views::Widget> dimmer_; |
| 386 internal::FocusCycler* focus_cycler_; | 384 FocusCycler* focus_cycler_; |
| 387 int alpha_; | 385 int alpha_; |
| 388 ui::Layer opaque_background_; | 386 ui::Layer opaque_background_; |
| 389 | 387 |
| 390 // The view which does the dimming. | 388 // The view which does the dimming. |
| 391 DimmerView* dimmer_view_; | 389 DimmerView* dimmer_view_; |
| 392 | 390 |
| 393 // True if dimming animations should be turned off. | 391 // True if dimming animations should be turned off. |
| 394 bool disable_dimming_animations_for_test_; | 392 bool disable_dimming_animations_for_test_; |
| 395 | 393 |
| 396 DISALLOW_COPY_AND_ASSIGN(DelegateView); | 394 DISALLOW_COPY_AND_ASSIGN(DelegateView); |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 return gfx::Rect(); | 592 return gfx::Rect(); |
| 595 } | 593 } |
| 596 | 594 |
| 597 void ShelfWidget::DelegateView::UpdateBackground(int alpha) { | 595 void ShelfWidget::DelegateView::UpdateBackground(int alpha) { |
| 598 alpha_ = alpha; | 596 alpha_ = alpha; |
| 599 SchedulePaint(); | 597 SchedulePaint(); |
| 600 } | 598 } |
| 601 | 599 |
| 602 ShelfWidget::ShelfWidget(aura::Window* shelf_container, | 600 ShelfWidget::ShelfWidget(aura::Window* shelf_container, |
| 603 aura::Window* status_container, | 601 aura::Window* status_container, |
| 604 internal::WorkspaceController* workspace_controller) | 602 WorkspaceController* workspace_controller) |
| 605 : delegate_view_(new DelegateView(this)), | 603 : delegate_view_(new DelegateView(this)), |
| 606 background_animator_(delegate_view_, 0, kShelfBackgroundAlpha), | 604 background_animator_(delegate_view_, 0, kShelfBackgroundAlpha), |
| 607 activating_as_fallback_(false), | 605 activating_as_fallback_(false), |
| 608 window_container_(shelf_container) { | 606 window_container_(shelf_container) { |
| 609 views::Widget::InitParams params( | 607 views::Widget::InitParams params( |
| 610 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); | 608 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
| 611 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; | 609 params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
| 612 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; | 610 params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; |
| 613 params.parent = shelf_container; | 611 params.parent = shelf_container; |
| 614 params.delegate = delegate_view_; | 612 params.delegate = delegate_view_; |
| 615 Init(params); | 613 Init(params); |
| 616 | 614 |
| 617 // The shelf should not take focus when initially shown. | 615 // The shelf should not take focus when initially shown. |
| 618 set_focus_on_creation(false); | 616 set_focus_on_creation(false); |
| 619 SetContentsView(delegate_view_); | 617 SetContentsView(delegate_view_); |
| 620 delegate_view_->SetParentLayer(GetLayer()); | 618 delegate_view_->SetParentLayer(GetLayer()); |
| 621 | 619 |
| 622 status_area_widget_ = new internal::StatusAreaWidget(status_container); | 620 status_area_widget_ = new StatusAreaWidget(status_container); |
| 623 status_area_widget_->CreateTrayViews(); | 621 status_area_widget_->CreateTrayViews(); |
| 624 if (Shell::GetInstance()->session_state_delegate()-> | 622 if (Shell::GetInstance()->session_state_delegate()-> |
| 625 IsActiveUserSessionStarted()) { | 623 IsActiveUserSessionStarted()) { |
| 626 status_area_widget_->Show(); | 624 status_area_widget_->Show(); |
| 627 } | 625 } |
| 628 Shell::GetInstance()->focus_cycler()->AddWidget(status_area_widget_); | 626 Shell::GetInstance()->focus_cycler()->AddWidget(status_area_widget_); |
| 629 | 627 |
| 630 shelf_layout_manager_ = new internal::ShelfLayoutManager(this); | 628 shelf_layout_manager_ = new ShelfLayoutManager(this); |
| 631 shelf_layout_manager_->AddObserver(this); | 629 shelf_layout_manager_->AddObserver(this); |
| 632 shelf_container->SetLayoutManager(shelf_layout_manager_); | 630 shelf_container->SetLayoutManager(shelf_layout_manager_); |
| 633 shelf_layout_manager_->set_workspace_controller(workspace_controller); | 631 shelf_layout_manager_->set_workspace_controller(workspace_controller); |
| 634 workspace_controller->SetShelf(shelf_layout_manager_); | 632 workspace_controller->SetShelf(shelf_layout_manager_); |
| 635 | 633 |
| 636 status_container->SetLayoutManager( | 634 status_container->SetLayoutManager(new StatusAreaLayoutManager(this)); |
| 637 new internal::StatusAreaLayoutManager(this)); | |
| 638 | 635 |
| 639 shelf_container->SetEventTargeter(scoped_ptr<ui::EventTargeter>(new | 636 shelf_container->SetEventTargeter(scoped_ptr<ui::EventTargeter>(new |
| 640 ShelfWindowTargeter(shelf_container, shelf_layout_manager_))); | 637 ShelfWindowTargeter(shelf_container, shelf_layout_manager_))); |
| 641 status_container->SetEventTargeter(scoped_ptr<ui::EventTargeter>(new | 638 status_container->SetEventTargeter(scoped_ptr<ui::EventTargeter>(new |
| 642 ShelfWindowTargeter(status_container, shelf_layout_manager_))); | 639 ShelfWindowTargeter(status_container, shelf_layout_manager_))); |
| 643 | 640 |
| 644 views::Widget::AddObserver(this); | 641 views::Widget::AddObserver(this); |
| 645 } | 642 } |
| 646 | 643 |
| 647 ShelfWidget::~ShelfWidget() { | 644 ShelfWidget::~ShelfWidget() { |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 736 // This needs to be called before shelf_model(). | 733 // This needs to be called before shelf_model(). |
| 737 ShelfDelegate* shelf_delegate = shell->GetShelfDelegate(); | 734 ShelfDelegate* shelf_delegate = shell->GetShelfDelegate(); |
| 738 if (!shelf_delegate) | 735 if (!shelf_delegate) |
| 739 return; // Not ready to create Shelf. | 736 return; // Not ready to create Shelf. |
| 740 | 737 |
| 741 shelf_.reset( | 738 shelf_.reset( |
| 742 new Shelf(shell->shelf_model(), shell->GetShelfDelegate(), this)); | 739 new Shelf(shell->shelf_model(), shell->GetShelfDelegate(), this)); |
| 743 SetFocusCycler(shell->focus_cycler()); | 740 SetFocusCycler(shell->focus_cycler()); |
| 744 | 741 |
| 745 // Inform the root window controller. | 742 // Inform the root window controller. |
| 746 internal::RootWindowController::ForWindow(window_container_) | 743 RootWindowController::ForWindow(window_container_)->OnShelfCreated(); |
| 747 ->OnShelfCreated(); | |
| 748 | 744 |
| 749 shelf_->SetVisible( | 745 shelf_->SetVisible( |
| 750 shell->session_state_delegate()->IsActiveUserSessionStarted()); | 746 shell->session_state_delegate()->IsActiveUserSessionStarted()); |
| 751 shelf_layout_manager_->LayoutShelf(); | 747 shelf_layout_manager_->LayoutShelf(); |
| 752 Show(); | 748 Show(); |
| 753 } | 749 } |
| 754 | 750 |
| 755 bool ShelfWidget::IsShelfVisible() const { | 751 bool ShelfWidget::IsShelfVisible() const { |
| 756 return shelf_.get() && shelf_->IsVisible(); | 752 return shelf_.get() && shelf_->IsVisible(); |
| 757 } | 753 } |
| 758 | 754 |
| 759 void ShelfWidget::SetShelfVisibility(bool visible) { | 755 void ShelfWidget::SetShelfVisibility(bool visible) { |
| 760 if (shelf_) | 756 if (shelf_) |
| 761 shelf_->SetVisible(visible); | 757 shelf_->SetVisible(visible); |
| 762 } | 758 } |
| 763 | 759 |
| 764 void ShelfWidget::SetFocusCycler(internal::FocusCycler* focus_cycler) { | 760 void ShelfWidget::SetFocusCycler(FocusCycler* focus_cycler) { |
| 765 delegate_view_->set_focus_cycler(focus_cycler); | 761 delegate_view_->set_focus_cycler(focus_cycler); |
| 766 if (focus_cycler) | 762 if (focus_cycler) |
| 767 focus_cycler->AddWidget(this); | 763 focus_cycler->AddWidget(this); |
| 768 } | 764 } |
| 769 | 765 |
| 770 internal::FocusCycler* ShelfWidget::GetFocusCycler() { | 766 FocusCycler* ShelfWidget::GetFocusCycler() { |
| 771 return delegate_view_->focus_cycler(); | 767 return delegate_view_->focus_cycler(); |
| 772 } | 768 } |
| 773 | 769 |
| 774 void ShelfWidget::ShutdownStatusAreaWidget() { | 770 void ShelfWidget::ShutdownStatusAreaWidget() { |
| 775 if (status_area_widget_) | 771 if (status_area_widget_) |
| 776 status_area_widget_->Shutdown(); | 772 status_area_widget_->Shutdown(); |
| 777 status_area_widget_ = NULL; | 773 status_area_widget_ = NULL; |
| 778 } | 774 } |
| 779 | 775 |
| 780 void ShelfWidget::ForceUndimming(bool force) { | 776 void ShelfWidget::ForceUndimming(bool force) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 806 DCHECK(delegate_view_); | 802 DCHECK(delegate_view_); |
| 807 return delegate_view_->disable_dimming_animations_for_test(); | 803 return delegate_view_->disable_dimming_animations_for_test(); |
| 808 } | 804 } |
| 809 | 805 |
| 810 void ShelfWidget::WillDeleteShelf() { | 806 void ShelfWidget::WillDeleteShelf() { |
| 811 shelf_layout_manager_->RemoveObserver(this); | 807 shelf_layout_manager_->RemoveObserver(this); |
| 812 shelf_layout_manager_ = NULL; | 808 shelf_layout_manager_ = NULL; |
| 813 } | 809 } |
| 814 | 810 |
| 815 } // namespace ash | 811 } // namespace ash |
| OLD | NEW |