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

Unified Diff: ash/frame/custom_frame_view_ash.cc

Issue 2222653002: Moves CustomFrameViewAsh to common (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: merge Created 4 years, 4 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 | « ash/frame/custom_frame_view_ash.h ('k') | ash/frame/custom_frame_view_ash_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/frame/custom_frame_view_ash.cc
diff --git a/ash/frame/custom_frame_view_ash.cc b/ash/frame/custom_frame_view_ash.cc
deleted file mode 100644
index a73ac622eb79f4cb3f26eabf556d770decf74b18..0000000000000000000000000000000000000000
--- a/ash/frame/custom_frame_view_ash.cc
+++ /dev/null
@@ -1,612 +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/frame/custom_frame_view_ash.h"
-
-#include <algorithm>
-#include <vector>
-
-#include "ash/aura/wm_window_aura.h"
-#include "ash/common/ash_switches.h"
-#include "ash/common/frame/caption_buttons/frame_caption_button_container_view.h"
-#include "ash/common/frame/default_header_painter.h"
-#include "ash/common/frame/frame_border_hit_test.h"
-#include "ash/common/frame/header_painter.h"
-#include "ash/common/material_design/material_design_controller.h"
-#include "ash/common/session/session_state_delegate.h"
-#include "ash/common/shell_observer.h"
-#include "ash/common/wm/window_state.h"
-#include "ash/common/wm/window_state_delegate.h"
-#include "ash/common/wm/window_state_observer.h"
-#include "ash/common/wm_lookup.h"
-#include "ash/common/wm_shell.h"
-#include "ash/frame/frame_border_hit_test_controller.h"
-#include "ash/wm/immersive_fullscreen_controller.h"
-#include "ash/wm/window_state_aura.h"
-#include "base/command_line.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_observer.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/rect_conversions.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/gfx/image/image.h"
-#include "ui/views/controls/image_view.h"
-#include "ui/views/view.h"
-#include "ui/views/view_targeter.h"
-#include "ui/views/widget/widget.h"
-#include "ui/views/widget/widget_delegate.h"
-
-namespace {
-
-///////////////////////////////////////////////////////////////////////////////
-// CustomFrameViewAshWindowStateDelegate
-
-// Handles a user's fullscreen request (Shift+F4/F4). Puts the window into
-// immersive fullscreen if immersive fullscreen is enabled for non-browser
-// windows.
-class CustomFrameViewAshWindowStateDelegate
- : public ash::wm::WindowStateDelegate,
- public ash::wm::WindowStateObserver,
- public aura::WindowObserver {
- public:
- CustomFrameViewAshWindowStateDelegate(
- ash::wm::WindowState* window_state,
- ash::CustomFrameViewAsh* custom_frame_view)
- : window_state_(NULL) {
- immersive_fullscreen_controller_.reset(
- new ash::ImmersiveFullscreenController);
- custom_frame_view->InitImmersiveFullscreenControllerForView(
- immersive_fullscreen_controller_.get());
-
- // Add a window state observer to exit fullscreen properly in case
- // fullscreen is exited without going through
- // WindowState::ToggleFullscreen(). This is the case when exiting
- // immersive fullscreen via the "Restore" window control.
- // TODO(pkotwicz): This is a hack. Remove ASAP. http://crbug.com/319048
- window_state_ = window_state;
- window_state_->AddObserver(this);
- GetAuraWindow()->AddObserver(this);
- }
- ~CustomFrameViewAshWindowStateDelegate() override {
- if (window_state_) {
- window_state_->RemoveObserver(this);
- GetAuraWindow()->RemoveObserver(this);
- }
- }
-
- private:
- aura::Window* GetAuraWindow() {
- return ash::WmWindowAura::GetAuraWindow(window_state_->window());
- }
-
- // Overridden from ash::wm::WindowStateDelegate:
- bool ToggleFullscreen(ash::wm::WindowState* window_state) override {
- bool enter_fullscreen = !window_state->IsFullscreen();
- if (enter_fullscreen) {
- GetAuraWindow()->SetProperty(aura::client::kShowStateKey,
- ui::SHOW_STATE_FULLSCREEN);
- } else {
- window_state->Restore();
- }
- if (immersive_fullscreen_controller_) {
- immersive_fullscreen_controller_->SetEnabled(
- ash::ImmersiveFullscreenController::WINDOW_TYPE_OTHER,
- enter_fullscreen);
- }
- return true;
- }
- // Overridden from aura::WindowObserver:
- void OnWindowDestroying(aura::Window* window) override {
- window_state_->RemoveObserver(this);
- GetAuraWindow()->RemoveObserver(this);
- window_state_ = NULL;
- }
- // Overridden from ash::wm::WindowStateObserver:
- void OnPostWindowStateTypeChange(ash::wm::WindowState* window_state,
- ash::wm::WindowStateType old_type) override {
- if (!window_state->IsFullscreen() && !window_state->IsMinimized() &&
- immersive_fullscreen_controller_.get() &&
- immersive_fullscreen_controller_->IsEnabled()) {
- immersive_fullscreen_controller_->SetEnabled(
- ash::ImmersiveFullscreenController::WINDOW_TYPE_OTHER, false);
- }
- }
-
- ash::wm::WindowState* window_state_;
- std::unique_ptr<ash::ImmersiveFullscreenController>
- immersive_fullscreen_controller_;
-
- DISALLOW_COPY_AND_ASSIGN(CustomFrameViewAshWindowStateDelegate);
-};
-
-} // namespace
-
-namespace ash {
-
-///////////////////////////////////////////////////////////////////////////////
-// CustomFrameViewAsh::HeaderView
-
-// View which paints the header. It slides off and on screen in immersive
-// fullscreen.
-class CustomFrameViewAsh::HeaderView
- : public views::View,
- public ImmersiveFullscreenController::Delegate,
- public ShellObserver {
- public:
- // |frame| is the widget that the caption buttons act on.
- explicit HeaderView(views::Widget* frame);
- ~HeaderView() override;
-
- // Schedules a repaint for the entire title.
- void SchedulePaintForTitle();
-
- // Tells the window controls to reset themselves to the normal state.
- void ResetWindowControls();
-
- // Returns the amount of the view's pixels which should be on screen.
- int GetPreferredOnScreenHeight() const;
-
- // Returns the view's preferred height.
- int GetPreferredHeight() const;
-
- // Returns the view's minimum width.
- int GetMinimumWidth() const;
-
- void UpdateAvatarIcon();
-
- void SizeConstraintsChanged();
-
- void SetFrameColors(SkColor active_frame_color, SkColor inactive_frame_color);
-
- // views::View:
- void Layout() override;
- void OnPaint(gfx::Canvas* canvas) override;
- void ChildPreferredSizeChanged(views::View* child) override;
-
- // ShellObserver:
- void OnOverviewModeStarting() override;
- void OnOverviewModeEnded() override;
- void OnMaximizeModeStarted() override;
- void OnMaximizeModeEnded() override;
-
- FrameCaptionButtonContainerView* caption_button_container() {
- return caption_button_container_;
- }
-
- views::View* avatar_icon() const { return avatar_icon_; }
-
- private:
- // ImmersiveFullscreenController::Delegate:
- void OnImmersiveRevealStarted() override;
- void OnImmersiveRevealEnded() override;
- void OnImmersiveFullscreenExited() override;
- void SetVisibleFraction(double visible_fraction) override;
- std::vector<gfx::Rect> GetVisibleBoundsInScreen() const override;
-
- // The widget that the caption buttons act on.
- views::Widget* frame_;
-
- // Helper for painting the header.
- std::unique_ptr<DefaultHeaderPainter> header_painter_;
-
- views::ImageView* avatar_icon_;
-
- // View which contains the window caption buttons.
- FrameCaptionButtonContainerView* caption_button_container_;
-
- // The fraction of the header's height which is visible while in fullscreen.
- // This value is meaningless when not in fullscreen.
- double fullscreen_visible_fraction_;
-
- DISALLOW_COPY_AND_ASSIGN(HeaderView);
-};
-
-CustomFrameViewAsh::HeaderView::HeaderView(views::Widget* frame)
- : frame_(frame),
- header_painter_(new ash::DefaultHeaderPainter),
- avatar_icon_(NULL),
- caption_button_container_(NULL),
- fullscreen_visible_fraction_(0) {
- caption_button_container_ = new FrameCaptionButtonContainerView(frame_);
- caption_button_container_->UpdateSizeButtonVisibility();
- AddChildView(caption_button_container_);
-
- header_painter_->Init(frame_, this, caption_button_container_);
- UpdateAvatarIcon();
-
- WmShell::Get()->AddShellObserver(this);
-}
-
-CustomFrameViewAsh::HeaderView::~HeaderView() {
- WmShell::Get()->RemoveShellObserver(this);
-}
-
-void CustomFrameViewAsh::HeaderView::SchedulePaintForTitle() {
- header_painter_->SchedulePaintForTitle();
-}
-
-void CustomFrameViewAsh::HeaderView::ResetWindowControls() {
- caption_button_container_->ResetWindowControls();
-}
-
-int CustomFrameViewAsh::HeaderView::GetPreferredOnScreenHeight() const {
- if (frame_->IsFullscreen()) {
- return static_cast<int>(GetPreferredHeight() *
- fullscreen_visible_fraction_);
- }
- return GetPreferredHeight();
-}
-
-int CustomFrameViewAsh::HeaderView::GetPreferredHeight() const {
- return header_painter_->GetHeaderHeightForPainting();
-}
-
-int CustomFrameViewAsh::HeaderView::GetMinimumWidth() const {
- return header_painter_->GetMinimumHeaderWidth();
-}
-
-void CustomFrameViewAsh::HeaderView::UpdateAvatarIcon() {
- SessionStateDelegate* delegate = WmShell::Get()->GetSessionStateDelegate();
- WmWindow* window = WmLookup::Get()->GetWindowForWidget(frame_);
- bool show = delegate->ShouldShowAvatar(window);
- if (!show) {
- if (!avatar_icon_)
- return;
- delete avatar_icon_;
- avatar_icon_ = NULL;
- } else {
- gfx::ImageSkia image = delegate->GetAvatarImageForWindow(window);
- DCHECK_EQ(image.width(), image.height());
- if (!avatar_icon_) {
- avatar_icon_ = new views::ImageView();
- AddChildView(avatar_icon_);
- }
- avatar_icon_->SetImage(image);
- }
- header_painter_->UpdateLeftHeaderView(avatar_icon_);
- Layout();
-}
-
-void CustomFrameViewAsh::HeaderView::SizeConstraintsChanged() {
- caption_button_container_->ResetWindowControls();
- caption_button_container_->UpdateSizeButtonVisibility();
- Layout();
-}
-
-void CustomFrameViewAsh::HeaderView::SetFrameColors(
- SkColor active_frame_color,
- SkColor inactive_frame_color) {
- header_painter_->SetFrameColors(active_frame_color, inactive_frame_color);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CustomFrameViewAsh::HeaderView, views::View overrides:
-
-void CustomFrameViewAsh::HeaderView::Layout() {
- header_painter_->LayoutHeader();
-}
-
-void CustomFrameViewAsh::HeaderView::OnPaint(gfx::Canvas* canvas) {
- bool paint_as_active =
- frame_->non_client_view()->frame_view()->ShouldPaintAsActive();
- caption_button_container_->SetPaintAsActive(paint_as_active);
-
- HeaderPainter::Mode header_mode = paint_as_active
- ? HeaderPainter::MODE_ACTIVE
- : HeaderPainter::MODE_INACTIVE;
- header_painter_->PaintHeader(canvas, header_mode);
-}
-
-void CustomFrameViewAsh::HeaderView::ChildPreferredSizeChanged(
- views::View* child) {
- // FrameCaptionButtonContainerView animates the visibility changes in
- // UpdateSizeButtonVisibility(false). Due to this a new size is not available
- // until the completion of the animation. Layout in response to the preferred
- // size changes.
- if (child != caption_button_container_)
- return;
- parent()->Layout();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CustomFrameViewAsh::HeaderView, ShellObserver overrides:
-
-void CustomFrameViewAsh::HeaderView::OnOverviewModeStarting() {
- if (ash::MaterialDesignController::IsOverviewMaterial())
- caption_button_container_->SetVisible(false);
-}
-
-void CustomFrameViewAsh::HeaderView::OnOverviewModeEnded() {
- if (ash::MaterialDesignController::IsOverviewMaterial())
- caption_button_container_->SetVisible(true);
-}
-
-void CustomFrameViewAsh::HeaderView::OnMaximizeModeStarted() {
- caption_button_container_->UpdateSizeButtonVisibility();
- parent()->Layout();
-}
-
-void CustomFrameViewAsh::HeaderView::OnMaximizeModeEnded() {
- caption_button_container_->UpdateSizeButtonVisibility();
- parent()->Layout();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CustomFrameViewAsh::HeaderView,
-// ImmersiveFullscreenController::Delegate overrides:
-
-void CustomFrameViewAsh::HeaderView::OnImmersiveRevealStarted() {
- fullscreen_visible_fraction_ = 0;
- SetPaintToLayer(true);
- layer()->SetFillsBoundsOpaquely(false);
- parent()->Layout();
-}
-
-void CustomFrameViewAsh::HeaderView::OnImmersiveRevealEnded() {
- fullscreen_visible_fraction_ = 0;
- SetPaintToLayer(false);
- parent()->Layout();
-}
-
-void CustomFrameViewAsh::HeaderView::OnImmersiveFullscreenExited() {
- fullscreen_visible_fraction_ = 0;
- SetPaintToLayer(false);
- parent()->Layout();
-}
-
-void CustomFrameViewAsh::HeaderView::SetVisibleFraction(
- double visible_fraction) {
- if (fullscreen_visible_fraction_ != visible_fraction) {
- fullscreen_visible_fraction_ = visible_fraction;
- parent()->Layout();
- }
-}
-
-std::vector<gfx::Rect>
-CustomFrameViewAsh::HeaderView::GetVisibleBoundsInScreen() const {
- // TODO(pkotwicz): Implement views::View::ConvertRectToScreen().
- gfx::Rect visible_bounds(GetVisibleBounds());
- gfx::Point visible_origin_in_screen(visible_bounds.origin());
- views::View::ConvertPointToScreen(this, &visible_origin_in_screen);
- std::vector<gfx::Rect> bounds_in_screen;
- bounds_in_screen.push_back(
- gfx::Rect(visible_origin_in_screen, visible_bounds.size()));
- return bounds_in_screen;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CustomFrameViewAsh::OverlayView
-
-// View which takes up the entire widget and contains the HeaderView. HeaderView
-// is a child of OverlayView to avoid creating a larger texture than necessary
-// when painting the HeaderView to its own layer.
-class CustomFrameViewAsh::OverlayView : public views::View,
- public views::ViewTargeterDelegate {
- public:
- explicit OverlayView(HeaderView* header_view);
- ~OverlayView() override;
-
- // views::View:
- void Layout() override;
-
- private:
- // views::ViewTargeterDelegate:
- bool DoesIntersectRect(const views::View* target,
- const gfx::Rect& rect) const override;
-
- HeaderView* header_view_;
-
- DISALLOW_COPY_AND_ASSIGN(OverlayView);
-};
-
-CustomFrameViewAsh::OverlayView::OverlayView(HeaderView* header_view)
- : header_view_(header_view) {
- AddChildView(header_view);
- SetEventTargeter(
- std::unique_ptr<views::ViewTargeter>(new views::ViewTargeter(this)));
-}
-
-CustomFrameViewAsh::OverlayView::~OverlayView() {}
-
-///////////////////////////////////////////////////////////////////////////////
-// CustomFrameViewAsh::OverlayView, views::View overrides:
-
-void CustomFrameViewAsh::OverlayView::Layout() {
- // Layout |header_view_| because layout affects the result of
- // GetPreferredOnScreenHeight().
- header_view_->Layout();
-
- int onscreen_height = header_view_->GetPreferredOnScreenHeight();
- if (onscreen_height == 0) {
- header_view_->SetVisible(false);
- } else {
- int height = header_view_->GetPreferredHeight();
- header_view_->SetBounds(0, onscreen_height - height, width(), height);
- header_view_->SetVisible(true);
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// CustomFrameViewAsh::OverlayView, views::ViewTargeterDelegate overrides:
-
-bool CustomFrameViewAsh::OverlayView::DoesIntersectRect(
- const views::View* target,
- const gfx::Rect& rect) const {
- CHECK_EQ(target, this);
- // Grab events in the header view. Return false for other events so that they
- // can be handled by the client view.
- return header_view_->HitTestRect(rect);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// CustomFrameViewAsh, public:
-
-// static
-const char CustomFrameViewAsh::kViewClassName[] = "CustomFrameViewAsh";
-
-CustomFrameViewAsh::CustomFrameViewAsh(views::Widget* frame)
- : frame_(frame),
- header_view_(new HeaderView(frame)),
- frame_border_hit_test_controller_(
- new FrameBorderHitTestController(frame_)) {
- // |header_view_| is set as the non client view's overlay view so that it can
- // overlay the web contents in immersive fullscreen.
- frame->non_client_view()->SetOverlayView(new OverlayView(header_view_));
-
- // A delegate for a more complex way of fullscreening the window may already
- // be set. This is the case for packaged apps.
- wm::WindowState* window_state = wm::GetWindowState(frame->GetNativeWindow());
- if (!window_state->HasDelegate()) {
- window_state->SetDelegate(std::unique_ptr<wm::WindowStateDelegate>(
- new CustomFrameViewAshWindowStateDelegate(window_state, this)));
- }
-}
-
-CustomFrameViewAsh::~CustomFrameViewAsh() {}
-
-void CustomFrameViewAsh::InitImmersiveFullscreenControllerForView(
- ImmersiveFullscreenController* immersive_fullscreen_controller) {
- immersive_fullscreen_controller->Init(header_view_, frame_, header_view_);
-}
-
-void CustomFrameViewAsh::SetFrameColors(SkColor active_frame_color,
- SkColor inactive_frame_color) {
- header_view_->SetFrameColors(active_frame_color, inactive_frame_color);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// CustomFrameViewAsh, views::NonClientFrameView overrides:
-
-gfx::Rect CustomFrameViewAsh::GetBoundsForClientView() const {
- gfx::Rect client_bounds = bounds();
- client_bounds.Inset(0, NonClientTopBorderHeight(), 0, 0);
- return client_bounds;
-}
-
-gfx::Rect CustomFrameViewAsh::GetWindowBoundsForClientBounds(
- const gfx::Rect& client_bounds) const {
- gfx::Rect window_bounds = client_bounds;
- window_bounds.Inset(0, -NonClientTopBorderHeight(), 0, 0);
- return window_bounds;
-}
-
-int CustomFrameViewAsh::NonClientHitTest(const gfx::Point& point) {
- return FrameBorderNonClientHitTest(
- this, header_view_->caption_button_container(), point);
-}
-
-void CustomFrameViewAsh::GetWindowMask(const gfx::Size& size,
- gfx::Path* window_mask) {
- // No window masks in Aura.
-}
-
-void CustomFrameViewAsh::ResetWindowControls() {
- header_view_->ResetWindowControls();
-}
-
-void CustomFrameViewAsh::UpdateWindowIcon() {}
-
-void CustomFrameViewAsh::UpdateWindowTitle() {
- header_view_->SchedulePaintForTitle();
-}
-
-void CustomFrameViewAsh::SizeConstraintsChanged() {
- header_view_->SizeConstraintsChanged();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// CustomFrameViewAsh, views::View overrides:
-
-gfx::Size CustomFrameViewAsh::GetPreferredSize() const {
- gfx::Size pref = frame_->client_view()->GetPreferredSize();
- gfx::Rect bounds(0, 0, pref.width(), pref.height());
- return frame_->non_client_view()
- ->GetWindowBoundsForClientBounds(bounds)
- .size();
-}
-
-void CustomFrameViewAsh::Layout() {
- views::NonClientFrameView::Layout();
- frame_->GetNativeWindow()->SetProperty(aura::client::kTopViewInset,
- NonClientTopBorderHeight());
-}
-
-const char* CustomFrameViewAsh::GetClassName() const {
- return kViewClassName;
-}
-
-gfx::Size CustomFrameViewAsh::GetMinimumSize() const {
- gfx::Size min_client_view_size(frame_->client_view()->GetMinimumSize());
- return gfx::Size(
- std::max(header_view_->GetMinimumWidth(), min_client_view_size.width()),
- NonClientTopBorderHeight() + min_client_view_size.height());
-}
-
-gfx::Size CustomFrameViewAsh::GetMaximumSize() const {
- gfx::Size max_client_size(frame_->client_view()->GetMaximumSize());
- int width = 0;
- int height = 0;
-
- if (max_client_size.width() > 0)
- width = std::max(header_view_->GetMinimumWidth(), max_client_size.width());
- if (max_client_size.height() > 0)
- height = NonClientTopBorderHeight() + max_client_size.height();
-
- return gfx::Size(width, height);
-}
-
-void CustomFrameViewAsh::SchedulePaintInRect(const gfx::Rect& r) {
- // We may end up here before |header_view_| has been added to the Widget.
- if (header_view_->GetWidget()) {
- // The HeaderView is not a child of CustomFrameViewAsh. Redirect the paint
- // to HeaderView instead.
- gfx::RectF to_paint(r);
- views::View::ConvertRectToTarget(this, header_view_, &to_paint);
- header_view_->SchedulePaintInRect(gfx::ToEnclosingRect(to_paint));
- } else {
- views::NonClientFrameView::SchedulePaintInRect(r);
- }
-}
-
-void CustomFrameViewAsh::VisibilityChanged(views::View* starting_from,
- bool is_visible) {
- if (is_visible)
- header_view_->UpdateAvatarIcon();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// CustomFrameViewAsh, views::ViewTargeterDelegate overrides:
-
-views::View* CustomFrameViewAsh::GetHeaderView() {
- return header_view_;
-}
-
-const views::View* CustomFrameViewAsh::GetAvatarIconViewForTest() const {
- return header_view_->avatar_icon();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// CustomFrameViewAsh, private:
-
-// views::NonClientFrameView:
-bool CustomFrameViewAsh::DoesIntersectRect(const views::View* target,
- const gfx::Rect& rect) const {
- CHECK_EQ(target, this);
- // NonClientView hit tests the NonClientFrameView first instead of going in
- // z-order. Return false so that events get to the OverlayView.
- return false;
-}
-
-FrameCaptionButtonContainerView*
-CustomFrameViewAsh::GetFrameCaptionButtonContainerViewForTest() {
- return header_view_->caption_button_container();
-}
-
-int CustomFrameViewAsh::NonClientTopBorderHeight() const {
- return frame_->IsFullscreen() ? 0 : header_view_->GetPreferredHeight();
-}
-
-} // namespace ash
« no previous file with comments | « ash/frame/custom_frame_view_ash.h ('k') | ash/frame/custom_frame_view_ash_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698