wide_frame_view.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef ASH_FRAME_WIDE_FRAME_VIEW_H_
  5. #define ASH_FRAME_WIDE_FRAME_VIEW_H_
  6. #include "ash/ash_export.h"
  7. #include "ash/frame/frame_context_menu_controller.h"
  8. #include "ash/wm/overview/overview_observer.h"
  9. #include "chromeos/ui/frame/caption_buttons/caption_button_model.h"
  10. #include "chromeos/ui/frame/immersive/immersive_fullscreen_controller_delegate.h"
  11. #include "ui/aura/window_observer.h"
  12. #include "ui/display/display_observer.h"
  13. #include "ui/views/widget/widget_delegate.h"
  14. namespace chromeos {
  15. class ImmersiveFullscreenController;
  16. }
  17. namespace views {
  18. class Widget;
  19. }
  20. namespace ash {
  21. class HeaderView;
  22. // WideFrameView is used for the case where the widget's maximzed/fullscreen
  23. // doesn't cover the entire workarea/display area but the caption frame should
  24. // occupy the full width and placed at the top of the display. Its widget is
  25. // created as WIDGET_OWNS_NATIVE_WIDGET and caller is supposed to own and manage
  26. // its lifetime.
  27. //
  28. // TODO(oshima): Currently client is responsible for hooking this up to
  29. // the target widget because ImmersiveFullscreenController is not owned by
  30. // NonClientFrameViewAsh. Investigate if we integrate this into
  31. // NonClientFrameViewAsh.
  32. class ASH_EXPORT WideFrameView
  33. : public views::WidgetDelegateView,
  34. public aura::WindowObserver,
  35. public display::DisplayObserver,
  36. public chromeos::ImmersiveFullscreenControllerDelegate,
  37. public FrameContextMenuController::Delegate {
  38. public:
  39. explicit WideFrameView(views::Widget* target);
  40. WideFrameView(const WideFrameView&) = delete;
  41. WideFrameView& operator=(const WideFrameView&) = delete;
  42. ~WideFrameView() override;
  43. // Initialize |immersive_fullscreen_controller| so that the controller reveals
  44. // and |hides_header_| in immersive mode.
  45. void Init(chromeos::ImmersiveFullscreenController* controller);
  46. // Set the caption model for caption buttions on this frame.
  47. void SetCaptionButtonModel(
  48. std::unique_ptr<chromeos::CaptionButtonModel> mode);
  49. HeaderView* header_view() { return header_view_; }
  50. private:
  51. static gfx::Rect GetFrameBounds(views::Widget* target);
  52. // views::View:
  53. void Layout() override;
  54. void OnMouseEvent(ui::MouseEvent* event) override;
  55. // aura::WindowObserver:
  56. void OnWindowDestroying(aura::Window* window) override;
  57. // display::DisplayObserver:
  58. void OnDisplayMetricsChanged(const display::Display& display,
  59. uint32_t changed_metrics) override;
  60. // ImmersiveFullscreenControllerDelegate:
  61. void OnImmersiveRevealStarted() override;
  62. void OnImmersiveRevealEnded() override;
  63. void OnImmersiveFullscreenEntered() override;
  64. void OnImmersiveFullscreenExited() override;
  65. void SetVisibleFraction(double visible_fraction) override;
  66. std::vector<gfx::Rect> GetVisibleBoundsInScreen() const override;
  67. // FrameContextMenuController::Delegate:
  68. bool ShouldShowContextMenu(views::View* source,
  69. const gfx::Point& screen_coords_point) override;
  70. HeaderView* GetTargetHeaderView();
  71. // The target widget this frame will control.
  72. views::Widget* target_;
  73. std::unique_ptr<views::Widget> widget_;
  74. display::ScopedDisplayObserver display_observer_{this};
  75. HeaderView* header_view_ = nullptr;
  76. std::unique_ptr<FrameContextMenuController> frame_context_menu_controller_;
  77. // Called when |target_|'s "paint as active" state has changed.
  78. void PaintAsActiveChanged();
  79. base::CallbackListSubscription paint_as_active_subscription_;
  80. };
  81. } // namespace ash
  82. #endif // ASH_FRAME_WIDE_FRAME_VIEW_H_