| Index: ash/wm/app_list_controller.cc
|
| diff --git a/ash/wm/app_list_controller.cc b/ash/wm/app_list_controller.cc
|
| index 7fcf76c9f1d7e8939a30d2bcf2b7f89567d2b1f4..6776b60a651cf0342447b812ba1fe116a320a32a 100644
|
| --- a/ash/wm/app_list_controller.cc
|
| +++ b/ash/wm/app_list_controller.cc
|
| @@ -10,6 +10,7 @@
|
| #include "ash/shell.h"
|
| #include "ash/shell_delegate.h"
|
| #include "ash/shell_window_ids.h"
|
| +#include "ash/wm/app_list_controller_observer.h"
|
| #include "ash/wm/property_util.h"
|
| #include "ui/app_list/app_list_constants.h"
|
| #include "ui/app_list/pagination_model.h"
|
| @@ -52,10 +53,11 @@ views::BubbleBorder::Arrow GetBubbleArrow(aura::Window* window) {
|
| views::BubbleBorder::TOP_CENTER);
|
| }
|
|
|
| -// Offset given |rect| towards shelf.
|
| -gfx::Rect OffsetTowardsShelf(const gfx::Rect& rect, views::Widget* widget) {
|
| - DCHECK(Shell::HasInstance());
|
| - ShelfAlignment shelf_alignment = Shell::GetInstance()->GetShelfAlignment(
|
| +// Offsets the given |rect| towards shelf.
|
| +gfx::Rect OffsetTowardsShelf(Shell* shell,
|
| + const gfx::Rect& rect,
|
| + views::Widget* widget) {
|
| + ShelfAlignment shelf_alignment = shell->GetShelfAlignment(
|
| widget->GetNativeView()->GetRootWindow());
|
| gfx::Rect offseted(rect);
|
| switch (shelf_alignment) {
|
| @@ -81,23 +83,31 @@ gfx::Rect OffsetTowardsShelf(const gfx::Rect& rect, views::Widget* widget) {
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // AppListController, public:
|
|
|
| -AppListController::AppListController()
|
| - : pagination_model_(new app_list::PaginationModel),
|
| +AppListController::AppListController(Shell* shell)
|
| + : shell_(shell),
|
| + pagination_model_(new app_list::PaginationModel),
|
| is_visible_(false),
|
| view_(NULL),
|
| should_snap_back_(false) {
|
| - Shell::GetInstance()->AddShellObserver(this);
|
| + shell_->AddShellObserver(this);
|
| pagination_model_->AddObserver(this);
|
| }
|
|
|
| AppListController::~AppListController() {
|
| + Shutdown();
|
| + pagination_model_->RemoveObserver(this);
|
| +}
|
| +
|
| +void AppListController::Shutdown() {
|
| // Ensures app list view goes before the controller since pagination model
|
| // lives in the controller and app list view would access it on destruction.
|
| if (view_ && view_->GetWidget())
|
| view_->GetWidget()->CloseNow();
|
|
|
| - Shell::GetInstance()->RemoveShellObserver(this);
|
| - pagination_model_->RemoveObserver(this);
|
| + if (shell_) {
|
| + shell_->RemoveShellObserver(this);
|
| + shell_ = NULL;
|
| + }
|
| }
|
|
|
| void AppListController::SetVisible(bool visible, aura::Window* window) {
|
| @@ -111,14 +121,18 @@ void AppListController::SetVisible(bool visible, aura::Window* window) {
|
| Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager()->
|
| UpdateAutoHideState();
|
|
|
| + // Determine the root window to show the UI.
|
| + aura::RootWindow* root_window =
|
| + window ? window->GetRootWindow() : Shell::GetActiveRootWindow();
|
| +
|
| if (view_) {
|
| ScheduleAnimation();
|
| } else if (is_visible_) {
|
| // AppListModel and AppListViewDelegate are owned by AppListView. They
|
| // will be released with AppListView on close.
|
| app_list::AppListView* view = new app_list::AppListView(
|
| - Shell::GetInstance()->delegate()->CreateAppListViewDelegate());
|
| - aura::Window* container = GetRootWindowController(window->GetRootWindow())->
|
| + shell_->delegate()->CreateAppListViewDelegate());
|
| + aura::Window* container = GetRootWindowController(root_window)->
|
| GetContainer(kShellWindowId_AppListContainer);
|
| view->InitAsBubble(
|
| container,
|
| @@ -129,16 +143,32 @@ void AppListController::SetVisible(bool visible, aura::Window* window) {
|
| true /* border_accepts_events */);
|
| SetView(view);
|
| }
|
| +
|
| + FOR_EACH_OBSERVER(AppListControllerObserver,
|
| + observers_,
|
| + OnAppLauncherVisibilityChanged(is_visible_, root_window));
|
| }
|
|
|
| bool AppListController::IsVisible() const {
|
| return view_ && view_->GetWidget()->IsVisible();
|
| }
|
|
|
| +void AppListController::Toggle(aura::Window* window) {
|
| + SetVisible(!IsVisible(), window);
|
| +}
|
| +
|
| aura::Window* AppListController::GetWindow() {
|
| return is_visible_ && view_ ? view_->GetWidget()->GetNativeWindow() : NULL;
|
| }
|
|
|
| +void AppListController::AddObserver(AppListControllerObserver* observer) {
|
| + observers_.AddObserver(observer);
|
| +}
|
| +
|
| +void AppListController::RemoveObserver(AppListControllerObserver* observer) {
|
| + observers_.RemoveObserver(observer);
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // AppListController, private:
|
|
|
| @@ -149,7 +179,7 @@ void AppListController::SetView(app_list::AppListView* view) {
|
| view_ = view;
|
| views::Widget* widget = view_->GetWidget();
|
| widget->AddObserver(this);
|
| - Shell::GetInstance()->AddPreTargetHandler(this);
|
| + shell_->AddPreTargetHandler(this);
|
| Launcher::ForWindow(widget->GetNativeWindow())->AddIconObserver(this);
|
| widget->GetNativeView()->GetRootWindow()->AddRootWindowObserver(this);
|
| aura::client::GetFocusClient(widget->GetNativeView())->AddObserver(this);
|
| @@ -164,7 +194,7 @@ void AppListController::ResetView() {
|
| views::Widget* widget = view_->GetWidget();
|
| widget->RemoveObserver(this);
|
| GetLayer(widget)->GetAnimator()->RemoveObserver(this);
|
| - Shell::GetInstance()->RemovePreTargetHandler(this);
|
| + shell_->RemovePreTargetHandler(this);
|
| Launcher::ForWindow(widget->GetNativeWindow())->RemoveIconObserver(this);
|
| widget->GetNativeView()->GetRootWindow()->RemoveRootWindowObserver(this);
|
| aura::client::GetFocusClient(widget->GetNativeView())->RemoveObserver(this);
|
| @@ -182,9 +212,10 @@ void AppListController::ScheduleAnimation() {
|
| gfx::Rect target_bounds;
|
| if (is_visible_) {
|
| target_bounds = widget->GetWindowBoundsInScreen();
|
| - widget->SetBounds(OffsetTowardsShelf(target_bounds, widget));
|
| + widget->SetBounds(OffsetTowardsShelf(shell_, target_bounds, widget));
|
| } else {
|
| - target_bounds = OffsetTowardsShelf(widget->GetWindowBoundsInScreen(),
|
| + target_bounds = OffsetTowardsShelf(shell_,
|
| + widget->GetWindowBoundsInScreen(),
|
| widget);
|
| }
|
|
|
|
|