| Index: chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.h
 | 
| diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.h b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.h
 | 
| index a26aa496fb2f775c914fabd1d6f4d9e5c11f5029..fae30ab75cc73356b7f090cbb7445af5c86c39c7 100644
 | 
| --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.h
 | 
| +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.h
 | 
| @@ -9,55 +9,224 @@
 | 
|  #import <Cocoa/Cocoa.h>
 | 
|  
 | 
|  #include "base/memory/scoped_nsobject.h"
 | 
| -#include "base/memory/scoped_ptr.h"
 | 
| -#import "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.h"
 | 
| +#import "chrome/browser/ui/cocoa/bookmarks/bookmark_button.h"
 | 
| +#import "chrome/browser/ui/cocoa/tracking_area.h"
 | 
|  
 | 
|  @class BookmarkBarController;
 | 
| -@class BookmarkButton;
 | 
| -class BookmarkMenuBridge;
 | 
| -class BookmarkModel;
 | 
| -
 | 
| -// A controller for the menus that are attached to the folder buttons on the
 | 
| -// bookmark bar.
 | 
| -@interface BookmarkBarFolderController : NSObject<BookmarkMenuDelegate> {
 | 
| +@class BookmarkBarFolderView;
 | 
| +@class BookmarkFolderTarget;
 | 
| +@class BookmarkBarFolderHoverState;
 | 
| +@class BookmarkBarFolderWindow;
 | 
| +@class BookmarkBarFolderWindowContentView;
 | 
| +
 | 
| +// A controller for the pop-up windows from bookmark folder buttons
 | 
| +// which look sort of like menus.
 | 
| +@interface BookmarkBarFolderController :
 | 
| +    NSWindowController<BookmarkButtonDelegate,
 | 
| +                       BookmarkButtonControllerProtocol,
 | 
| +                       NSUserInterfaceValidations> {
 | 
|   @private
 | 
|    // The button whose click opened us.
 | 
|    scoped_nsobject<BookmarkButton> parentButton_;
 | 
|  
 | 
| -  // The bookmark bar controller. Weak.
 | 
| -  BookmarkBarController* barController_;
 | 
| -
 | 
| -  // The root menu for this node.
 | 
| -  scoped_nsobject<NSMenu> menu_;
 | 
| -
 | 
| -  // The class that builds the menu.
 | 
| -  scoped_ptr<BookmarkMenuBridge> menuBridge_;
 | 
| +  // Bookmark bar folder controller chains are torn down in two ways:
 | 
| +  // 1. Clicking "outside" the folder (see use of
 | 
| +  // CrApplicationEventHookProtocol in the bookmark bar controller).
 | 
| +  // 2. Engaging a different folder (via hover over or explicit click).
 | 
| +  //
 | 
| +  // In either case, the BookmarkButtonControllerProtocol method
 | 
| +  // closeAllBookmarkFolders gets called.  For bookmark bar folder
 | 
| +  // controllers, this is passed up the chain so we begin with a top
 | 
| +  // level "close".
 | 
| +  // When any bookmark folder window closes, it necessarily tells
 | 
| +  // subcontroller windows to close (down the chain), and autoreleases
 | 
| +  // the controller.  (Must autorelease since the controller can still
 | 
| +  // get delegate events such as windowDidClose).
 | 
| +  //
 | 
| +  // Bookmark bar folder controllers own their buttons.  When doing
 | 
| +  // drag and drop of a button from one sub-sub-folder to a different
 | 
| +  // sub-sub-folder, we need to make sure the button's pointers stay
 | 
| +  // valid until we've dropped (or cancelled).  Note that such a drag
 | 
| +  // causes the source sub-sub-folder (previous parent window) to go
 | 
| +  // away (windows close, controllers autoreleased) since you're
 | 
| +  // hovering over a different folder chain for dropping.  To keep
 | 
| +  // things valid (like the button's target, its delegate, the parent
 | 
| +  // cotroller that we have a pointer to below [below], etc), we heep
 | 
| +  // strong pointers to our owning controller, so the entire chain
 | 
| +  // stays owned.
 | 
| +
 | 
| +  // Our parent controller, if we are a nested folder, otherwise nil.
 | 
| +  // Strong to insure the object lives as long as we need it.
 | 
| +  scoped_nsobject<BookmarkBarFolderController> parentController_;
 | 
| +
 | 
| +  // The main bar controller from whence we or a parent sprang.
 | 
| +  BookmarkBarController* barController_;  // WEAK: It owns us.
 | 
| +
 | 
| +  // Our buttons.  We do not have buttons for nested folders.
 | 
| +  scoped_nsobject<NSMutableArray> buttons_;
 | 
| +
 | 
| +  // The scroll view that contains our main button view (below).
 | 
| +  IBOutlet NSScrollView* scrollView_;
 | 
| +
 | 
| +  // The view defining the visible area in which we draw our content.
 | 
| +  IBOutlet BookmarkBarFolderWindowContentView* visibleView_;
 | 
| +
 | 
| +  // The main view of this window (where the buttons go) within the scroller.
 | 
| +  IBOutlet BookmarkBarFolderView* folderView_;
 | 
| +
 | 
| +  // A window used to show the shadow behind the main window when it is
 | 
| +  // scrollable. (A 'shadow' window is needed because the main window, when
 | 
| +  // scrollable in either or both directions, will reach completely to the
 | 
| +  // top and/or bottom edge of the screen in order to support mouse tracking
 | 
| +  // during scrolling operations. In that case, though, the 'visible'
 | 
| +  // window must be inset a bit from the edge of the screen for aesthetics;
 | 
| +  // it will also be inset much more from the bottom of the screen when the
 | 
| +  // Dock is showing. When scrollable, the main window would show a shadow
 | 
| +  // incorrectly positioned, hence the 'shadow' window.)
 | 
| +  IBOutlet BookmarkBarFolderWindow* shadowWindow_;
 | 
| +
 | 
| +  // The up and down scroll arrow views. These arrows are hidden and shown
 | 
| +  // as necessary (when scrolling is possible) and are contained in the nib
 | 
| +  // as siblings to the scroll view.
 | 
| +  IBOutlet NSView* scrollDownArrowView_;  // Positioned at the top.
 | 
| +  IBOutlet NSView* scrollUpArrowView_;  // Positioned at the bottom.
 | 
| +
 | 
| +  // YES if subfolders should grow to the right (the default).
 | 
| +  // Direction switches if we'd grow off the screen.
 | 
| +  BOOL subFolderGrowthToRight_;
 | 
| +
 | 
| +  // Weak; we keep track to work around a
 | 
| +  // setShowsBorderOnlyWhileMouseInside bug.
 | 
| +  BookmarkButton* buttonThatMouseIsIn_;
 | 
| +
 | 
| +  // The context menu for a bookmark button which represents an URL.
 | 
| +  IBOutlet NSMenu* buttonMenu_;
 | 
| +
 | 
| +  // The context menu for a bookmark button which represents a folder.
 | 
| +  IBOutlet NSMenu* folderMenu_;
 | 
| +
 | 
| +  // We model hover state as a state machine with specific allowable
 | 
| +  // transitions.  |hoverState_| is the state of this machine at any
 | 
| +  // given time.
 | 
| +  scoped_nsobject<BookmarkBarFolderHoverState> hoverState_;
 | 
| +
 | 
| +  // Logic for dealing with a click on a bookmark folder button.
 | 
| +  scoped_nsobject<BookmarkFolderTarget> folderTarget_;
 | 
| +
 | 
| +  // A controller for a pop-up bookmark folder window (custom menu).
 | 
| +  // We (self) are the parentController_ for our folderController_.
 | 
| +  // This is not a scoped_nsobject because it owns itself (when its
 | 
| +  // window closes the controller gets autoreleased).
 | 
| +  BookmarkBarFolderController* folderController_;
 | 
| +
 | 
| +  // Implement basic menu scrolling through this tracking area.
 | 
| +  ScopedCrTrackingArea scrollTrackingArea_;
 | 
| +
 | 
| +  // Timer to continue scrolling as needed.  We own the timer but
 | 
| +  // don't release it when done (we invalidate it).
 | 
| +  NSTimer* scrollTimer_;
 | 
| +
 | 
| +  // Precalculated sum of left and right edge padding of buttons in a
 | 
| +  // folder menu window. This is calculated from the widths of the main
 | 
| +  // folder menu window and the scroll view within.
 | 
| +  CGFloat padding_;
 | 
| +
 | 
| +  // Amount to scroll by on each timer fire.  Can be + or -.
 | 
| +  CGFloat verticalScrollDelta_;
 | 
| +
 | 
| +  // We need to know the size of the vertical scrolling arrows so we
 | 
| +  // can obscure/unobscure them.
 | 
| +  CGFloat verticalScrollArrowHeight_;
 | 
| +
 | 
| +  // Set to YES to prevent any node animations. Useful for unit testing so that
 | 
| +  // incomplete animations do not cause valgrind complaints.
 | 
| +  BOOL ignoreAnimations_;
 | 
| +
 | 
| +  int selectedIndex_;
 | 
| +  NSString* typedPrefix_;
 | 
|  }
 | 
|  
 | 
|  // Designated initializer.
 | 
|  - (id)initWithParentButton:(BookmarkButton*)button
 | 
| -             bookmarkModel:(BookmarkModel*)model
 | 
| +          parentController:(BookmarkBarFolderController*)parentController
 | 
|               barController:(BookmarkBarController*)barController;
 | 
|  
 | 
|  // Return the parent button that owns the bookmark folder we represent.
 | 
|  - (BookmarkButton*)parentButton;
 | 
|  
 | 
| -// Opens the menu. This will retain itself before it runs the menu and will
 | 
| -// release itself when the menu closes.
 | 
| -- (void)openMenu;
 | 
| +// Text typed by user, for type-select and arrow key support.
 | 
| +// Returns YES if the menu should be closed now.
 | 
| +- (BOOL)handleInputText:(NSString*)newText;
 | 
| +
 | 
| +// If you wanted to clear the type-select buffer. Currently only used
 | 
| +// internally.
 | 
| +- (void)clearInputText;
 | 
| +
 | 
| +// Gets notified when a fav icon asynchronously loads, so we can now use the
 | 
| +// real icon instead of a generic placeholder.
 | 
| +- (void)faviconLoadedForNode:(const BookmarkNode*)node;
 | 
| +
 | 
| +- (void)setSelectedButtonByIndex:(int)index;
 | 
| +
 | 
| +// Offset our folder menu window. This is usually needed in response to a
 | 
| +// parent folder menu window or the bookmark bar changing position due to
 | 
| +// the dragging of a bookmark node from the parent into this folder menu.
 | 
| +- (void)offsetFolderMenuWindow:(NSSize)offset;
 | 
| +
 | 
| +// Re-layout the window menu in case some buttons were added or removed,
 | 
| +// specifically as a result of the bookmark bar changing configuration
 | 
| +// and altering the contents of the off-the-side folder.
 | 
| +- (void)reconfigureMenu;
 | 
| +
 | 
| +// Actions from a context menu over a button or folder.
 | 
| +- (IBAction)cutBookmark:(id)sender;
 | 
| +- (IBAction)copyBookmark:(id)sender;
 | 
| +- (IBAction)pasteBookmark:(id)sender;
 | 
| +- (IBAction)deleteBookmark:(id)sender;
 | 
| +
 | 
| +// Passed up by a child view to tell us of a desire to scroll.
 | 
| +- (void)scrollWheel:(NSEvent *)theEvent;
 | 
| +
 | 
| +- (void)mouseDragged:(NSEvent*)theEvent;
 | 
| +
 | 
|  
 | 
| -// Closes the menu.
 | 
| -- (void)closeMenu;
 | 
| +// Forwarded to the associated BookmarkBarController.
 | 
| +- (IBAction)addFolder:(id)sender;
 | 
| +- (IBAction)addPage:(id)sender;
 | 
| +- (IBAction)editBookmark:(id)sender;
 | 
| +- (IBAction)openBookmark:(id)sender;
 | 
| +- (IBAction)openAllBookmarks:(id)sender;
 | 
| +- (IBAction)openAllBookmarksIncognitoWindow:(id)sender;
 | 
| +- (IBAction)openAllBookmarksNewWindow:(id)sender;
 | 
| +- (IBAction)openBookmarkInIncognitoWindow:(id)sender;
 | 
| +- (IBAction)openBookmarkInNewForegroundTab:(id)sender;
 | 
| +- (IBAction)openBookmarkInNewWindow:(id)sender;
 | 
|  
 | 
| -// For the "Off The Side" chevron menu, this sets the index in the bookmark_bar
 | 
| -// node at which the folder should start showing menu items. Forwarded to the
 | 
| -// bridge.
 | 
| -- (void)setOffTheSideNodeStartIndex:(size_t)index;
 | 
| +@property(assign, nonatomic) BOOL subFolderGrowthToRight;
 | 
|  
 | 
|  @end
 | 
|  
 | 
| -@interface BookmarkBarFolderController (ExposedForTesting)
 | 
| -- (BookmarkMenuBridge*)menuBridge;
 | 
| +@interface BookmarkBarFolderController(TestingAPI)
 | 
| +- (NSPoint)windowTopLeftForWidth:(int)windowWidth
 | 
| +                          height:(int)windowHeight;
 | 
| +- (NSArray*)buttons;
 | 
| +- (BookmarkBarFolderController*)folderController;
 | 
| +- (id)folderTarget;
 | 
| +- (void)configureWindowLevel;
 | 
| +- (void)performOneScroll:(CGFloat)delta;
 | 
| +- (BookmarkButton*)buttonThatMouseIsIn;
 | 
| +// Set to YES in order to prevent animations.
 | 
| +- (void)setIgnoreAnimations:(BOOL)ignore;
 | 
| +
 | 
| +// Return YES if the scroll-up or scroll-down arrows are showing.
 | 
| +- (BOOL)canScrollUp;
 | 
| +- (BOOL)canScrollDown;
 | 
| +- (CGFloat)verticalScrollArrowHeight;
 | 
| +- (NSView*)visibleView;
 | 
| +- (NSScrollView*)scrollView;
 | 
| +- (NSView*)folderView;
 | 
| +
 | 
| +- (BookmarkButton*)buttonForDroppingOnAtPoint:(NSPoint)point;
 | 
|  @end
 | 
|  
 | 
|  #endif  // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BAR_FOLDER_CONTROLLER_H_
 | 
| 
 |