Index: chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_layout_manager.h |
diff --git a/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_layout_manager.h b/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_layout_manager.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..13c6c386eb1443a6e8d1aff488c0701dc02a1550 |
--- /dev/null |
+++ b/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_layout_manager.h |
@@ -0,0 +1,138 @@ |
+// Copyright 2016 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 CHROME_BROWSER_UI_COCOA_FULLSCREEN_FULLSCREEN_TOOLBAR_LAYOUT_MANAGER_H_ |
+#define CHROME_BROWSER_UI_COCOA_FULLSCREEN_FULLSCREEN_TOOLBAR_LAYOUT_MANAGER_H_ |
+ |
+#import <Cocoa/Cocoa.h> |
+ |
+#include "base/mac/mac_util.h" |
+#include "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" |
+ |
+namespace { |
+class FullscreenToolbarLayoutTest; |
+} |
+ |
+@class BrowserWindowController; |
+@class DropdownAnimation; |
+@class FullscreenMenubarTracker; |
+class FullscreenToolbarAnimationManager; |
+@class FullscreenToolbarMouseTracker; |
+@class FullscreenToolbarVisibilityLocksController; |
+@class ImmersiveFullscreenController; |
+ |
+// This enum class represents the appearance of the fullscreen toolbar, which |
+// includes the tab strip and omnibox. There are 3 different styles: |
+// + TOOLBAR_PRESENT: The toolbar is present. Moving the cursor to the top |
+// causes the menubar to appear and the toolbar to slide down. |
+// + TOOLBAR_HIDDEN: The toolbar is hidden. Moving cursor to top shows the |
+// toolbar and menubar. |
+// + TOOLBAR_NONE: Toolbar is hidden. Moving cursor to top causes the menubar |
+// to appear, but not the toolbar. |
+enum class FullscreenToolbarStyle { |
+ TOOLBAR_PRESENT, |
+ TOOLBAR_HIDDEN, |
+ TOOLBAR_NONE, |
+}; |
+ |
+// This struct contains the calculated values of the fullscreen toolbar layout. |
+struct FullscreenToolbarLayout { |
+ // The toolbar style. |
+ FullscreenToolbarStyle toolbarStyle; |
+ |
+ // The fraction of the toolbar that is shown in the screen. |
+ CGFloat toolbarFraction; |
+ |
+ // The amount the menuber should be offset from the top of the screen. |
+ CGFloat menubarOffset; |
+}; |
+ |
+// This class manages the layout of the fullscreen toolbar for a single |
+// browser window. This class sets up trackers for the menubar, mouse, toolbar |
+// animations, and visibility locks. The trackers will update the class, which |
+// will then update the BrowserWindowController. |
+class FullscreenToolbarLayoutManager { |
+ public: |
+ FullscreenToolbarLayoutManager(BrowserWindowController* controller); |
+ |
+ ~FullscreenToolbarLayoutManager(); |
+ |
+ // Called when the window enters fullscreen. |
+ void EnterFullscreenMode(); |
+ |
+ // Called when the window exits fullscreen. |
+ void ExitFullscreenMode(); |
+ |
+ // Called when the tabstrip is changed. Kickstarts the animation to show |
+ // and hide the toolbar. This is virtual so that tests can override it. |
+ virtual void RevealToolbarForTabStripChanges(); |
+ |
+ // Computes and returns toolbar layout. |
+ FullscreenToolbarLayout ComputeToolbarLayout() const; |
+ |
+ // Returns true if the fullscreen toolbar must be shown. |
+ bool MustShowFullscreenToolbar() const; |
+ |
+ // Called by the BrowserWindowController to update toolbar frame. |
+ void UpdateFullscreenToolbarFrame(NSRect frame); |
+ |
+ // Updates the window's layout. |
+ void Layout(); |
+ |
+ // Updates the toolbar style. If the style has changed, then the toolbar |
+ // will relayout. |
+ void UpdateToolbarStyle(); |
+ |
+ FullscreenToolbarVisibilityLocksController* toolbar_visibility_locks() const { |
+ return toolbar_visibility_locks_; |
+ } |
+ |
+ BOOL in_fullscreen_mode() const { return in_fullscreen_; } |
+ |
+ BrowserWindowController* browser_window_controller() const { |
+ return browser_controller_; |
+ } |
+ |
+ private: |
+ friend class ::FullscreenToolbarLayoutTest; |
+ |
+ // Computes and returns the toolbar fraction. |
+ CGFloat ComputeToolbarFraction() const; |
+ |
+ // Cleans up and reset the tracker objects. |
+ void CleanUp(); |
+ |
+ // Our parent controller. |
+ BrowserWindowController* browser_controller_; // weak |
+ |
+ // Whether or not we are in fullscreen mode. |
+ BOOL in_fullscreen_; |
+ |
+ // True if the fullscreen toolbar shown be shown for browser fullscreen. |
+ BOOL shouldShowFullscreenToolbar_; |
+ |
+ // Updates the fullscreen layout for changes in the menubar. This object is |
+ // only set when the browser is in fullscreen mode. |
+ base::scoped_nsobject<FullscreenMenubarTracker> menubar_tracker_; |
+ |
+ // Mouse tracker to track the user's interactions with the toolbar. This |
+ // object is only set when the browser is in fullscreen mode. |
+ base::scoped_nsobject<FullscreenToolbarMouseTracker> mouse_tracker_; |
+ |
+ // Maintains the toolbar's visibility locks for the TOOLBAR_HIDDEN style. |
+ base::scoped_nsobject<FullscreenToolbarVisibilityLocksController> |
+ toolbar_visibility_locks_; |
+ |
+ // Manages the toolbar animations for the TOOLBAR_HIDDEN style. |
+ std::unique_ptr<FullscreenToolbarAnimationManager> animation_manager_; |
+ |
+ // Controller for immersive fullscreen. |
+ base::scoped_nsobject<ImmersiveFullscreenController> |
+ immersive_fullscreen_controller_; |
+ |
+ // The current toolbar style. |
+ FullscreenToolbarStyle toolbar_style_; |
+}; |
+ |
+#endif // CHROME_BROWSER_UI_COCOA_FULLSCREEN_FULLSCREEN_TOOLBAR_LAYOUT_MANAGER_H_ |