Index: ash/app_list/app_list_view.cc |
=================================================================== |
--- ash/app_list/app_list_view.cc (revision 135932) |
+++ ash/app_list/app_list_view.cc (working copy) |
@@ -1,288 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// 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_view.h" |
- |
-#include "ash/app_list/app_list.h" |
-#include "ash/app_list/app_list_bubble_border.h" |
-#include "ash/app_list/app_list_item_view.h" |
-#include "ash/app_list/app_list_model.h" |
-#include "ash/app_list/app_list_model_view.h" |
-#include "ash/app_list/app_list_view_delegate.h" |
-#include "ash/app_list/page_switcher.h" |
-#include "ash/app_list/pagination_model.h" |
-#include "ash/launcher/launcher.h" |
-#include "ash/screen_ash.h" |
-#include "ash/shell.h" |
-#include "ash/shell_window_ids.h" |
-#include "ash/wm/shelf_layout_manager.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" |
-#include "ui/views/background.h" |
-#include "ui/views/bubble/bubble_frame_view.h" |
-#include "ui/views/layout/box_layout.h" |
-#include "ui/views/widget/widget.h" |
- |
-namespace ash { |
- |
-namespace { |
- |
-// 0.2 black |
-const SkColor kWidgetBackgroundColor = SkColorSetARGB(0x33, 0, 0, 0); |
- |
-const float kModelViewAnimationScaleFactor = 0.9f; |
- |
-const int kPreferredIconDimension = 48; |
-const int kPreferredCols = 4; |
-const int kPreferredRows = 4; |
-// Padding space in pixels between model view and page switcher footer. |
-const int kModelViewFooterPadding = 10; |
- |
-ui::Transform GetScaleTransform(AppListModelView* model_view) { |
- gfx::Rect pixel_bounds = model_view->GetLayerBoundsInPixel(); |
- gfx::Point center(pixel_bounds.width() / 2, pixel_bounds.height() / 2); |
- return ui::GetScaleTransform(center, kModelViewAnimationScaleFactor); |
-} |
- |
-// Bounds returned is used for full screen mode. Use full monitor rect so that |
-// the app list shade goes behind the launcher. |
-gfx::Rect GetFullScreenBounds() { |
- gfx::Point cursor = gfx::Screen::GetCursorScreenPoint(); |
- return gfx::Screen::GetMonitorNearestPoint(cursor).bounds(); |
-} |
- |
-} // namespace |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// AppListView: |
- |
-AppListView::AppListView(AppListViewDelegate* delegate) |
- : delegate_(delegate), |
- pagination_model_(new PaginationModel), |
- bubble_style_(false), |
- bubble_border_(NULL), |
- model_view_(NULL) { |
- if (internal::AppList::UseAppListV2()) |
- InitAsBubble(); |
- else |
- InitAsFullscreenWidget(); |
-} |
- |
-AppListView::~AppListView() { |
- // Model is going away, so set to NULL before superclass deletes child views. |
- if (model_view_) |
- model_view_->SetModel(NULL); |
-} |
- |
-void AppListView::AnimateShow(int duration_ms) { |
- if (bubble_style_) |
- return; |
- |
- ui::Layer* layer = model_view_->layer(); |
- ui::ScopedLayerAnimationSettings animation(layer->GetAnimator()); |
- animation.SetTransitionDuration( |
- base::TimeDelta::FromMilliseconds(duration_ms)); |
- animation.SetTweenType(ui::Tween::EASE_OUT); |
- model_view_->SetTransform(ui::Transform()); |
-} |
- |
-void AppListView::AnimateHide(int duration_ms) { |
- if (bubble_style_) |
- return; |
- |
- ui::Layer* layer = model_view_->layer(); |
- ui::ScopedLayerAnimationSettings animation(layer->GetAnimator()); |
- animation.SetTransitionDuration( |
- base::TimeDelta::FromMilliseconds(duration_ms)); |
- animation.SetTweenType(ui::Tween::EASE_IN); |
- model_view_->SetTransform(GetScaleTransform(model_view_)); |
-} |
- |
-void AppListView::Close() { |
- if (GetWidget()->IsVisible()) |
- Shell::GetInstance()->ToggleAppList(); |
-} |
- |
-void AppListView::UpdateBounds() { |
- if (bubble_style_) |
- SizeToContents(); |
- else |
- GetWidget()->SetBounds(GetFullScreenBounds()); |
-} |
- |
-void AppListView::InitAsFullscreenWidget() { |
- bubble_style_ = false; |
- set_background(views::Background::CreateSolidBackground( |
- kWidgetBackgroundColor)); |
- |
- model_view_ = new AppListModelView(this, pagination_model_.get()); |
- model_view_->SetPaintToLayer(true); |
- model_view_->layer()->SetFillsBoundsOpaquely(false); |
- AddChildView(model_view_); |
- |
- views::Widget::InitParams widget_params( |
- views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
- widget_params.delegate = this; |
- widget_params.transparent = true; |
- widget_params.parent = Shell::GetInstance()->GetContainer( |
- internal::kShellWindowId_AppListContainer); |
- |
- views::Widget* widget = new views::Widget; |
- widget->Init(widget_params); |
- widget->SetContentsView(this); |
- |
- widget->SetBounds(GetFullScreenBounds()); |
- |
- // Turns off default animation. |
- widget->SetVisibilityChangedAnimationsEnabled(false); |
- |
- // Sets initial transform. AnimateShow changes it back to identity transform. |
- model_view_->SetTransform(GetScaleTransform(model_view_)); |
- UpdateModel(); |
-} |
- |
-void AppListView::InitAsBubble() { |
- bubble_style_ = true; |
- set_background(NULL); |
- |
- SetLayoutManager(new views::BoxLayout( |
- views::BoxLayout::kVertical, 0, 0, kModelViewFooterPadding)); |
- |
- model_view_ = new AppListModelView(this, pagination_model_.get()); |
- model_view_->SetLayout(kPreferredIconDimension, |
- kPreferredCols, |
- kPreferredRows); |
- AddChildView(model_view_); |
- |
- PageSwitcher* page_switcher = new PageSwitcher(pagination_model_.get()); |
- AddChildView(page_switcher); |
- |
- set_anchor_view(Shell::GetInstance()->launcher()->GetAppListButtonView()); |
- set_parent_window(Shell::GetInstance()->GetContainer( |
- internal::kShellWindowId_AppListContainer)); |
- set_close_on_deactivate(false); |
- views::BubbleDelegateView::CreateBubble(this); |
- |
- // Resets default background since AppListBubbleBorder paints background. |
- GetBubbleFrameView()->set_background(NULL); |
- |
- // Overrides border with AppListBubbleBorder. |
- bubble_border_ = new AppListBubbleBorder(this); |
- GetBubbleFrameView()->SetBubbleBorder(bubble_border_); |
- SizeToContents(); // Recalcuates with new border. |
- |
- UpdateModel(); |
-} |
- |
-void AppListView::UpdateModel() { |
- if (delegate_.get()) { |
- scoped_ptr<AppListModel> new_model(new AppListModel); |
- delegate_->SetModel(new_model.get()); |
- delegate_->UpdateModel(std::string()); |
- model_view_->SetModel(new_model.get()); |
- model_.reset(new_model.release()); |
- } |
-} |
- |
-views::View* AppListView::GetInitiallyFocusedView() { |
- return model_view_; |
-} |
- |
-void AppListView::Layout() { |
- gfx::Rect rect(GetContentsBounds()); |
- if (rect.IsEmpty()) |
- return; |
- |
- if (bubble_style_) { |
- views::View::Layout(); |
- } else { |
- // Gets work area rect, which is in screen coordinates. |
- gfx::Rect workarea = Shell::GetInstance()->shelf()->IsVisible() ? |
- ScreenAsh::GetUnmaximizedWorkAreaBounds(GetWidget()->GetNativeView()) : |
- gfx::Screen::GetMonitorNearestWindow( |
- GetWidget()->GetNativeView()).work_area(); |
- |
- // Converts |workarea| into view's coordinates. |
- gfx::Point origin(workarea.origin()); |
- views::View::ConvertPointFromScreen(this, &origin); |
- workarea.Offset(-origin.x(), -origin.y()); |
- |
- rect = rect.Intersect(workarea); |
- model_view_->SetBoundsRect(rect); |
- } |
-} |
- |
-bool AppListView::OnKeyPressed(const views::KeyEvent& event) { |
- if (event.key_code() == ui::VKEY_ESCAPE) { |
- Close(); |
- return true; |
- } |
- |
- return false; |
-} |
- |
-bool AppListView::OnMousePressed(const views::MouseEvent& event) { |
- // For full screen mode, if mouse click reaches us, this means user clicks |
- // on blank area. So close. |
- if (!bubble_style_) |
- Close(); |
- |
- return true; |
-} |
- |
-void AppListView::ButtonPressed(views::Button* sender, |
- const views::Event& event) { |
- if (sender->GetClassName() != AppListItemView::kViewClassName) |
- return; |
- |
- if (delegate_.get()) { |
- delegate_->OnAppListItemActivated( |
- static_cast<AppListItemView*>(sender)->model(), |
- event.flags()); |
- } |
- Close(); |
-} |
- |
-gfx::Rect AppListView::GetBubbleBounds() { |
- // This happens before replacing the default border. |
- if (!bubble_border_) |
- return views::BubbleDelegateView::GetBubbleBounds(); |
- |
- const int old_arrow_offset = bubble_border_->arrow_offset(); |
- const gfx::Rect anchor_rect = GetAnchorRect(); |
- |
- bubble_border_->set_arrow_offset(0); |
- gfx::Rect bubble_rect = GetBubbleFrameView()->GetUpdatedWindowBounds( |
- anchor_rect, |
- GetPreferredSize(), |
- false /* try_mirroring_arrow */); |
- |
- gfx::Rect monitor_rect = gfx::Screen::GetMonitorNearestPoint( |
- anchor_rect.CenterPoint()).work_area(); |
- if (monitor_rect.IsEmpty() || monitor_rect.Contains(bubble_rect)) |
- return bubble_rect; |
- |
- int offset = 0; |
- if (bubble_rect.x() < monitor_rect.x()) |
- offset = monitor_rect.x() - bubble_rect.x(); |
- else if (bubble_rect.right() > monitor_rect.right()) |
- offset = monitor_rect.right() - bubble_rect.right(); |
- |
- bubble_rect.set_x(bubble_rect.x() + offset); |
- |
- // Moves bubble arrow in the opposite direction. i.e. If bubble bounds is |
- // moved to right (positive offset), we need to move arrow to left so that |
- // it points to the same position before the move. |
- bubble_border_->set_arrow_offset(-offset); |
- |
- // Repaints border if arrow offset is changed. |
- if (bubble_border_->arrow_offset() != old_arrow_offset) |
- GetBubbleFrameView()->SchedulePaint(); |
- |
- return bubble_rect; |
-} |
- |
-} // namespace ash |