Index: ash/wm/app_list_controller.cc |
=================================================================== |
--- ash/wm/app_list_controller.cc (revision 135736) |
+++ ash/wm/app_list_controller.cc (working copy) |
@@ -2,22 +2,24 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "ash/app_list/app_list.h" |
+#include "ash/wm/app_list_controller.h" |
-#include "ash/app_list/app_list_view.h" |
-#include "ash/app_list/icon_cache.h" |
#include "ash/ash_switches.h" |
+#include "ash/screen_ash.h" |
#include "ash/shell.h" |
#include "ash/shell_delegate.h" |
#include "ash/shell_window_ids.h" |
#include "ash/wm/shelf_layout_manager.h" |
#include "ash/wm/window_util.h" |
#include "base/command_line.h" |
+#include "ui/app_list/app_list_view.h" |
+#include "ui/app_list/icon_cache.h" |
#include "ui/aura/event.h" |
#include "ui/aura/root_window.h" |
#include "ui/aura/window.h" |
#include "ui/compositor/layer.h" |
#include "ui/compositor/scoped_layer_animation_settings.h" |
+#include "ui/gfx/screen.h" |
#include "ui/gfx/transform_util.h" |
namespace ash { |
@@ -37,27 +39,44 @@ |
return widget->GetNativeView()->layer(); |
} |
+// Bounds returned is used for full screen app list. Use full monitor rect |
+// so that the app list shade goes behind the launcher. |
+gfx::Rect GetFullScreenBoundsForWidget(views::Widget* widget) { |
+ gfx::NativeView window = widget->GetNativeView(); |
+ return gfx::Screen::GetMonitorNearestWindow(window).bounds(); |
+} |
+ |
+// Return work area rect for full screen app list layout. This function is |
+// needed to get final work area in one shot instead of waiting for shelf |
+// animation to finish. |
+gfx::Rect GetWorkAreaBoundsForWidget(views::Widget* widget) { |
+ gfx::NativeView window = widget->GetNativeView(); |
+ return Shell::GetInstance()->shelf()->IsVisible() ? |
+ ScreenAsh::GetUnmaximizedWorkAreaBounds(window) : |
+ gfx::Screen::GetMonitorNearestWindow(window).work_area(); |
+} |
+ |
} // namespace |
//////////////////////////////////////////////////////////////////////////////// |
-// AppList, public: |
+// AppListController, public: |
-AppList::AppList() : is_visible_(false), view_(NULL) { |
- IconCache::CreateInstance(); |
+AppListController::AppListController() : is_visible_(false), view_(NULL) { |
+ app_list::IconCache::CreateInstance(); |
} |
-AppList::~AppList() { |
+AppListController::~AppListController() { |
ResetView(); |
- IconCache::DeleteInstance(); |
+ app_list::IconCache::DeleteInstance(); |
} |
// static |
-bool AppList::UseAppListV2() { |
+bool AppListController::UseAppListV2() { |
return CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnableAppListV2); |
} |
-void AppList::SetVisible(bool visible) { |
+void AppListController::SetVisible(bool visible) { |
if (visible == is_visible_) |
return; |
@@ -72,27 +91,40 @@ |
} else if (is_visible_) { |
// AppListModel and AppListViewDelegate are owned by AppListView. They |
// will be released with AppListView on close. |
- SetView(new AppListView( |
- Shell::GetInstance()->delegate()->CreateAppListViewDelegate())); |
+ app_list::AppListView* view = new app_list::AppListView( |
+ Shell::GetInstance()->delegate()->CreateAppListViewDelegate()); |
+ if (UseAppListV2()) { |
+ view->InitAsBubble( |
+ Shell::GetInstance()->GetContainer(kShellWindowId_AppListContainer), |
+ Shell::GetInstance()->launcher()->GetAppListButtonView()); |
+ } else { |
+ views::Widget* launcher_widget = |
+ Shell::GetInstance()->launcher()->widget(); |
+ view->InitAsFullscreenWidget(Shell::GetInstance()->GetContainer( |
+ kShellWindowId_AppListContainer), |
+ GetFullScreenBoundsForWidget(launcher_widget), |
+ GetWorkAreaBoundsForWidget(launcher_widget)); |
+ } |
+ SetView(view); |
} |
} |
-bool AppList::IsVisible() { |
+bool AppListController::IsVisible() { |
return view_ && view_->GetWidget()->IsVisible(); |
} |
-aura::Window* AppList::GetWindow() { |
+aura::Window* AppListController::GetWindow() { |
return is_visible_ && view_ ? view_->GetWidget()->GetNativeWindow() : NULL; |
} |
//////////////////////////////////////////////////////////////////////////////// |
-// AppList, private: |
+// AppListController, private: |
-void AppList::SetView(AppListView* view) { |
+void AppListController::SetView(app_list::AppListView* view) { |
DCHECK(view_ == NULL); |
if (is_visible_) { |
- IconCache::GetInstance()->MarkAllEntryUnused(); |
+ app_list::IconCache::GetInstance()->MarkAllEntryUnused(); |
view_ = view; |
views::Widget* widget = view_->GetWidget(); |
@@ -109,7 +141,7 @@ |
} |
} |
-void AppList::ResetView() { |
+void AppListController::ResetView() { |
if (!view_) |
return; |
@@ -120,10 +152,10 @@ |
widget->GetNativeView()->GetRootWindow()->RemoveRootWindowObserver(this); |
view_ = NULL; |
- IconCache::GetInstance()->PurgeAllUnused(); |
+ app_list::IconCache::GetInstance()->PurgeAllUnused(); |
} |
-void AppList::ScheduleAnimation() { |
+void AppListController::ScheduleAnimation() { |
second_animation_timer_.Stop(); |
// Stop observing previous animation. |
@@ -141,19 +173,18 @@ |
FROM_HERE, |
base::TimeDelta::FromMilliseconds(kSecondAnimationStartDelay), |
this, |
- &AppList::ScheduleAppListAnimation); |
+ &AppListController::ScheduleAppListAnimation); |
} else { |
ScheduleAppListAnimation(); |
second_animation_timer_.Start( |
FROM_HERE, |
base::TimeDelta::FromMilliseconds(kSecondAnimationStartDelay), |
this, |
- &AppList::ScheduleBrowserWindowsAnimation); |
+ &AppListController::ScheduleBrowserWindowsAnimation); |
} |
- |
} |
-void AppList::ScheduleBrowserWindowsAnimationForContainer( |
+void AppListController::ScheduleBrowserWindowsAnimationForContainer( |
aura::Window* container) { |
DCHECK(container); |
ui::Layer* layer = container->layer(); |
@@ -174,19 +205,19 @@ |
ui::Transform()); |
} |
-void AppList::ScheduleBrowserWindowsAnimation() { |
+void AppListController::ScheduleBrowserWindowsAnimation() { |
// Note: containers could be NULL during Shell shutdown. |
aura::Window* default_container = Shell::GetInstance()->GetContainer( |
- internal::kShellWindowId_DefaultContainer); |
+ kShellWindowId_DefaultContainer); |
if (default_container) |
ScheduleBrowserWindowsAnimationForContainer(default_container); |
- aura::Window* always_on_top_container = Shell::GetInstance()->GetContainer( |
- internal::kShellWindowId_AlwaysOnTopContainer); |
+ aura::Window* always_on_top_container = Shell::GetInstance()-> |
+ GetContainer(kShellWindowId_AlwaysOnTopContainer); |
if (always_on_top_container) |
ScheduleBrowserWindowsAnimationForContainer(always_on_top_container); |
} |
-void AppList::ScheduleDimmingAnimation() { |
+void AppListController::ScheduleDimmingAnimation() { |
ui::Layer* layer = GetLayer(view_->GetWidget()); |
layer->GetAnimator()->StopAnimating(); |
@@ -201,7 +232,7 @@ |
layer->SetOpacity(is_visible_ ? 1.0 : 0.0); |
} |
-void AppList::ScheduleAppListAnimation() { |
+void AppListController::ScheduleAppListAnimation() { |
if (is_visible_) |
view_->AnimateShow(kAnimationDurationMs); |
else |
@@ -209,14 +240,14 @@ |
} |
//////////////////////////////////////////////////////////////////////////////// |
-// AppList, aura::EventFilter implementation: |
+// AppListController, aura::EventFilter implementation: |
-bool AppList::PreHandleKeyEvent(aura::Window* target, |
+bool AppListController::PreHandleKeyEvent(aura::Window* target, |
aura::KeyEvent* event) { |
tfarina
2012/05/09 00:35:18
nit: fix indentation here and below.
xiyuan
2012/05/09 01:28:46
Done.
|
return false; |
} |
-bool AppList::PreHandleMouseEvent(aura::Window* target, |
+bool AppListController::PreHandleMouseEvent(aura::Window* target, |
aura::MouseEvent* event) { |
if (view_ && is_visible_ && event->type() == ui::ET_MOUSE_PRESSED) { |
views::Widget* widget = view_->GetWidget(); |
@@ -227,31 +258,35 @@ |
return false; |
} |
-ui::TouchStatus AppList::PreHandleTouchEvent(aura::Window* target, |
+ui::TouchStatus AppListController::PreHandleTouchEvent(aura::Window* target, |
aura::TouchEvent* event) { |
return ui::TOUCH_STATUS_UNKNOWN; |
} |
-ui::GestureStatus AppList::PreHandleGestureEvent( |
+ui::GestureStatus AppListController::PreHandleGestureEvent( |
aura::Window* target, |
aura::GestureEvent* event) { |
return ui::GESTURE_STATUS_UNKNOWN; |
} |
//////////////////////////////////////////////////////////////////////////////// |
-// AppList, ura::RootWindowObserver implementation: |
-void AppList::OnRootWindowResized(const aura::RootWindow* root, |
+// AppListController, aura::RootWindowObserver implementation: |
+void AppListController::OnRootWindowResized(const aura::RootWindow* root, |
const gfx::Size& old_size) { |
- if (view_ && is_visible_) |
- view_->UpdateBounds(); |
+ if (view_ && is_visible_) { |
+ views::Widget* launcher_widget = |
+ Shell::GetInstance()->launcher()->widget(); |
+ view_->UpdateBounds(GetFullScreenBoundsForWidget(launcher_widget), |
+ GetWorkAreaBoundsForWidget(launcher_widget)); |
+ } |
} |
-void AppList::OnWindowFocused(aura::Window* window) { |
+void AppListController::OnWindowFocused(aura::Window* window) { |
if (view_ && is_visible_) { |
aura::Window* applist_container = Shell::GetInstance()->GetContainer( |
- internal::kShellWindowId_AppListContainer); |
+ kShellWindowId_AppListContainer); |
aura::Window* bubble_container = Shell::GetInstance()->GetContainer( |
- internal::kShellWindowId_SettingBubbleContainer); |
+ kShellWindowId_SettingBubbleContainer); |
if (window->parent() != applist_container && |
window->parent() != bubble_container) { |
SetVisible(false); |
@@ -260,9 +295,9 @@ |
} |
//////////////////////////////////////////////////////////////////////////////// |
-// AppList, ui::ImplicitAnimationObserver implementation: |
+// AppListController, ui::ImplicitAnimationObserver implementation: |
-void AppList::OnImplicitAnimationsCompleted() { |
+void AppListController::OnImplicitAnimationsCompleted() { |
if (is_visible_ ) |
view_->GetWidget()->Activate(); |
else |
@@ -270,9 +305,9 @@ |
} |
//////////////////////////////////////////////////////////////////////////////// |
-// AppList, views::Widget::Observer implementation: |
+// AppListController, views::Widget::Observer implementation: |
-void AppList::OnWidgetClosing(views::Widget* widget) { |
+void AppListController::OnWidgetClosing(views::Widget* widget) { |
DCHECK(view_->GetWidget() == widget); |
if (is_visible_) |
SetVisible(false); |