OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 #include "base/mac_util.h" | 5 #include "base/mac_util.h" |
6 #include "base/sys_string_conversions.h" | 6 #include "base/sys_string_conversions.h" |
7 #include "chrome/browser/bookmarks/bookmark_editor.h" | 7 #include "chrome/browser/bookmarks/bookmark_editor.h" |
8 #include "chrome/browser/bookmarks/bookmark_model.h" | 8 #include "chrome/browser/bookmarks/bookmark_model.h" |
9 #include "chrome/browser/browser.h" | 9 #include "chrome/browser/browser.h" |
10 #include "chrome/browser/browser_list.h" | 10 #include "chrome/browser/browser_list.h" |
11 #import "chrome/browser/cocoa/bookmark_bar_bridge.h" | 11 #import "chrome/browser/cocoa/bookmark_bar_bridge.h" |
12 #import "chrome/browser/cocoa/bookmark_bar_controller.h" | 12 #import "chrome/browser/cocoa/bookmark_bar_controller.h" |
13 #import "chrome/browser/cocoa/bookmark_button_cell.h" | 13 #import "chrome/browser/cocoa/bookmark_button_cell.h" |
14 #import "chrome/browser/cocoa/bookmark_editor_controller.h" | 14 #import "chrome/browser/cocoa/bookmark_editor_controller.h" |
15 #import "chrome/browser/cocoa/bookmark_name_folder_controller.h" | 15 #import "chrome/browser/cocoa/bookmark_name_folder_controller.h" |
16 #import "chrome/browser/cocoa/bookmark_menu_cocoa_controller.h" | 16 #import "chrome/browser/cocoa/bookmark_menu_cocoa_controller.h" |
| 17 #import "chrome/browser/cocoa/event_utils.h" |
17 #import "chrome/browser/cocoa/view_resizer.h" | 18 #import "chrome/browser/cocoa/view_resizer.h" |
18 #include "chrome/browser/cocoa/nsimage_cache.h" | 19 #include "chrome/browser/cocoa/nsimage_cache.h" |
19 #include "chrome/browser/profile.h" | 20 #include "chrome/browser/profile.h" |
20 #import "chrome/common/cocoa_utils.h" | |
21 #include "chrome/common/pref_names.h" | 21 #include "chrome/common/pref_names.h" |
22 #include "chrome/common/pref_service.h" | 22 #include "chrome/common/pref_service.h" |
23 #include "skia/ext/skia_utils_mac.h" | 23 #include "skia/ext/skia_utils_mac.h" |
24 | 24 |
| 25 // Specialization of NSButton that responds to middle-clicks. By default, |
| 26 // NSButton ignores them. |
| 27 @interface BookmarkButton : NSButton |
| 28 @end |
| 29 |
| 30 @implementation BookmarkButton |
| 31 - (void)otherMouseUp:(NSEvent*) event { |
| 32 [self performClick:self]; |
| 33 } |
| 34 @end |
| 35 |
25 @interface BookmarkBarController(Private) | 36 @interface BookmarkBarController(Private) |
26 - (void)applyContentAreaOffset:(BOOL)apply immediately:(BOOL)immediately; | 37 - (void)applyContentAreaOffset:(BOOL)apply immediately:(BOOL)immediately; |
27 - (void)showBookmarkBar:(BOOL)enable immediately:(BOOL)immediately; | 38 - (void)showBookmarkBar:(BOOL)enable immediately:(BOOL)immediately; |
28 - (void)addNode:(const BookmarkNode*)child toMenu:(NSMenu*)menu; | 39 - (void)addNode:(const BookmarkNode*)child toMenu:(NSMenu*)menu; |
29 - (void)addFolderNode:(const BookmarkNode*)node toMenu:(NSMenu*)menu; | 40 - (void)addFolderNode:(const BookmarkNode*)node toMenu:(NSMenu*)menu; |
30 - (void)tagEmptyMenu:(NSMenu*)menu; | 41 - (void)tagEmptyMenu:(NSMenu*)menu; |
31 - (void)clearMenuTagMap; | 42 - (void)clearMenuTagMap; |
32 @end | 43 @end |
33 | 44 |
34 namespace { | 45 namespace { |
35 | 46 |
36 // Our height, when opened. | 47 // Our height, when opened. |
37 const int kBookmarkBarHeight = 30; | 48 const int kBookmarkBarHeight = 30; |
38 | 49 |
39 // Magic numbers from Cole | 50 // Magic numbers from Cole |
40 const CGFloat kDefaultBookmarkWidth = 150.0; | 51 const CGFloat kDefaultBookmarkWidth = 150.0; |
41 const CGFloat kBookmarkVerticalPadding = 2.0; | 52 const CGFloat kBookmarkVerticalPadding = 2.0; |
42 const CGFloat kBookmarkHorizontalPadding = 1.0; | 53 const CGFloat kBookmarkHorizontalPadding = 1.0; |
43 }; | 54 |
| 55 } // namespace |
44 | 56 |
45 @implementation BookmarkBarController | 57 @implementation BookmarkBarController |
46 | 58 |
47 - (id)initWithProfile:(Profile*)profile | 59 - (id)initWithProfile:(Profile*)profile |
48 initialWidth:(float)initialWidth | 60 initialWidth:(float)initialWidth |
49 resizeDelegate:(id<ViewResizer>)resizeDelegate | 61 resizeDelegate:(id<ViewResizer>)resizeDelegate |
50 urlDelegate:(id<BookmarkURLOpener>)urlDelegate { | 62 urlDelegate:(id<BookmarkURLOpener>)urlDelegate { |
51 if ((self = [super initWithNibName:@"BookmarkBar" | 63 if ((self = [super initWithNibName:@"BookmarkBar" |
52 bundle:mac_util::MainAppBundle()])) { | 64 bundle:mac_util::MainAppBundle()])) { |
53 profile_ = profile; | 65 profile_ = profile; |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 - (BookmarkNode*)nodeFromButton:(id)button { | 191 - (BookmarkNode*)nodeFromButton:(id)button { |
180 NSCell* cell = [button cell]; | 192 NSCell* cell = [button cell]; |
181 BookmarkNode* node = static_cast<BookmarkNode*>( | 193 BookmarkNode* node = static_cast<BookmarkNode*>( |
182 [[cell representedObject] pointerValue]); | 194 [[cell representedObject] pointerValue]); |
183 DCHECK(node); | 195 DCHECK(node); |
184 return node; | 196 return node; |
185 } | 197 } |
186 | 198 |
187 - (IBAction)openBookmark:(id)sender { | 199 - (IBAction)openBookmark:(id)sender { |
188 BookmarkNode* node = [self nodeFromButton:sender]; | 200 BookmarkNode* node = [self nodeFromButton:sender]; |
189 WindowOpenDisposition disposition = event_utils::DispositionFromEventFlags( | 201 [urlDelegate_ openBookmarkURL:node->GetURL() |
190 [[NSApp currentEvent] modifierFlags]); | 202 disposition:event_utils::WindowOpenDispositionFromNSEvent( |
191 [urlDelegate_ openBookmarkURL:node->GetURL() disposition:disposition]; | 203 [NSApp currentEvent])]; |
192 } | 204 } |
193 | 205 |
194 // Given a NSMenuItem tag, return the appropriate bookmark node id. | 206 // Given a NSMenuItem tag, return the appropriate bookmark node id. |
195 - (int64)nodeIdFromMenuTag:(int32)tag { | 207 - (int64)nodeIdFromMenuTag:(int32)tag { |
196 return menuTagMap_[tag]; | 208 return menuTagMap_[tag]; |
197 } | 209 } |
198 | 210 |
199 // Create and return a new tag for the given node id. | 211 // Create and return a new tag for the given node id. |
200 - (int32)menuTagFromNodeId:(int64)menuid { | 212 - (int32)menuTagFromNodeId:(int64)menuid { |
201 int tag = seedId_++; | 213 int tag = seedId_++; |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
494 each_frame.origin.x += delta; | 506 each_frame.origin.x += delta; |
495 [each_button setFrame:each_frame]; | 507 [each_button setFrame:each_frame]; |
496 } | 508 } |
497 } | 509 } |
498 } | 510 } |
499 } | 511 } |
500 | 512 |
501 - (IBAction)openBookmarkMenuItem:(id)sender { | 513 - (IBAction)openBookmarkMenuItem:(id)sender { |
502 int64 tag = [self nodeIdFromMenuTag:[sender tag]]; | 514 int64 tag = [self nodeIdFromMenuTag:[sender tag]]; |
503 const BookmarkNode* node = bookmarkModel_->GetNodeByID(tag); | 515 const BookmarkNode* node = bookmarkModel_->GetNodeByID(tag); |
504 WindowOpenDisposition disposition = event_utils::DispositionFromEventFlags( | 516 WindowOpenDisposition disposition = |
505 [[NSApp currentEvent] modifierFlags]); | 517 event_utils::WindowOpenDispositionFromNSEvent([NSApp currentEvent]); |
506 [urlDelegate_ openBookmarkURL:node->GetURL() disposition:disposition]; | 518 [urlDelegate_ openBookmarkURL:node->GetURL() disposition:disposition]; |
507 } | 519 } |
508 | 520 |
509 // Add all items from the given model to our bookmark bar. | 521 // Add all items from the given model to our bookmark bar. |
510 // TODO(jrg): lots of things! | 522 // TODO(jrg): lots of things! |
511 // - bookmark folders (e.g. menu from the button) | 523 // - bookmark folders (e.g. menu from the button) |
512 // - button and menu on the right for when bookmarks don't all fit on the | 524 // - button and menu on the right for when bookmarks don't all fit on the |
513 // screen | 525 // screen |
514 // - ... | 526 // - ... |
515 // | 527 // |
516 // TODO(jrg): write a "build bar" so there is a nice spot for things | 528 // TODO(jrg): write a "build bar" so there is a nice spot for things |
517 // like the contextual menu which is invoked when not over a | 529 // like the contextual menu which is invoked when not over a |
518 // bookmark. On Safari that menu has a "new folder" option. | 530 // bookmark. On Safari that menu has a "new folder" option. |
519 - (void)addNodesToBar:(const BookmarkNode*)node { | 531 - (void)addNodesToBar:(const BookmarkNode*)node { |
520 int x_offset = 0; | 532 int x_offset = 0; |
521 for (int i = 0; i < node->GetChildCount(); i++) { | 533 for (int i = 0; i < node->GetChildCount(); i++) { |
522 const BookmarkNode* child = node->GetChild(i); | 534 const BookmarkNode* child = node->GetChild(i); |
523 | 535 |
524 NSCell* cell = [self cellForBookmarkNode:child]; | 536 NSCell* cell = [self cellForBookmarkNode:child]; |
525 NSRect frame = [self frameForBookmarkButtonFromCell:cell xOffset:&x_offset]; | 537 NSRect frame = [self frameForBookmarkButtonFromCell:cell xOffset:&x_offset]; |
526 NSButton* button = [[[NSButton alloc] initWithFrame:frame] | 538 NSButton* button = [[[BookmarkButton alloc] initWithFrame:frame] |
527 autorelease]; | 539 autorelease]; |
528 DCHECK(button); | 540 DCHECK(button); |
529 [buttons_ addObject:button]; | 541 [buttons_ addObject:button]; |
530 | 542 |
531 // [NSButton setCell:] warns to NOT use setCell: other than in the | 543 // [NSButton setCell:] warns to NOT use setCell: other than in the |
532 // initializer of a control. However, we are using a basic | 544 // initializer of a control. However, we are using a basic |
533 // NSButton whose initializer does not take an NSCell as an | 545 // NSButton whose initializer does not take an NSCell as an |
534 // object. To honor the assumed semantics, we do nothing with | 546 // object. To honor the assumed semantics, we do nothing with |
535 // NSButton between alloc/init and setCell:. | 547 // NSButton between alloc/init and setCell:. |
536 [button setCell:cell]; | 548 [button setCell:cell]; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
633 | 645 |
634 - (void)setUrlDelegate:(id<BookmarkURLOpener>)urlDelegate { | 646 - (void)setUrlDelegate:(id<BookmarkURLOpener>)urlDelegate { |
635 urlDelegate_ = urlDelegate; | 647 urlDelegate_ = urlDelegate; |
636 } | 648 } |
637 | 649 |
638 - (NSArray*)buttons { | 650 - (NSArray*)buttons { |
639 return buttons_.get(); | 651 return buttons_.get(); |
640 } | 652 } |
641 | 653 |
642 @end | 654 @end |
OLD | NEW |