// 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/frame/frame_context_menu_controller.h" #include "ash/wm/overview/overview_observer.h" #include "chromeos/ui/frame/caption_buttons/caption_button_model.h" #include "chromeos/ui/frame/immersive/immersive_fullscreen_controller_delegate.h" #include "ui/aura/window_observer.h" #include "ui/display/display_observer.h" #include "ui/views/widget/widget_delegate.h" namespace chromeos { class ImmersiveFullscreenController; } namespace views { class Widget; } namespace ash { class HeaderView; // 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 chromeos::ImmersiveFullscreenControllerDelegate, public FrameContextMenuController::Delegate { public: explicit WideFrameView(views::Widget* target); WideFrameView(const WideFrameView&) = delete; WideFrameView& operator=(const WideFrameView&) = delete; ~WideFrameView() override; // Initialize |immersive_fullscreen_controller| so that the controller reveals // and |hides_header_| in immersive mode. void Init(chromeos::ImmersiveFullscreenController* controller); // Set the caption model for caption buttions on this frame. void SetCaptionButtonModel( std::unique_ptr mode); HeaderView* header_view() { return header_view_; } private: static gfx::Rect GetFrameBounds(views::Widget* target); // 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; // ImmersiveFullscreenControllerDelegate: void OnImmersiveRevealStarted() override; void OnImmersiveRevealEnded() override; void OnImmersiveFullscreenEntered() override; void OnImmersiveFullscreenExited() override; void SetVisibleFraction(double visible_fraction) override; std::vector GetVisibleBoundsInScreen() const override; // FrameContextMenuController::Delegate: bool ShouldShowContextMenu(views::View* source, const gfx::Point& screen_coords_point) override; HeaderView* GetTargetHeaderView(); // The target widget this frame will control. views::Widget* target_; std::unique_ptr widget_; display::ScopedDisplayObserver display_observer_{this}; HeaderView* header_view_ = nullptr; std::unique_ptr frame_context_menu_controller_; // Called when |target_|'s "paint as active" state has changed. void PaintAsActiveChanged(); base::CallbackListSubscription paint_as_active_subscription_; }; } // namespace ash #endif // ASH_FRAME_WIDE_FRAME_VIEW_H_