blob: 86412923dfd6c40b2a6af76195ebddc5c13063fb [file] [log] [blame]
// Copyright 2018 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.
#ifndef ASH_FRAME_WIDE_FRAME_VIEW_H_
#define ASH_FRAME_WIDE_FRAME_VIEW_H_
#include "ash/ash_export.h"
#include "ash/public/cpp/caption_buttons/caption_button_model.h"
#include "ash/public/cpp/immersive/immersive_fullscreen_controller_delegate.h"
#include "ash/shell.h"
#include "ash/shell_observer.h"
#include "ui/aura/window_observer.h"
#include "ui/display/display_observer.h"
#include "ui/views/widget/widget_delegate.h"
namespace views {
class Widget;
}
namespace ash {
class HeaderView;
class ImmersiveFullscreenController;
// WideFrameView is used for the case where the widget's maximzed/fullscreen
// doesn't cover the entire workarea/display area but the caption frame should
// occupy the full width and placed at the top of the display. Its widget is
// created as WIDGET_OWNS_NATIVE_WIDGET and caller is supposed to own and manage
// its lifetime.
//
// TODO(oshima): Currently client is responsible for hooking this up to
// the target widget because ImmersiveFullscreenController is not owned by
// NonClientFrameViewAsh. Investigate if we integrate this into
// NonClientFrameViewAsh.
class ASH_EXPORT WideFrameView
: public views::WidgetDelegateView,
public aura::WindowObserver,
public display::DisplayObserver,
public ash::ImmersiveFullscreenControllerDelegate,
public ash::ShellObserver {
public:
explicit WideFrameView(views::Widget* target);
~WideFrameView() override;
// Initialize |immersive_fullscreen_controller| so that the controller reveals
// and |hides_header_| in immersive mode.
void Init(ash::ImmersiveFullscreenController* controller);
// Set the caption model for caption buttions on this frame.
void SetCaptionButtonModel(std::unique_ptr<ash::CaptionButtonModel> mode);
ash::HeaderView* header_view() { return header_view_; }
private:
static gfx::Rect GetFrameBounds(views::Widget* target);
// views::WidgetDelegateView:
void DeleteDelegate() override;
// views::View:
void Layout() override;
void OnMouseEvent(ui::MouseEvent* event) override;
// aura::WindowObserver:
void OnWindowDestroying(aura::Window* window) override;
// display::DisplayObserver:
void OnDisplayMetricsChanged(const display::Display& display,
uint32_t changed_metrics) override;
// ash::ImmersiveFullscreenControllerDelegate:
void OnImmersiveRevealStarted() override;
void OnImmersiveRevealEnded() override;
void OnImmersiveFullscreenEntered() override;
void OnImmersiveFullscreenExited() override;
void SetVisibleFraction(double visible_fraction) override;
std::vector<gfx::Rect> GetVisibleBoundsInScreen() const override;
// ash::ShellObserver:
void OnOverviewModeStarting() override;
void OnOverviewModeEnded() override;
ash::HeaderView* GetTargetHeaderView();
// The target widget this frame will control.
views::Widget* target_;
std::unique_ptr<views::Widget> widget_;
ash::HeaderView* header_view_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(WideFrameView);
};
} // namespace ash
#endif // ASH_FRAME_WIDE_FRAME_VIEW_H_