OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BAR_FOLDER_CONTROLLER_H_ | 5 #ifndef CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BAR_FOLDER_CONTROLLER_H_ |
6 #define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BAR_FOLDER_CONTROLLER_H_ | 6 #define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BAR_FOLDER_CONTROLLER_H_ |
7 #pragma once | 7 #pragma once |
8 | 8 |
9 #import <Cocoa/Cocoa.h> | 9 #import <Cocoa/Cocoa.h> |
10 | 10 |
11 #include "base/memory/scoped_nsobject.h" | 11 #include "base/memory/scoped_nsobject.h" |
12 #include "base/memory/scoped_ptr.h" | 12 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_button.h" |
13 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.h" | 13 #import "chrome/browser/ui/cocoa/tracking_area.h" |
14 | 14 |
15 @class BookmarkBarController; | 15 @class BookmarkBarController; |
16 @class BookmarkButton; | 16 @class BookmarkBarFolderView; |
17 class BookmarkMenuBridge; | 17 @class BookmarkFolderTarget; |
18 class BookmarkModel; | 18 @class BookmarkBarFolderHoverState; |
19 | 19 @class BookmarkBarFolderWindow; |
20 // A controller for the menus that are attached to the folder buttons on the | 20 @class BookmarkBarFolderWindowContentView; |
21 // bookmark bar. | 21 |
22 @interface BookmarkBarFolderController : NSObject<BookmarkMenuDelegate> { | 22 // A controller for the pop-up windows from bookmark folder buttons |
| 23 // which look sort of like menus. |
| 24 @interface BookmarkBarFolderController : |
| 25 NSWindowController<BookmarkButtonDelegate, |
| 26 BookmarkButtonControllerProtocol, |
| 27 NSUserInterfaceValidations> { |
23 @private | 28 @private |
24 // The button whose click opened us. | 29 // The button whose click opened us. |
25 scoped_nsobject<BookmarkButton> parentButton_; | 30 scoped_nsobject<BookmarkButton> parentButton_; |
26 | 31 |
27 // The bookmark bar controller. Weak. | 32 // Bookmark bar folder controller chains are torn down in two ways: |
28 BookmarkBarController* barController_; | 33 // 1. Clicking "outside" the folder (see use of |
29 | 34 // CrApplicationEventHookProtocol in the bookmark bar controller). |
30 // The root menu for this node. | 35 // 2. Engaging a different folder (via hover over or explicit click). |
31 scoped_nsobject<NSMenu> menu_; | 36 // |
32 | 37 // In either case, the BookmarkButtonControllerProtocol method |
33 // The class that builds the menu. | 38 // closeAllBookmarkFolders gets called. For bookmark bar folder |
34 scoped_ptr<BookmarkMenuBridge> menuBridge_; | 39 // controllers, this is passed up the chain so we begin with a top |
| 40 // level "close". |
| 41 // When any bookmark folder window closes, it necessarily tells |
| 42 // subcontroller windows to close (down the chain), and autoreleases |
| 43 // the controller. (Must autorelease since the controller can still |
| 44 // get delegate events such as windowDidClose). |
| 45 // |
| 46 // Bookmark bar folder controllers own their buttons. When doing |
| 47 // drag and drop of a button from one sub-sub-folder to a different |
| 48 // sub-sub-folder, we need to make sure the button's pointers stay |
| 49 // valid until we've dropped (or cancelled). Note that such a drag |
| 50 // causes the source sub-sub-folder (previous parent window) to go |
| 51 // away (windows close, controllers autoreleased) since you're |
| 52 // hovering over a different folder chain for dropping. To keep |
| 53 // things valid (like the button's target, its delegate, the parent |
| 54 // cotroller that we have a pointer to below [below], etc), we heep |
| 55 // strong pointers to our owning controller, so the entire chain |
| 56 // stays owned. |
| 57 |
| 58 // Our parent controller, if we are a nested folder, otherwise nil. |
| 59 // Strong to insure the object lives as long as we need it. |
| 60 scoped_nsobject<BookmarkBarFolderController> parentController_; |
| 61 |
| 62 // The main bar controller from whence we or a parent sprang. |
| 63 BookmarkBarController* barController_; // WEAK: It owns us. |
| 64 |
| 65 // Our buttons. We do not have buttons for nested folders. |
| 66 scoped_nsobject<NSMutableArray> buttons_; |
| 67 |
| 68 // The scroll view that contains our main button view (below). |
| 69 IBOutlet NSScrollView* scrollView_; |
| 70 |
| 71 // The view defining the visible area in which we draw our content. |
| 72 IBOutlet BookmarkBarFolderWindowContentView* visibleView_; |
| 73 |
| 74 // The main view of this window (where the buttons go) within the scroller. |
| 75 IBOutlet BookmarkBarFolderView* folderView_; |
| 76 |
| 77 // A window used to show the shadow behind the main window when it is |
| 78 // scrollable. (A 'shadow' window is needed because the main window, when |
| 79 // scrollable in either or both directions, will reach completely to the |
| 80 // top and/or bottom edge of the screen in order to support mouse tracking |
| 81 // during scrolling operations. In that case, though, the 'visible' |
| 82 // window must be inset a bit from the edge of the screen for aesthetics; |
| 83 // it will also be inset much more from the bottom of the screen when the |
| 84 // Dock is showing. When scrollable, the main window would show a shadow |
| 85 // incorrectly positioned, hence the 'shadow' window.) |
| 86 IBOutlet BookmarkBarFolderWindow* shadowWindow_; |
| 87 |
| 88 // The up and down scroll arrow views. These arrows are hidden and shown |
| 89 // as necessary (when scrolling is possible) and are contained in the nib |
| 90 // as siblings to the scroll view. |
| 91 IBOutlet NSView* scrollDownArrowView_; // Positioned at the top. |
| 92 IBOutlet NSView* scrollUpArrowView_; // Positioned at the bottom. |
| 93 |
| 94 // YES if subfolders should grow to the right (the default). |
| 95 // Direction switches if we'd grow off the screen. |
| 96 BOOL subFolderGrowthToRight_; |
| 97 |
| 98 // Weak; we keep track to work around a |
| 99 // setShowsBorderOnlyWhileMouseInside bug. |
| 100 BookmarkButton* buttonThatMouseIsIn_; |
| 101 |
| 102 // The context menu for a bookmark button which represents an URL. |
| 103 IBOutlet NSMenu* buttonMenu_; |
| 104 |
| 105 // The context menu for a bookmark button which represents a folder. |
| 106 IBOutlet NSMenu* folderMenu_; |
| 107 |
| 108 // We model hover state as a state machine with specific allowable |
| 109 // transitions. |hoverState_| is the state of this machine at any |
| 110 // given time. |
| 111 scoped_nsobject<BookmarkBarFolderHoverState> hoverState_; |
| 112 |
| 113 // Logic for dealing with a click on a bookmark folder button. |
| 114 scoped_nsobject<BookmarkFolderTarget> folderTarget_; |
| 115 |
| 116 // A controller for a pop-up bookmark folder window (custom menu). |
| 117 // We (self) are the parentController_ for our folderController_. |
| 118 // This is not a scoped_nsobject because it owns itself (when its |
| 119 // window closes the controller gets autoreleased). |
| 120 BookmarkBarFolderController* folderController_; |
| 121 |
| 122 // Implement basic menu scrolling through this tracking area. |
| 123 ScopedCrTrackingArea scrollTrackingArea_; |
| 124 |
| 125 // Timer to continue scrolling as needed. We own the timer but |
| 126 // don't release it when done (we invalidate it). |
| 127 NSTimer* scrollTimer_; |
| 128 |
| 129 // Precalculated sum of left and right edge padding of buttons in a |
| 130 // folder menu window. This is calculated from the widths of the main |
| 131 // folder menu window and the scroll view within. |
| 132 CGFloat padding_; |
| 133 |
| 134 // Amount to scroll by on each timer fire. Can be + or -. |
| 135 CGFloat verticalScrollDelta_; |
| 136 |
| 137 // We need to know the size of the vertical scrolling arrows so we |
| 138 // can obscure/unobscure them. |
| 139 CGFloat verticalScrollArrowHeight_; |
| 140 |
| 141 // Set to YES to prevent any node animations. Useful for unit testing so that |
| 142 // incomplete animations do not cause valgrind complaints. |
| 143 BOOL ignoreAnimations_; |
| 144 |
| 145 int selectedIndex_; |
| 146 NSString* typedPrefix_; |
35 } | 147 } |
36 | 148 |
37 // Designated initializer. | 149 // Designated initializer. |
38 - (id)initWithParentButton:(BookmarkButton*)button | 150 - (id)initWithParentButton:(BookmarkButton*)button |
39 bookmarkModel:(BookmarkModel*)model | 151 parentController:(BookmarkBarFolderController*)parentController |
40 barController:(BookmarkBarController*)barController; | 152 barController:(BookmarkBarController*)barController; |
41 | 153 |
42 // Return the parent button that owns the bookmark folder we represent. | 154 // Return the parent button that owns the bookmark folder we represent. |
43 - (BookmarkButton*)parentButton; | 155 - (BookmarkButton*)parentButton; |
44 | 156 |
45 // Opens the menu. This will retain itself before it runs the menu and will | 157 // Text typed by user, for type-select and arrow key support. |
46 // release itself when the menu closes. | 158 // Returns YES if the menu should be closed now. |
47 - (void)openMenu; | 159 - (BOOL)handleInputText:(NSString*)newText; |
48 | 160 |
49 // Closes the menu. | 161 // If you wanted to clear the type-select buffer. Currently only used |
50 - (void)closeMenu; | 162 // internally. |
51 | 163 - (void)clearInputText; |
52 // For the "Off The Side" chevron menu, this sets the index in the bookmark_bar | 164 |
53 // node at which the folder should start showing menu items. Forwarded to the | 165 // Gets notified when a fav icon asynchronously loads, so we can now use the |
54 // bridge. | 166 // real icon instead of a generic placeholder. |
55 - (void)setOffTheSideNodeStartIndex:(size_t)index; | 167 - (void)faviconLoadedForNode:(const BookmarkNode*)node; |
| 168 |
| 169 - (void)setSelectedButtonByIndex:(int)index; |
| 170 |
| 171 // Offset our folder menu window. This is usually needed in response to a |
| 172 // parent folder menu window or the bookmark bar changing position due to |
| 173 // the dragging of a bookmark node from the parent into this folder menu. |
| 174 - (void)offsetFolderMenuWindow:(NSSize)offset; |
| 175 |
| 176 // Re-layout the window menu in case some buttons were added or removed, |
| 177 // specifically as a result of the bookmark bar changing configuration |
| 178 // and altering the contents of the off-the-side folder. |
| 179 - (void)reconfigureMenu; |
| 180 |
| 181 // Actions from a context menu over a button or folder. |
| 182 - (IBAction)cutBookmark:(id)sender; |
| 183 - (IBAction)copyBookmark:(id)sender; |
| 184 - (IBAction)pasteBookmark:(id)sender; |
| 185 - (IBAction)deleteBookmark:(id)sender; |
| 186 |
| 187 // Passed up by a child view to tell us of a desire to scroll. |
| 188 - (void)scrollWheel:(NSEvent *)theEvent; |
| 189 |
| 190 - (void)mouseDragged:(NSEvent*)theEvent; |
| 191 |
| 192 |
| 193 // Forwarded to the associated BookmarkBarController. |
| 194 - (IBAction)addFolder:(id)sender; |
| 195 - (IBAction)addPage:(id)sender; |
| 196 - (IBAction)editBookmark:(id)sender; |
| 197 - (IBAction)openBookmark:(id)sender; |
| 198 - (IBAction)openAllBookmarks:(id)sender; |
| 199 - (IBAction)openAllBookmarksIncognitoWindow:(id)sender; |
| 200 - (IBAction)openAllBookmarksNewWindow:(id)sender; |
| 201 - (IBAction)openBookmarkInIncognitoWindow:(id)sender; |
| 202 - (IBAction)openBookmarkInNewForegroundTab:(id)sender; |
| 203 - (IBAction)openBookmarkInNewWindow:(id)sender; |
| 204 |
| 205 @property(assign, nonatomic) BOOL subFolderGrowthToRight; |
56 | 206 |
57 @end | 207 @end |
58 | 208 |
59 @interface BookmarkBarFolderController (ExposedForTesting) | 209 @interface BookmarkBarFolderController(TestingAPI) |
60 - (BookmarkMenuBridge*)menuBridge; | 210 - (NSPoint)windowTopLeftForWidth:(int)windowWidth |
| 211 height:(int)windowHeight; |
| 212 - (NSArray*)buttons; |
| 213 - (BookmarkBarFolderController*)folderController; |
| 214 - (id)folderTarget; |
| 215 - (void)configureWindowLevel; |
| 216 - (void)performOneScroll:(CGFloat)delta; |
| 217 - (BookmarkButton*)buttonThatMouseIsIn; |
| 218 // Set to YES in order to prevent animations. |
| 219 - (void)setIgnoreAnimations:(BOOL)ignore; |
| 220 |
| 221 // Return YES if the scroll-up or scroll-down arrows are showing. |
| 222 - (BOOL)canScrollUp; |
| 223 - (BOOL)canScrollDown; |
| 224 - (CGFloat)verticalScrollArrowHeight; |
| 225 - (NSView*)visibleView; |
| 226 - (NSScrollView*)scrollView; |
| 227 - (NSView*)folderView; |
| 228 |
| 229 - (BookmarkButton*)buttonForDroppingOnAtPoint:(NSPoint)point; |
61 @end | 230 @end |
62 | 231 |
63 #endif // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BAR_FOLDER_CONTROLLER_H_ | 232 #endif // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BAR_FOLDER_CONTROLLER_H_ |
OLD | NEW |