| // Copyright 2012 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef ASH_FRAME_NON_CLIENT_FRAME_VIEW_ASH_H_ |
| #define ASH_FRAME_NON_CLIENT_FRAME_VIEW_ASH_H_ |
| |
| #include <memory> |
| |
| #include "ash/ash_export.h" |
| #include "ash/frame/frame_context_menu_controller.h" |
| #include "base/memory/weak_ptr.h" |
| #include "chromeos/ui/frame/header_view.h" |
| #include "chromeos/ui/frame/highlight_border_overlay.h" |
| #include "chromeos/ui/frame/non_client_frame_view_base.h" |
| #include "third_party/skia/include/core/SkColor.h" |
| #include "ui/aura/window_observer.h" |
| #include "ui/base/metadata/metadata_header_macros.h" |
| #include "ui/views/widget/widget.h" |
| |
| namespace chromeos { |
| class FrameCaptionButtonContainerView; |
| class ImmersiveFullscreenController; |
| } // namespace chromeos |
| |
| namespace views { |
| class Widget; |
| } // namespace views |
| |
| namespace ash { |
| |
| class NonClientFrameViewAshImmersiveHelper; |
| |
| // A NonClientFrameView used for packaged apps, dialogs and other non-browser |
| // windows. It supports immersive fullscreen. When in immersive fullscreen, the |
| // client view takes up the entire widget and the window header is an overlay. |
| // The window header overlay slides onscreen when the user hovers the mouse at |
| // the top of the screen. See also views::CustomFrameView and |
| // BrowserNonClientFrameViewAsh. |
| class ASH_EXPORT NonClientFrameViewAsh |
| : public chromeos::NonClientFrameViewBase, |
| public FrameContextMenuController::Delegate, |
| public aura::WindowObserver { |
| public: |
| METADATA_HEADER(NonClientFrameViewAsh); |
| |
| // |control_immersive| controls whether ImmersiveFullscreenController is |
| // created for the NonClientFrameViewAsh; if true and a WindowStateDelegate |
| // has not been set on the WindowState associated with |frame|, then an |
| // ImmersiveFullscreenController is created. |
| explicit NonClientFrameViewAsh(views::Widget* frame); |
| NonClientFrameViewAsh(const NonClientFrameViewAsh&) = delete; |
| NonClientFrameViewAsh& operator=(const NonClientFrameViewAsh&) = delete; |
| ~NonClientFrameViewAsh() override; |
| |
| static NonClientFrameViewAsh* Get(aura::Window* window); |
| |
| // Sets the caption button modeland updates the caption buttons. |
| void SetCaptionButtonModel( |
| std::unique_ptr<chromeos::CaptionButtonModel> model); |
| |
| // Inits |immersive_fullscreen_controller| so that the controller reveals |
| // and hides |header_view_| in immersive fullscreen. |
| // NonClientFrameViewAsh does not take ownership of |
| // |immersive_fullscreen_controller|. |
| void InitImmersiveFullscreenControllerForView( |
| chromeos::ImmersiveFullscreenController* immersive_fullscreen_controller); |
| |
| // Sets the active and inactive frame colors. Note the inactive frame color |
| // will have some transparency added when the frame is drawn. |
| void SetFrameColors(SkColor active_frame_color, SkColor inactive_frame_color); |
| |
| // Calculate the client bounds for given window bounds. |
| gfx::Rect GetClientBoundsForWindowBounds( |
| const gfx::Rect& window_bounds) const; |
| |
| // FrameContextMenuController::Delegate: |
| bool ShouldShowContextMenu(views::View* source, |
| const gfx::Point& screen_coords_point) override; |
| |
| // If |paint| is false, we should not paint the header. Used for overview mode |
| // with OnOverviewModeStarting() and OnOverviewModeEnded() to hide/show the |
| // header of v2 and ARC apps. |
| virtual void SetShouldPaintHeader(bool paint); |
| |
| // Expected height from top of window to top of client area when non client |
| // view is visible. |
| int NonClientTopBorderPreferredHeight() const; |
| |
| const views::View* GetAvatarIconViewForTest() const; |
| |
| SkColor GetActiveFrameColorForTest() const; |
| SkColor GetInactiveFrameColorForTest() const; |
| |
| views::Widget* frame() { return frame_; } |
| |
| bool GetFrameEnabled() const { return frame_enabled_; } |
| bool GetFrameOverlapped() const { return frame_overlapped_; } |
| void SetFrameEnabled(bool enabled); |
| void SetFrameOverlapped(bool overlapped); |
| |
| // Sets the callback to toggle the ARC++ resize-lock menu for this container |
| // if applicable, which will be invoked via the keyboard shortcut. |
| void SetToggleResizeLockMenuCallback( |
| base::RepeatingCallback<void()> callback); |
| base::RepeatingCallback<void()> GetToggleResizeLockMenuCallback() const; |
| void ClearToggleResizeLockMenuCallback(); |
| |
| // views::NonClientFrameView: |
| void UpdateWindowRoundedCorners() override; |
| |
| // aura::WindowObserver: |
| void OnWindowPropertyChanged(aura::Window* window, |
| const void* key, |
| intptr_t old) override; |
| void OnWindowDestroying(aura::Window* window) override; |
| |
| protected: |
| // views::View: |
| void OnDidSchedulePaint(const gfx::Rect& r) override; |
| void AddedToWidget() override; |
| |
| bool frame_overlapped_ = false; |
| |
| private: |
| friend class TestWidgetConstraintsDelegate; |
| friend class WindowServiceDelegateImplTest; |
| |
| // Returns the container for the minimize/maximize/close buttons that is |
| // held by the HeaderView. Used in testing. |
| chromeos::FrameCaptionButtonContainerView* |
| GetFrameCaptionButtonContainerViewForTest(); |
| |
| // Updates the windows default frame colors if necessary. |
| void UpdateDefaultFrameColors() override; |
| |
| // Generates a nine patch layer painted with a highlight border. |
| std::unique_ptr<HighlightBorderOverlay> highlight_border_overlay_; |
| |
| std::unique_ptr<NonClientFrameViewAshImmersiveHelper> immersive_helper_; |
| |
| std::unique_ptr<FrameContextMenuController> frame_context_menu_controller_; |
| |
| // Observes property changes to window of `target_widget_`. |
| base::ScopedObservation<aura::Window, aura::WindowObserver> |
| window_observation_{this}; |
| |
| base::RepeatingCallback<void()> toggle_resize_lock_menu_callback_; |
| |
| base::WeakPtrFactory<NonClientFrameViewAsh> weak_factory_{this}; |
| }; |
| |
| } // namespace ash |
| |
| #endif // ASH_FRAME_NON_CLIENT_FRAME_VIEW_ASH_H_ |