Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1174)

Unified Diff: ui/app_list/views/app_list_view.cc

Issue 645853013: Remove some platform specific stuff from views. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/app_list/views/app_list_view.h ('k') | ui/app_list/views/app_list_view_observer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/app_list/views/app_list_view.cc
diff --git a/ui/app_list/views/app_list_view.cc b/ui/app_list/views/app_list_view.cc
deleted file mode 100644
index c6b8896530e7f9758e2ba68044c177ad73940539..0000000000000000000000000000000000000000
--- a/ui/app_list/views/app_list_view.cc
+++ /dev/null
@@ -1,604 +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 "ui/app_list/views/app_list_view.h"
-
-#include <algorithm>
-
-#include "base/command_line.h"
-#include "base/metrics/histogram.h"
-#include "base/strings/string_util.h"
-#include "base/win/windows_version.h"
-#include "ui/app_list/app_list_constants.h"
-#include "ui/app_list/app_list_model.h"
-#include "ui/app_list/app_list_switches.h"
-#include "ui/app_list/app_list_view_delegate.h"
-#include "ui/app_list/speech_ui_model.h"
-#include "ui/app_list/views/app_list_background.h"
-#include "ui/app_list/views/app_list_folder_view.h"
-#include "ui/app_list/views/app_list_main_view.h"
-#include "ui/app_list/views/app_list_view_observer.h"
-#include "ui/app_list/views/apps_container_view.h"
-#include "ui/app_list/views/contents_view.h"
-#include "ui/app_list/views/search_box_view.h"
-#include "ui/app_list/views/speech_view.h"
-#include "ui/app_list/views/start_page_view.h"
-#include "ui/base/ui_base_switches.h"
-#include "ui/compositor/layer.h"
-#include "ui/compositor/layer_animation_observer.h"
-#include "ui/compositor/scoped_layer_animation_settings.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/image/image_skia.h"
-#include "ui/gfx/insets.h"
-#include "ui/gfx/path.h"
-#include "ui/gfx/skia_util.h"
-#include "ui/resources/grit/ui_resources.h"
-#include "ui/views/bubble/bubble_frame_view.h"
-#include "ui/views/controls/image_view.h"
-#include "ui/views/controls/textfield/textfield.h"
-#include "ui/views/layout/fill_layout.h"
-#include "ui/views/widget/widget.h"
-
-#if defined(USE_AURA)
-#include "ui/aura/window.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/views/bubble/bubble_window_targeter.h"
-#if defined(OS_WIN)
-#include "ui/base/win/shell.h"
-#endif
-#if !defined(OS_CHROMEOS)
-#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
-#endif
-#endif // defined(USE_AURA)
-
-namespace app_list {
-
-namespace {
-
-// The margin from the edge to the speech UI.
-const int kSpeechUIMargin = 12;
-
-// The vertical position for the appearing animation of the speech UI.
-const float kSpeechUIAppearingPosition = 12;
-
-// The distance between the arrow tip and edge of the anchor view.
-const int kArrowOffset = 10;
-
-// Determines whether the current environment supports shadows bubble borders.
-bool SupportsShadow() {
-#if defined(OS_WIN)
- // Shadows are not supported on Windows without Aero Glass.
- if (!ui::win::IsAeroGlassEnabled() ||
- CommandLine::ForCurrentProcess()->HasSwitch(
- ::switches::kDisableDwmComposition)) {
- return false;
- }
-#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
- // Shadows are not supported on (non-ChromeOS) Linux.
- return false;
-#endif
- return true;
-}
-
-// The background for the App List overlay, which appears as a white rounded
-// rectangle with the given radius and the same size as the target view.
-class AppListOverlayBackground : public views::Background {
- public:
- AppListOverlayBackground(int corner_radius)
- : corner_radius_(corner_radius) {};
- virtual ~AppListOverlayBackground() {};
-
- // Overridden from views::Background:
- virtual void Paint(gfx::Canvas* canvas, views::View* view) const override {
- SkPaint paint;
- paint.setStyle(SkPaint::kFill_Style);
- paint.setColor(SK_ColorWHITE);
- canvas->DrawRoundRect(view->GetContentsBounds(), corner_radius_, paint);
- }
-
- private:
- const int corner_radius_;
-
- DISALLOW_COPY_AND_ASSIGN(AppListOverlayBackground);
-};
-
-} // namespace
-
-// An animation observer to hide the view at the end of the animation.
-class HideViewAnimationObserver : public ui::ImplicitAnimationObserver {
- public:
- HideViewAnimationObserver()
- : frame_(NULL),
- target_(NULL) {
- }
-
- virtual ~HideViewAnimationObserver() {
- if (target_)
- StopObservingImplicitAnimations();
- }
-
- void SetTarget(views::View* target) {
- if (target_)
- StopObservingImplicitAnimations();
- target_ = target;
- }
-
- void set_frame(views::BubbleFrameView* frame) { frame_ = frame; }
-
- private:
- // Overridden from ui::ImplicitAnimationObserver:
- virtual void OnImplicitAnimationsCompleted() override {
- if (target_) {
- target_->SetVisible(false);
- target_ = NULL;
-
- // Should update the background by invoking SchedulePaint().
- if (frame_)
- frame_->SchedulePaint();
- }
- }
-
- views::BubbleFrameView* frame_;
- views::View* target_;
-
- DISALLOW_COPY_AND_ASSIGN(HideViewAnimationObserver);
-};
-
-////////////////////////////////////////////////////////////////////////////////
-// AppListView:
-
-AppListView::AppListView(AppListViewDelegate* delegate)
- : delegate_(delegate),
- app_list_main_view_(NULL),
- speech_view_(NULL),
- experimental_banner_view_(NULL),
- overlay_view_(NULL),
- animation_observer_(new HideViewAnimationObserver()) {
- CHECK(delegate);
-
- delegate_->AddObserver(this);
- delegate_->GetSpeechUI()->AddObserver(this);
-}
-
-AppListView::~AppListView() {
- delegate_->GetSpeechUI()->RemoveObserver(this);
- delegate_->RemoveObserver(this);
- animation_observer_.reset();
- // Remove child views first to ensure no remaining dependencies on delegate_.
- RemoveAllChildViews(true);
-}
-
-void AppListView::InitAsBubbleAttachedToAnchor(
- gfx::NativeView parent,
- int initial_apps_page,
- views::View* anchor,
- const gfx::Vector2d& anchor_offset,
- views::BubbleBorder::Arrow arrow,
- bool border_accepts_events) {
- SetAnchorView(anchor);
- InitAsBubbleInternal(
- parent, initial_apps_page, arrow, border_accepts_events, anchor_offset);
-}
-
-void AppListView::InitAsBubbleAtFixedLocation(
- gfx::NativeView parent,
- int initial_apps_page,
- const gfx::Point& anchor_point_in_screen,
- views::BubbleBorder::Arrow arrow,
- bool border_accepts_events) {
- SetAnchorView(NULL);
- SetAnchorRect(gfx::Rect(anchor_point_in_screen, gfx::Size()));
- InitAsBubbleInternal(
- parent, initial_apps_page, arrow, border_accepts_events, gfx::Vector2d());
-}
-
-void AppListView::SetBubbleArrow(views::BubbleBorder::Arrow arrow) {
- GetBubbleFrameView()->bubble_border()->set_arrow(arrow);
- SizeToContents(); // Recalcuates with new border.
- GetBubbleFrameView()->SchedulePaint();
-}
-
-void AppListView::SetAnchorPoint(const gfx::Point& anchor_point) {
- SetAnchorRect(gfx::Rect(anchor_point, gfx::Size()));
-}
-
-void AppListView::SetDragAndDropHostOfCurrentAppList(
- ApplicationDragAndDropHost* drag_and_drop_host) {
- app_list_main_view_->SetDragAndDropHostOfCurrentAppList(drag_and_drop_host);
-}
-
-void AppListView::ShowWhenReady() {
- app_list_main_view_->ShowAppListWhenReady();
-}
-
-void AppListView::Close() {
- app_list_main_view_->Close();
- delegate_->Dismiss();
-}
-
-void AppListView::UpdateBounds() {
- SizeToContents();
-}
-
-void AppListView::SetAppListOverlayVisible(bool visible) {
- DCHECK(overlay_view_);
-
- // Display the overlay immediately so we can begin the animation.
- overlay_view_->SetVisible(true);
-
- ui::ScopedLayerAnimationSettings settings(
- overlay_view_->layer()->GetAnimator());
- settings.SetTweenType(gfx::Tween::LINEAR);
-
- // If we're dismissing the overlay, hide the view at the end of the animation.
- if (!visible) {
- // Since only one animation is visible at a time, it's safe to re-use
- // animation_observer_ here.
- animation_observer_->set_frame(NULL);
- animation_observer_->SetTarget(overlay_view_);
- settings.AddObserver(animation_observer_.get());
- }
-
- const float kOverlayFadeInMilliseconds = 125;
- settings.SetTransitionDuration(
- base::TimeDelta::FromMilliseconds(kOverlayFadeInMilliseconds));
-
- const float kOverlayOpacity = 0.75f;
- overlay_view_->layer()->SetOpacity(visible ? kOverlayOpacity : 0.0f);
-}
-
-bool AppListView::ShouldCenterWindow() const {
- return delegate_->ShouldCenterWindow();
-}
-
-gfx::Size AppListView::GetPreferredSize() const {
- return app_list_main_view_->GetPreferredSize();
-}
-
-void AppListView::Paint(gfx::Canvas* canvas, const views::CullSet& cull_set) {
- views::BubbleDelegateView::Paint(canvas, cull_set);
- if (!next_paint_callback_.is_null()) {
- next_paint_callback_.Run();
- next_paint_callback_.Reset();
- }
-}
-
-void AppListView::OnThemeChanged() {
-#if defined(OS_WIN)
- GetWidget()->Close();
-#endif
-}
-
-bool AppListView::ShouldHandleSystemCommands() const {
- return true;
-}
-
-void AppListView::Prerender() {
- app_list_main_view_->Prerender();
-}
-
-void AppListView::OnProfilesChanged() {
- app_list_main_view_->search_box_view()->InvalidateMenu();
-}
-
-void AppListView::OnShutdown() {
- // Nothing to do on views - the widget will soon be closed, which will tear
- // everything down.
-}
-
-void AppListView::SetProfileByPath(const base::FilePath& profile_path) {
- delegate_->SetProfileByPath(profile_path);
- app_list_main_view_->ModelChanged();
-}
-
-void AppListView::AddObserver(AppListViewObserver* observer) {
- observers_.AddObserver(observer);
-}
-
-void AppListView::RemoveObserver(AppListViewObserver* observer) {
- observers_.RemoveObserver(observer);
-}
-
-// static
-void AppListView::SetNextPaintCallback(const base::Closure& callback) {
- next_paint_callback_ = callback;
-}
-
-#if defined(OS_WIN)
-HWND AppListView::GetHWND() const {
- gfx::NativeWindow window =
- GetWidget()->GetTopLevelWidget()->GetNativeWindow();
- return window->GetHost()->GetAcceleratedWidget();
-}
-#endif
-
-PaginationModel* AppListView::GetAppsPaginationModel() {
- return app_list_main_view_->contents_view()
- ->apps_container_view()
- ->apps_grid_view()
- ->pagination_model();
-}
-
-void AppListView::InitAsBubbleInternal(gfx::NativeView parent,
- int initial_apps_page,
- views::BubbleBorder::Arrow arrow,
- bool border_accepts_events,
- const gfx::Vector2d& anchor_offset) {
- base::Time start_time = base::Time::Now();
-
- app_list_main_view_ =
- new AppListMainView(delegate_, initial_apps_page, parent);
- AddChildView(app_list_main_view_);
- app_list_main_view_->SetPaintToLayer(true);
- app_list_main_view_->SetFillsBoundsOpaquely(false);
- app_list_main_view_->layer()->SetMasksToBounds(true);
-
- // Speech recognition is available only when the start page exists.
- if (delegate_ && delegate_->IsSpeechRecognitionEnabled()) {
- speech_view_ = new SpeechView(delegate_);
- speech_view_->SetVisible(false);
- speech_view_->SetPaintToLayer(true);
- speech_view_->SetFillsBoundsOpaquely(false);
- speech_view_->layer()->SetOpacity(0.0f);
- AddChildView(speech_view_);
- }
-
- if (app_list::switches::IsExperimentalAppListEnabled()) {
- // Draw a banner in the corner of the experimental app list.
- experimental_banner_view_ = new views::ImageView;
- const gfx::ImageSkia& experimental_icon =
- *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
- IDR_APP_LIST_EXPERIMENTAL_ICON);
- experimental_banner_view_->SetImage(experimental_icon);
- experimental_banner_view_->SetPaintToLayer(true);
- experimental_banner_view_->SetFillsBoundsOpaquely(false);
- AddChildView(experimental_banner_view_);
- }
-
- OnProfilesChanged();
- set_color(kContentsBackgroundColor);
- set_margins(gfx::Insets());
- set_parent_window(parent);
- set_close_on_deactivate(false);
- set_close_on_esc(false);
- set_anchor_view_insets(gfx::Insets(kArrowOffset + anchor_offset.y(),
- kArrowOffset + anchor_offset.x(),
- kArrowOffset - anchor_offset.y(),
- kArrowOffset - anchor_offset.x()));
- set_border_accepts_events(border_accepts_events);
- set_shadow(SupportsShadow() ? views::BubbleBorder::BIG_SHADOW
- : views::BubbleBorder::NO_SHADOW_OPAQUE_BORDER);
- views::BubbleDelegateView::CreateBubble(this);
- SetBubbleArrow(arrow);
-
-#if defined(USE_AURA)
- aura::Window* window = GetWidget()->GetNativeWindow();
- window->layer()->SetMasksToBounds(true);
- GetBubbleFrameView()->set_background(new AppListBackground(
- GetBubbleFrameView()->bubble_border()->GetBorderCornerRadius(),
- app_list_main_view_));
- set_background(NULL);
- window->SetEventTargeter(scoped_ptr<ui::EventTargeter>(
- new views::BubbleWindowTargeter(this)));
-#else
- set_background(new AppListBackground(
- GetBubbleFrameView()->bubble_border()->GetBorderCornerRadius(),
- app_list_main_view_));
-
- // On non-aura the bubble has two widgets, and it's possible for the border
- // to be shown independently in odd situations. Explicitly hide the bubble
- // widget to ensure that any WM_WINDOWPOSCHANGED messages triggered by the
- // window manager do not have the SWP_SHOWWINDOW flag set which would cause
- // the border to be shown. See http://crbug.com/231687 .
- GetWidget()->Hide();
-#endif
-
- // To make the overlay view, construct a view with a white background, rather
- // than a white rectangle in it. This is because we need overlay_view_ to be
- // drawn to its own layer (so it appears correctly in the foreground).
- overlay_view_ = new views::View();
- overlay_view_->SetPaintToLayer(true);
- overlay_view_->SetBoundsRect(GetContentsBounds());
- overlay_view_->SetVisible(false);
- overlay_view_->layer()->SetOpacity(0.0f);
- // On platforms that don't support a shadow, the rounded border of the app
- // list is constructed _inside_ the view, so a rectangular background goes
- // over the border in the rounded corners. To fix this, give the background a
- // corner radius 1px smaller than the outer border, so it just reaches but
- // doesn't cover it.
- const int kOverlayCornerRadius =
- GetBubbleFrameView()->bubble_border()->GetBorderCornerRadius();
- overlay_view_->set_background(new AppListOverlayBackground(
- kOverlayCornerRadius - (SupportsShadow() ? 0 : 1)));
- AddChildView(overlay_view_);
-
- if (delegate_)
- delegate_->ViewInitialized();
-
- UMA_HISTOGRAM_TIMES("Apps.AppListCreationTime",
- base::Time::Now() - start_time);
-}
-
-void AppListView::OnBeforeBubbleWidgetInit(
- views::Widget::InitParams* params,
- views::Widget* widget) const {
-#if defined(USE_AURA) && !defined(OS_CHROMEOS)
- if (delegate_ && delegate_->ForceNativeDesktop())
- params->native_widget = new views::DesktopNativeWidgetAura(widget);
-#endif
-#if defined(OS_WIN)
- // Windows 7 and higher offer pinning to the taskbar, but we need presence
- // on the taskbar for the user to be able to pin us. So, show the window on
- // the taskbar for these versions of Windows.
- if (base::win::GetVersion() >= base::win::VERSION_WIN7)
- params->force_show_in_taskbar = true;
-#elif defined(OS_LINUX)
- // Set up a custom WM_CLASS for the app launcher window. This allows task
- // switchers in X11 environments to distinguish it from main browser windows.
- params->wm_class_name = kAppListWMClass;
- // Show the window in the taskbar, even though it is a bubble, which would not
- // normally be shown.
- params->force_show_in_taskbar = true;
-#endif
-}
-
-views::View* AppListView::GetInitiallyFocusedView() {
- return app_list::switches::IsExperimentalAppListEnabled()
- ? app_list_main_view_->contents_view()
- ->start_page_view()
- ->dummy_search_box_view()
- ->search_box()
- : app_list_main_view_->search_box_view()->search_box();
-}
-
-gfx::ImageSkia AppListView::GetWindowIcon() {
- if (delegate_)
- return delegate_->GetWindowIcon();
-
- return gfx::ImageSkia();
-}
-
-bool AppListView::WidgetHasHitTestMask() const {
- return true;
-}
-
-void AppListView::GetWidgetHitTestMask(gfx::Path* mask) const {
- DCHECK(mask);
- mask->addRect(gfx::RectToSkRect(
- GetBubbleFrameView()->GetContentsBounds()));
-}
-
-bool AppListView::AcceleratorPressed(const ui::Accelerator& accelerator) {
- // The accelerator is added by BubbleDelegateView.
- if (accelerator.key_code() == ui::VKEY_ESCAPE) {
- if (app_list_main_view_->search_box_view()->HasSearch()) {
- app_list_main_view_->search_box_view()->ClearSearch();
- } else if (app_list_main_view_->contents_view()
- ->apps_container_view()
- ->IsInFolderView()) {
- app_list_main_view_->contents_view()
- ->apps_container_view()
- ->app_list_folder_view()
- ->CloseFolderPage();
- return true;
- } else {
- GetWidget()->Deactivate();
- Close();
- }
- return true;
- }
-
- return false;
-}
-
-void AppListView::Layout() {
- const gfx::Rect contents_bounds = GetContentsBounds();
- app_list_main_view_->SetBoundsRect(contents_bounds);
-
- if (speech_view_) {
- gfx::Rect speech_bounds = contents_bounds;
- int preferred_height = speech_view_->GetPreferredSize().height();
- speech_bounds.Inset(kSpeechUIMargin, kSpeechUIMargin);
- speech_bounds.set_height(std::min(speech_bounds.height(),
- preferred_height));
- speech_bounds.Inset(-speech_view_->GetInsets());
- speech_view_->SetBoundsRect(speech_bounds);
- }
-
- if (experimental_banner_view_) {
- // Position the experimental banner in the lower right corner.
- gfx::Rect image_bounds = experimental_banner_view_->GetImageBounds();
- image_bounds.set_origin(
- gfx::Point(contents_bounds.width() - image_bounds.width(),
- contents_bounds.height() - image_bounds.height()));
- experimental_banner_view_->SetBoundsRect(image_bounds);
- }
-}
-
-void AppListView::SchedulePaintInRect(const gfx::Rect& rect) {
- BubbleDelegateView::SchedulePaintInRect(rect);
- if (GetBubbleFrameView())
- GetBubbleFrameView()->SchedulePaint();
-}
-
-void AppListView::OnWidgetDestroying(views::Widget* widget) {
- BubbleDelegateView::OnWidgetDestroying(widget);
- if (delegate_ && widget == GetWidget())
- delegate_->ViewClosing();
-}
-
-void AppListView::OnWidgetActivationChanged(views::Widget* widget,
- bool active) {
- // Do not called inherited function as the bubble delegate auto close
- // functionality is not used.
- if (widget == GetWidget())
- FOR_EACH_OBSERVER(AppListViewObserver, observers_,
- OnActivationChanged(widget, active));
-}
-
-void AppListView::OnWidgetVisibilityChanged(views::Widget* widget,
- bool visible) {
- BubbleDelegateView::OnWidgetVisibilityChanged(widget, visible);
-
- if (widget != GetWidget())
- return;
-
- if (!visible)
- app_list_main_view_->ResetForShow();
-}
-
-void AppListView::OnSpeechRecognitionStateChanged(
- SpeechRecognitionState new_state) {
- if (!speech_view_)
- return;
-
- bool will_appear = (new_state == SPEECH_RECOGNITION_RECOGNIZING ||
- new_state == SPEECH_RECOGNITION_IN_SPEECH ||
- new_state == SPEECH_RECOGNITION_NETWORK_ERROR);
- // No change for this class.
- if (speech_view_->visible() == will_appear)
- return;
-
- if (will_appear)
- speech_view_->Reset();
-
- animation_observer_->set_frame(GetBubbleFrameView());
- gfx::Transform speech_transform;
- speech_transform.Translate(
- 0, SkFloatToMScalar(kSpeechUIAppearingPosition));
- if (will_appear)
- speech_view_->layer()->SetTransform(speech_transform);
-
- {
- ui::ScopedLayerAnimationSettings main_settings(
- app_list_main_view_->layer()->GetAnimator());
- if (will_appear) {
- animation_observer_->SetTarget(app_list_main_view_);
- main_settings.AddObserver(animation_observer_.get());
- }
- app_list_main_view_->layer()->SetOpacity(will_appear ? 0.0f : 1.0f);
- }
-
- {
- ui::ScopedLayerAnimationSettings speech_settings(
- speech_view_->layer()->GetAnimator());
- if (!will_appear) {
- animation_observer_->SetTarget(speech_view_);
- speech_settings.AddObserver(animation_observer_.get());
- }
-
- speech_view_->layer()->SetOpacity(will_appear ? 1.0f : 0.0f);
- if (will_appear)
- speech_view_->layer()->SetTransform(gfx::Transform());
- else
- speech_view_->layer()->SetTransform(speech_transform);
- }
-
- if (will_appear)
- speech_view_->SetVisible(true);
- else
- app_list_main_view_->SetVisible(true);
-}
-
-} // namespace app_list
« no previous file with comments | « ui/app_list/views/app_list_view.h ('k') | ui/app_list/views/app_list_view_observer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698