| Index: ios/chrome/browser/ui/toolbar/toolbar_controller.h
|
| diff --git a/ios/chrome/browser/ui/toolbar/toolbar_controller.h b/ios/chrome/browser/ui/toolbar/toolbar_controller.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..11d73f1a324a2c8264fc61cf2ea1f5b01376761e
|
| --- /dev/null
|
| +++ b/ios/chrome/browser/ui/toolbar/toolbar_controller.h
|
| @@ -0,0 +1,288 @@
|
| +// Copyright 2012 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 IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_CONTROLLER_H_
|
| +#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_CONTROLLER_H_
|
| +
|
| +#import <UIKit/UIKit.h>
|
| +
|
| +#include <stdint.h>
|
| +
|
| +#include <map>
|
| +
|
| +#include "base/ios/weak_nsobject.h"
|
| +#import "base/mac/scoped_nsobject.h"
|
| +#include "ios/chrome/browser/ui/rtl_geometry.h"
|
| +#import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h"
|
| +#include "ios/chrome/browser/ui/ui_util.h"
|
| +#import "ios/chrome/browser/ui/util/relaxed_bounds_constraints_hittest.h"
|
| +
|
| +class ReadingListModel;
|
| +@class ToolsMenuContext;
|
| +
|
| +// The time delay before non-initial button images are loaded.
|
| +extern const int64_t kNonInitialImageAdditionDelayNanosec;
|
| +// Notification when the tools menu is opened.
|
| +extern NSString* const kMenuWillShowNotification;
|
| +// Notification when the tools menu is closed.
|
| +extern NSString* const kMenuWillHideNotification;
|
| +// Accessibility identifier of the toolbar view (for use by integration tests).
|
| +extern NSString* const kToolbarIdentifier;
|
| +// Accessibility identifier of the incognito toolbar view (for use by
|
| +// integration tests).
|
| +extern NSString* const kIncognitoToolbarIdentifier;
|
| +// Accessibility identifier of the tools menu button (for use by integration
|
| +// tests).
|
| +extern NSString* const kToolbarToolsMenuButtonIdentifier;
|
| +// Accessibility identifier of the stack button (for use by integration
|
| +// tests).
|
| +extern NSString* const kToolbarStackButtonIdentifier;
|
| +// The maximum number to display in the tab switcher button.
|
| +extern NSInteger const kStackButtonMaxTabCount;
|
| +
|
| +// Toolbar style. Determines which button images are used.
|
| +enum ToolbarControllerStyle {
|
| + ToolbarControllerStyleLightMode = 0,
|
| + ToolbarControllerStyleDarkMode,
|
| + ToolbarControllerStyleIncognitoMode,
|
| + ToolbarControllerStyleMaxStyles
|
| +};
|
| +
|
| +enum ToolbarButtonMode {
|
| + ToolbarButtonModeNormal,
|
| + ToolbarButtonModeReversed,
|
| +};
|
| +
|
| +enum ToolbarButtonUIState {
|
| + ToolbarButtonUIStateNormal = 0,
|
| + ToolbarButtonUIStatePressed,
|
| + ToolbarButtonUIStateDisabled,
|
| + NumberOfToolbarButtonUIStates,
|
| +};
|
| +
|
| +// This enumerates the different buttons used by the toolbar and is used to map
|
| +// the resource IDs for the button's icons. Subclasses with additional buttons
|
| +// should extend these values. The first new enum should be set to
|
| +// |NumberOfToolbarButtonNames|. Note that functions that use these values use
|
| +// an int rather than the |ToolbarButtonName| to accommodate additional values.
|
| +// Also, if this enum is extended by a subclass, the subclass must also override
|
| +// -imageIdForImageEnum:style:forState: to provide mapping from enum to resource
|
| +// ID for the various states.
|
| +enum ToolbarButtonName {
|
| + ToolbarButtonNameStack = 0,
|
| + ToolbarButtonNameShare,
|
| + NumberOfToolbarButtonNames,
|
| +};
|
| +
|
| +// Style used to specify the direction of the toolbar transition animations.
|
| +typedef enum {
|
| + TOOLBAR_TRANSITION_STYLE_TO_STACK_VIEW,
|
| + TOOLBAR_TRANSITION_STYLE_TO_BVC
|
| +} ToolbarTransitionStyle;
|
| +
|
| +// Toolbar frames shared with subclasses.
|
| +extern const CGRect kToolbarFrame[INTERFACE_IDIOM_COUNT];
|
| +
|
| +// Create a thin wrapper around UIImageView to catch frame change and window
|
| +// events.
|
| +@protocol ToolbarFrameDelegate
|
| +- (void)frameDidChangeFrame:(CGRect)newFrame fromFrame:(CGRect)oldFrame;
|
| +- (void)windowDidChange;
|
| +@end
|
| +
|
| +@interface ToolbarView : UIImageView<RelaxedBoundsConstraintsHitTestSupport> {
|
| + base::WeakNSProtocol<id<ToolbarFrameDelegate>> delegate_;
|
| +}
|
| +- (void)setDelegate:(id<ToolbarFrameDelegate>)delegate;
|
| +// Records whether or not the toolbar is currently involved in a transition
|
| +// animation.
|
| +@property(nonatomic, assign, getter=isAnimatingTransition)
|
| + BOOL animatingTransition;
|
| +@end
|
| +
|
| +// Base class for a toolbar, containing the standard button set that is common
|
| +// across different types of toolbars and action handlers for those buttons
|
| +// (forwarding to the delegate).
|
| +// This is not intended to be used on its own, but to be subclassed by more
|
| +// specific toolbars that provide more buttons in the empty space.
|
| +@interface ToolbarController : NSObject<PopupMenuDelegate>
|
| +
|
| +// The top-level toolbar view. It is a |UIImageView| even though it does not
|
| +// hold any image for testability: unlike |UIView|, a |UIImageView| that is
|
| +// visible in the UI automation view hierarchy does not prevent its subviews
|
| +// from also being visible.
|
| +// TODO(blundell): Figure out how to fix this and have the top-level view be a
|
| +// UIView. b/6167700
|
| +@property(nonatomic, readonly, retain) ToolbarView* view;
|
| +// The view for the toolbar background image. This is a subview of |view| to
|
| +// allow clients to alter the transparency of the background image without
|
| +// affecting the other components of the toolbar.
|
| +@property(nonatomic, readonly, retain) UIImageView* backgroundView;
|
| +// The view for the toolbar shadow image. This is a subview of |view| to allow
|
| +// clients to alter the visibility of the shadow without affecting other
|
| +// components of the toolbar.
|
| +@property(nonatomic, readonly, retain) UIImageView* shadowView;
|
| +
|
| +// The tools popup controller. Nil if the tools popup menu is not visible.
|
| +@property(nonatomic, readonly, retain)
|
| + ToolsPopupController* toolsPopupController;
|
| +
|
| +// Style of this toolbar.
|
| +@property(nonatomic, readonly, assign) ToolbarControllerStyle style;
|
| +
|
| +// The reading list model reflected by the toolbar.
|
| +@property(nonatomic, readwrite, assign) ReadingListModel* readingListModel;
|
| +
|
| +// Designated initializer. |style| determines how the toolbar draws itself.
|
| +- (instancetype)initWithStyle:(ToolbarControllerStyle)style
|
| + NS_DESIGNATED_INITIALIZER;
|
| +
|
| +- (instancetype)init NS_UNAVAILABLE;
|
| +
|
| +// Called when the application has entered the background.
|
| +- (void)applicationDidEnterBackground:(NSNotification*)notify;
|
| +
|
| +// Sets whether the share button is enabled or not.
|
| +- (void)setShareButtonEnabled:(BOOL)enabled;
|
| +
|
| +// Sets up |button| with images named by the given |imageEnum| and the current
|
| +// toolbar style. Sets images synchronously for |initialState|, and
|
| +// asynchronously for the other states. Optionally sets the image for the
|
| +// disabled state as well. Meant to be called during initialization.
|
| +// Note: |withImageEnum| should be one of the ToolbarButtonName values, or an
|
| +// extended value provided by a subclass. It is an int to support "subclassing"
|
| +// of the enum and overriding helper functions.
|
| +- (void)setUpButton:(UIButton*)button
|
| + withImageEnum:(int)imageEnum
|
| + forInitialState:(UIControlState)initialState
|
| + hasDisabledImage:(BOOL)hasDisabledImage
|
| + synchronously:(BOOL)synchronously;
|
| +
|
| +// TRUE if |imageEnum| should be flipped when in RTL layout.
|
| +// Currently none of this class' images have this property, but subclasses
|
| +// can override this method if they need to flip some of their images.
|
| +- (BOOL)imageShouldFlipForRightToLeftLayoutDirection:(int)imageEnum;
|
| +
|
| +// Shows the tools popup menu.
|
| +- (void)showToolsMenuPopupWithContext:(ToolsMenuContext*)context;
|
| +
|
| +// If |toolsPopupController_| is non-nil, dismisses the tools popup menu with
|
| +// animation.
|
| +- (void)dismissToolsMenuPopup;
|
| +
|
| +// Returns the bound of the share button. Used to position the share menu.
|
| +- (CGRect)shareButtonAnchorRect;
|
| +
|
| +// Returns the share button's view. Used to position the share menu.
|
| +- (UIView*)shareButtonView;
|
| +
|
| +// Sets the background to a particular alpha value. Intended for use by
|
| +// subcleasses that need to set the opacity of the entire toolbar.
|
| +- (void)setBackgroundAlpha:(CGFloat)alpha;
|
| +
|
| +// Called whenever one of the standard controls is triggered. Does nothing, but
|
| +// can be overridden by subclasses to clear any state (e.g., close menus).
|
| +- (void)standardButtonPressed:(UIButton*)sender;
|
| +
|
| +// Updates the tab stack button (if there is one) based on the given tab count.
|
| +// If |tabCount| > |kStackButtonMaxTabCount|, an easter egg is shown instead of
|
| +// the actual number of tabs.
|
| +- (void)setTabCount:(NSInteger)tabCount;
|
| +
|
| +// Called when buttons are pressed. Records action metrics.
|
| +// Subclasses must call |super| if they override this method.
|
| +- (IBAction)recordUserMetrics:(id)sender;
|
| +
|
| +// Called when a touch down is registered on the stack view button.
|
| +- (IBAction)stackButtonTouchDown:(id)sender;
|
| +
|
| +// Height of the toolbar's drop shadow. This drop shadow is drawn by the
|
| +// toolbar and included in the toolbar's height, so it must be subtracted away
|
| +// when positioning the web content area.
|
| ++ (CGFloat)toolbarDropShadowHeight;
|
| +
|
| +// Height and Y offset to account for the status bar. Overridden by subclasses
|
| +// if the toolbar shouldn't extend through the status bar.
|
| +- (CGFloat)statusBarOffset;
|
| +
|
| +- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection;
|
| +
|
| +@end
|
| +
|
| +@interface ToolbarController (ProtectedMethods)
|
| +
|
| +// Returns the area that subclasses should use for adding their own controls.
|
| +// Nothing should be added outside this frame without first calling
|
| +// |setStandardControlsVisible:NO|.
|
| +- (CGRect)specificControlsArea;
|
| +
|
| +// Sets the standard control set to be visible or invisible. Uses alpha, so it
|
| +// can be animated if called from an animation context. Intended for use by
|
| +// subclasses that need to temporarily take over the entire toolbar.
|
| +- (void)setStandardControlsVisible:(BOOL)visible;
|
| +
|
| +// Sets the standard control to a particular alpha value. Intended for use by
|
| +// subclasses that need to temporarily take over the entire toolbar.
|
| +- (void)setStandardControlsAlpha:(CGFloat)alpha;
|
| +
|
| +// Sets the transform that is applied to the standard controls. Can be
|
| +// animated if called from an animation context. Intended for use by subclasses
|
| +// that need to apply a transform to all toolbar buttons.
|
| +- (void)setStandardControlsTransform:(CGAffineTransform)transform;
|
| +
|
| +// Returns the UIImage from the resources bundle for the |imageEnum| and
|
| +// |state|. Uses the toolbar's current style.
|
| +- (UIImage*)imageForImageEnum:(int)imageEnum
|
| + forState:(ToolbarButtonUIState)state;
|
| +
|
| +// Returns the image enum for a given button object. If the user taps a button
|
| +// before its secondary images have been loaded, the image(s) will be loaded
|
| +// then, synchronously. Called by -standardButtonPressed.
|
| +- (int)imageEnumForButton:(UIButton*)button;
|
| +
|
| +// Returns the resource ID for the image with enum |index|, corresponding to
|
| +// |style| and |state|. Returns 0 if there is not a corresponding ID.
|
| +// If a subclass extends the enum ToolbarButtonName, it must also override this
|
| +// method to provide the correct mapping from enum to resource ID.
|
| +- (int)imageIdForImageEnum:(int)index
|
| + style:(ToolbarControllerStyle)style
|
| + forState:(ToolbarButtonUIState)state;
|
| +
|
| +// Creates a hash of the UI state of the toolbar.
|
| +- (uint32_t)snapshotHash;
|
| +
|
| +// Animates the tools menu button and stack button for full bleed omnibox
|
| +// animation used for Material.
|
| +- (void)animateStandardControlsForOmniboxExpansion:(BOOL)growOmnibox;
|
| +
|
| +// Add position and opacity animations to |view|'s layer. The opacity animation
|
| +// goes from 0 to 1. The position animation goes from [view.layer.position
|
| +// offset in the leading direction by |leadingOffset|) to view.layer.position.
|
| +// Both animations occur after |delay| seconds.
|
| +- (void)fadeInView:(UIView*)view
|
| + fromLeadingOffset:(LayoutOffset)leadingOffset
|
| + withDuration:(NSTimeInterval)duration
|
| + afterDelay:(NSTimeInterval)delay;
|
| +
|
| +// Performs the transition animation specified by |style|, animating the toolbar
|
| +// view from |beginFrame| to |endFrame|.
|
| +// Animations are added to subview depending on |style|:
|
| +// - ToolbarTransitionStyleToStackView: faded out immediately
|
| +// - ToolbarTransitionStyleToBVC: fade in from a vertical offset after a delay
|
| +- (void)animateTransitionWithBeginFrame:(CGRect)beginFrame
|
| + endFrame:(CGRect)endFrame
|
| + transitionStyle:(ToolbarTransitionStyle)style;
|
| +
|
| +// Reverses transition animations that are cancelled before they can finish.
|
| +- (void)reverseTransitionAnimations;
|
| +
|
| +// Called when transition animations can be removed.
|
| +- (void)cleanUpTransitionAnimations;
|
| +
|
| +// Shows/hides iPhone toolbar views for when the new tab page is displayed.
|
| +- (void)hideViewsForNewTabPage:(BOOL)hide;
|
| +
|
| +@end
|
| +
|
| +#endif // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_CONTROLLER_H_
|
|
|