OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_CONTROLLER_H_ | 5 #ifndef CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BAR_CONTROLLER_H_ |
6 #define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BAR_CONTROLLER_H_ | 6 #define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BAR_CONTROLLER_H_ |
7 | 7 |
8 #import <Cocoa/Cocoa.h> | 8 #import <Cocoa/Cocoa.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
11 #include <map> | 11 #include <map> |
12 #include <memory> | 12 #include <memory> |
13 #include <unordered_map> | |
14 | 13 |
15 #import "base/mac/cocoa_protocols.h" | 14 #import "base/mac/cocoa_protocols.h" |
16 #include "base/mac/scoped_nsobject.h" | 15 #include "base/mac/scoped_nsobject.h" |
17 #include "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_bridge.h" | 16 #include "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_bridge.h" |
18 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_constants.h" | 17 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_constants.h" |
19 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_state.h" | 18 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_state.h" |
20 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_toolbar_view.h" | 19 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_bar_toolbar_view.h" |
21 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_button.h" | 20 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_button.h" |
22 #import "chrome/browser/ui/cocoa/has_weak_browser_pointer.h" | 21 #import "chrome/browser/ui/cocoa/has_weak_browser_pointer.h" |
23 #include "chrome/browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.h" | 22 #include "chrome/browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.h" |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 // Folder3. Without this delay, that'll cause Sub to be closed before | 126 // Folder3. Without this delay, that'll cause Sub to be closed before |
128 // you get there, since a "hover over" of Folder3 gets activated. | 127 // you get there, since a "hover over" of Folder3 gets activated. |
129 // It's subtle but without the delay it feels broken. | 128 // It's subtle but without the delay it feels broken. |
130 // | 129 // |
131 // This is only really a problem with vertical menu --> vertical menu | 130 // This is only really a problem with vertical menu --> vertical menu |
132 // movement; the bookmark bar (horizontal menu, sort of) seems fine, | 131 // movement; the bookmark bar (horizontal menu, sort of) seems fine, |
133 // perhaps because mouse move direction is purely vertical so there is | 132 // perhaps because mouse move direction is purely vertical so there is |
134 // no opportunity for overlap. | 133 // no opportunity for overlap. |
135 const NSTimeInterval kDragHoverCloseDelay = 0.4; | 134 const NSTimeInterval kDragHoverCloseDelay = 0.4; |
136 | 135 |
137 enum BookmarkBarVisibleElementsMask { | |
138 kVisibleElementsMaskNone = 0, | |
139 kVisibleElementsMaskAppsButton = 1 << 0, | |
140 kVisibleElementsMaskManagedBookmarksButton = 1 << 1, | |
141 kVisibleElementsMaskSupervisedBookmarksButton = 1 << 2, | |
142 kVisibleElementsMaskOffTheSideButton = 1 << 3, | |
143 kVisibleElementsMaskOtherBookmarksButton = 1 << 4, | |
144 kVisibleElementsMaskNoItemTextField = 1 << 5, | |
145 kVisibleElementsMaskImportBookmarksButton = 1 << 6, | |
146 }; | |
147 | |
148 // Specifies the location and visibility of the various sub-elements | |
149 // of the bookmark bar. Allows calculating the layout and actually | |
150 // applying it to views to be decoupled. For example, applying | |
151 // the layout in an RTL context transforms all horizontal offsets | |
152 // transparently. | |
153 struct BookmarkBarLayout { | |
154 public: | |
155 BookmarkBarLayout(); | |
156 ~BookmarkBarLayout(); | |
157 BookmarkBarLayout(BookmarkBarLayout&& other); | |
158 BookmarkBarLayout& operator=(BookmarkBarLayout&& other); | |
159 | |
160 bool IsAppsButtonVisible() const { | |
161 return visible_elements & kVisibleElementsMaskAppsButton; | |
162 } | |
163 bool IsManagedBookmarksButtonVisible() const { | |
164 return visible_elements & kVisibleElementsMaskManagedBookmarksButton; | |
165 } | |
166 bool IsSupervisedBookmarksButtonVisible() const { | |
167 return visible_elements & kVisibleElementsMaskSupervisedBookmarksButton; | |
168 } | |
169 bool IsOffTheSideButtonVisible() const { | |
170 return visible_elements & kVisibleElementsMaskOffTheSideButton; | |
171 } | |
172 bool IsOtherBookmarksButtonVisible() const { | |
173 return visible_elements & kVisibleElementsMaskOtherBookmarksButton; | |
174 } | |
175 bool IsNoItemTextFieldVisible() const { | |
176 return visible_elements & kVisibleElementsMaskNoItemTextField; | |
177 } | |
178 bool IsImportBookmarksButtonVisible() const { | |
179 return visible_elements & kVisibleElementsMaskImportBookmarksButton; | |
180 } | |
181 size_t VisibleButtonCount() const { return button_offsets.size(); } | |
182 | |
183 unsigned int visible_elements; | |
184 CGFloat apps_button_offset; | |
185 CGFloat managed_bookmarks_button_offset; | |
186 CGFloat supervised_bookmarks_button_offset; | |
187 CGFloat off_the_side_button_offset; | |
188 CGFloat other_bookmarks_button_offset; | |
189 CGFloat no_item_textfield_offset; | |
190 CGFloat no_item_textfield_width; | |
191 CGFloat import_bookmarks_button_offset; | |
192 CGFloat import_bookmarks_button_width; | |
193 CGFloat max_x; | |
194 | |
195 std::unordered_map<int64_t, CGFloat> button_offsets; | |
196 }; | |
197 | |
198 } // namespace bookmarks | 136 } // namespace bookmarks |
199 | 137 |
200 // The interface for the bookmark bar controller's delegate. Currently, the | 138 // The interface for the bookmark bar controller's delegate. Currently, the |
201 // delegate is the BWC and is responsible for ensuring that the toolbar is | 139 // delegate is the BWC and is responsible for ensuring that the toolbar is |
202 // displayed correctly (as specified by |-getDesiredToolbarHeightCompression| | 140 // displayed correctly (as specified by |-getDesiredToolbarHeightCompression| |
203 // and |-toolbarDividerOpacity|) at the beginning and at the end of an animation | 141 // and |-toolbarDividerOpacity|) at the beginning and at the end of an animation |
204 // (or after a state change). | 142 // (or after a state change). |
205 @protocol BookmarkBarControllerDelegate | 143 @protocol BookmarkBarControllerDelegate |
206 | 144 |
207 // Sent when the state has changed (after any animation), but before the final | 145 // Sent when the state has changed (after any animation), but before the final |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 BookmarkBarFolderController* folderController_; | 219 BookmarkBarFolderController* folderController_; |
282 | 220 |
283 // The event tap that allows monitoring of all events, to properly close with | 221 // The event tap that allows monitoring of all events, to properly close with |
284 // a click outside the bounds of the window. | 222 // a click outside the bounds of the window. |
285 id exitEventTap_; | 223 id exitEventTap_; |
286 | 224 |
287 base::scoped_nsobject<BookmarkBarView> | 225 base::scoped_nsobject<BookmarkBarView> |
288 buttonView_; // Contains 'no items' text fields. | 226 buttonView_; // Contains 'no items' text fields. |
289 base::scoped_nsobject<BookmarkButton> offTheSideButton_; // aka the chevron. | 227 base::scoped_nsobject<BookmarkButton> offTheSideButton_; // aka the chevron. |
290 | 228 |
| 229 NSRect originalNoItemsRect_; // Original, pre-resized field rect. |
| 230 NSRect originalImportBookmarksRect_; // Original, pre-resized field rect. |
| 231 |
291 // "Apps" button on the left side. | 232 // "Apps" button on the left side. |
292 base::scoped_nsobject<BookmarkButton> appsPageShortcutButton_; | 233 base::scoped_nsobject<BookmarkButton> appsPageShortcutButton_; |
293 | 234 |
294 // "Managed bookmarks" button on the left side, next to the apps button. | 235 // "Managed bookmarks" button on the left side, next to the apps button. |
295 base::scoped_nsobject<BookmarkButton> managedBookmarksButton_; | 236 base::scoped_nsobject<BookmarkButton> managedBookmarksButton_; |
296 | 237 |
297 // "Supervised bookmarks" button on the left side, next to the apps button. | 238 // "Supervised bookmarks" button on the left side, next to the apps button. |
298 base::scoped_nsobject<BookmarkButton> supervisedBookmarksButton_; | 239 base::scoped_nsobject<BookmarkButton> supervisedBookmarksButton_; |
299 | 240 |
300 // "Other bookmarks" button on the right side. | 241 // "Other bookmarks" button on the right side. |
301 base::scoped_nsobject<BookmarkButton> otherBookmarksButton_; | 242 base::scoped_nsobject<BookmarkButton> otherBookmarksButton_; |
302 | 243 |
303 // When doing a drag, this is folder button "hovered over" which we | 244 // When doing a drag, this is folder button "hovered over" which we |
304 // may want to open after a short delay. There are cases where a | 245 // may want to open after a short delay. There are cases where a |
305 // mouse-enter can open a folder (e.g. if the menus are "active") | 246 // mouse-enter can open a folder (e.g. if the menus are "active") |
306 // but that doesn't use this variable or need a delay so "hover" is | 247 // but that doesn't use this variable or need a delay so "hover" is |
307 // the wrong term. | 248 // the wrong term. |
308 base::scoped_nsobject<BookmarkButton> hoverButton_; | 249 base::scoped_nsobject<BookmarkButton> hoverButton_; |
309 | 250 |
310 // We save the view width when we add bookmark buttons. This lets | 251 // We save the view width when we add bookmark buttons. This lets |
311 // us avoid a rebuild until we've grown the window bigger than our | 252 // us avoid a rebuild until we've grown the window bigger than our |
312 // initial build. | 253 // initial build. |
313 CGFloat savedFrameWidth_; | 254 CGFloat savedFrameWidth_; |
314 | 255 |
| 256 // The number of buttons we display in the bookmark bar. This does |
| 257 // not include the "off the side" chevron or the "Other Bookmarks" |
| 258 // button. We use this number to determine if we need to display |
| 259 // the chevron, and to know what to place in the chevron's menu. |
| 260 // Since we create everything before doing layout we can't be sure |
| 261 // that all bookmark buttons we create will be visible. Thus, |
| 262 // [buttons_ count] isn't a definitive check. |
| 263 int displayedButtonCount_; |
| 264 |
315 // A state flag which tracks when the bar's folder menus should be shown. | 265 // A state flag which tracks when the bar's folder menus should be shown. |
316 // An initial click in any of the folder buttons turns this on and | 266 // An initial click in any of the folder buttons turns this on and |
317 // one of the following will turn it off: another click in the button, | 267 // one of the following will turn it off: another click in the button, |
318 // the window losing focus, a click somewhere other than in the bar | 268 // the window losing focus, a click somewhere other than in the bar |
319 // or a folder menu. | 269 // or a folder menu. |
320 BOOL showFolderMenus_; | 270 BOOL showFolderMenus_; |
321 | 271 |
322 // If YES then state changes (for example, from hidden to shown) are animated. | 272 // If YES then state changes (for example, from hidden to shown) are animated. |
323 // This is turned off for unit tests. | 273 // This is turned off for unit tests. |
324 BOOL stateAnimationsEnabled_; | 274 BOOL stateAnimationsEnabled_; |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 parent:(const bookmarks::BookmarkNode*)oldParent | 420 parent:(const bookmarks::BookmarkNode*)oldParent |
471 index:(int)index; | 421 index:(int)index; |
472 - (void)nodeFaviconLoaded:(bookmarks::BookmarkModel*)model | 422 - (void)nodeFaviconLoaded:(bookmarks::BookmarkModel*)model |
473 node:(const bookmarks::BookmarkNode*)node; | 423 node:(const bookmarks::BookmarkNode*)node; |
474 - (void)nodeChildrenReordered:(bookmarks::BookmarkModel*)model | 424 - (void)nodeChildrenReordered:(bookmarks::BookmarkModel*)model |
475 node:(const bookmarks::BookmarkNode*)node; | 425 node:(const bookmarks::BookmarkNode*)node; |
476 @end | 426 @end |
477 | 427 |
478 // These APIs should only be used by unit tests (or used internally). | 428 // These APIs should only be used by unit tests (or used internally). |
479 @interface BookmarkBarController(InternalOrTestingAPI) | 429 @interface BookmarkBarController(InternalOrTestingAPI) |
480 - (bookmarks::BookmarkBarLayout)layoutFromCurrentState; | |
481 - (void)applyLayout:(const bookmarks::BookmarkBarLayout&)layout | |
482 animated:(BOOL)animated; | |
483 - (void)openBookmarkFolder:(id)sender; | 430 - (void)openBookmarkFolder:(id)sender; |
484 - (void)openOrCloseBookmarkFolderForOffTheSideButton; | 431 - (void)openOrCloseBookmarkFolderForOffTheSideButton; |
485 - (BookmarkBarView*)buttonView; | 432 - (BookmarkBarView*)buttonView; |
486 - (NSMutableArray*)buttons; | 433 - (NSMutableArray*)buttons; |
487 - (BookmarkButton*)otherBookmarksButton; | 434 - (BOOL)offTheSideButtonIsHidden; |
488 - (BookmarkButton*)managedBookmarksButton; | 435 - (BOOL)appsPageShortcutButtonIsHidden; |
489 - (BookmarkButton*)supervisedBookmarksButton; | |
490 - (BookmarkButton*)otherBookmarksButton; | 436 - (BookmarkButton*)otherBookmarksButton; |
491 - (BookmarkBarFolderController*)folderController; | 437 - (BookmarkBarFolderController*)folderController; |
492 - (id)folderTarget; | 438 - (id)folderTarget; |
| 439 - (int)displayedButtonCount; |
493 - (void)openURL:(GURL)url disposition:(WindowOpenDisposition)disposition; | 440 - (void)openURL:(GURL)url disposition:(WindowOpenDisposition)disposition; |
494 - (void)clearBookmarkBar; | 441 - (void)clearBookmarkBar; |
495 - (BookmarkButtonCell*)cellForBookmarkNode:(const bookmarks::BookmarkNode*)node; | 442 - (BookmarkButtonCell*)cellForBookmarkNode:(const bookmarks::BookmarkNode*)node; |
496 - (BookmarkButtonCell*)cellForCustomButtonWithText:(NSString*)text | 443 - (BookmarkButtonCell*)cellForCustomButtonWithText:(NSString*)text |
497 image:(NSImage*)image; | 444 image:(NSImage*)image; |
| 445 - (NSRect)frameForBookmarkButtonFromCell:(NSCell*)cell xOffset:(int*)xOffset; |
498 - (void)checkForBookmarkButtonGrowth:(NSButton*)button; | 446 - (void)checkForBookmarkButtonGrowth:(NSButton*)button; |
499 - (void)frameDidChange; | 447 - (void)frameDidChange; |
500 - (void)updateTheme:(const ui::ThemeProvider*)themeProvider; | 448 - (void)updateTheme:(const ui::ThemeProvider*)themeProvider; |
501 - (BookmarkButton*)buttonForDroppingOnAtPoint:(NSPoint)point; | 449 - (BookmarkButton*)buttonForDroppingOnAtPoint:(NSPoint)point; |
502 - (BOOL)isEventAnExitEvent:(NSEvent*)event; | 450 - (BOOL)isEventAnExitEvent:(NSEvent*)event; |
| 451 - (BOOL)shrinkOrHideView:(NSView*)view forMaxX:(CGFloat)maxViewX; |
503 - (void)unhighlightBookmark:(const bookmarks::BookmarkNode*)node; | 452 - (void)unhighlightBookmark:(const bookmarks::BookmarkNode*)node; |
504 | 453 |
505 @end | 454 @end |
506 | 455 |
507 #endif // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BAR_CONTROLLER_H_ | 456 #endif // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_BAR_CONTROLLER_H_ |
OLD | NEW |