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 "app/l10n_util_mac.h" | 5 #include "app/l10n_util_mac.h" |
6 #include "app/resource_bundle.h" | 6 #include "app/resource_bundle.h" |
7 #include "base/mac_util.h" | 7 #include "base/mac_util.h" |
8 #include "base/sys_string_conversions.h" | 8 #include "base/sys_string_conversions.h" |
9 #include "chrome/browser/bookmarks/bookmark_editor.h" | 9 #include "chrome/browser/bookmarks/bookmark_editor.h" |
10 #include "chrome/browser/bookmarks/bookmark_model.h" | 10 #include "chrome/browser/bookmarks/bookmark_model.h" |
(...skipping 10 matching lines...) Expand all Loading... | |
21 #import "chrome/browser/cocoa/bookmark_menu_cocoa_controller.h" | 21 #import "chrome/browser/cocoa/bookmark_menu_cocoa_controller.h" |
22 #import "chrome/browser/cocoa/event_utils.h" | 22 #import "chrome/browser/cocoa/event_utils.h" |
23 #import "chrome/browser/cocoa/menu_button.h" | 23 #import "chrome/browser/cocoa/menu_button.h" |
24 #import "chrome/browser/cocoa/toolbar_controller.h" | 24 #import "chrome/browser/cocoa/toolbar_controller.h" |
25 #import "chrome/browser/cocoa/view_resizer.h" | 25 #import "chrome/browser/cocoa/view_resizer.h" |
26 #include "chrome/browser/profile.h" | 26 #include "chrome/browser/profile.h" |
27 #include "chrome/browser/tab_contents/tab_contents.h" | 27 #include "chrome/browser/tab_contents/tab_contents.h" |
28 #include "chrome/browser/tab_contents/tab_contents_view.h" | 28 #include "chrome/browser/tab_contents/tab_contents_view.h" |
29 #include "chrome/common/pref_names.h" | 29 #include "chrome/common/pref_names.h" |
30 #include "chrome/common/pref_service.h" | 30 #include "chrome/common/pref_service.h" |
31 #include "grit/app_resources.h" | |
31 #include "grit/generated_resources.h" | 32 #include "grit/generated_resources.h" |
32 #include "grit/theme_resources.h" | 33 #include "grit/theme_resources.h" |
33 #include "skia/ext/skia_utils_mac.h" | 34 #include "skia/ext/skia_utils_mac.h" |
34 #import "third_party/mozilla/include/NSPasteboard+Utils.h" | 35 #import "third_party/mozilla/include/NSPasteboard+Utils.h" |
35 | 36 |
36 // Specialization of NSButton that responds to middle-clicks. By default, | 37 // Specialization of NSButton that responds to middle-clicks. By default, |
37 // NSButton ignores them. | 38 // NSButton ignores them. |
38 @interface BookmarkButton : NSButton | 39 @interface BookmarkButton : NSButton |
39 @end | 40 @end |
40 | 41 |
41 @implementation BookmarkButton | 42 @implementation BookmarkButton |
42 - (void)otherMouseUp:(NSEvent*) event { | 43 - (void)otherMouseUp:(NSEvent*) event { |
43 [self performClick:self]; | 44 [self performClick:self]; |
44 } | 45 } |
45 @end | 46 @end |
46 | 47 |
47 @interface BookmarkBarController(Private) | 48 @interface BookmarkBarController(Private) |
48 - (void)applyContentAreaOffset:(BOOL)apply immediately:(BOOL)immediately; | 49 - (void)applyContentAreaOffset:(BOOL)apply immediately:(BOOL)immediately; |
49 - (void)showBookmarkBar:(BOOL)enable immediately:(BOOL)immediately; | 50 - (void)showBookmarkBar:(BOOL)enable immediately:(BOOL)immediately; |
50 - (void)addNode:(const BookmarkNode*)child toMenu:(NSMenu*)menu; | 51 - (void)addNode:(const BookmarkNode*)child toMenu:(NSMenu*)menu; |
51 - (void)addFolderNode:(const BookmarkNode*)node toMenu:(NSMenu*)menu; | 52 - (void)addFolderNode:(const BookmarkNode*)node toMenu:(NSMenu*)menu; |
52 - (void)tagEmptyMenu:(NSMenu*)menu; | 53 - (void)tagEmptyMenu:(NSMenu*)menu; |
53 - (void)clearMenuTagMap; | 54 - (void)clearMenuTagMap; |
54 - (int)preferredHeight; | 55 - (int)preferredHeight; |
55 - (void)addNonBookmarkButtonsToView; | 56 - (void)addNonBookmarkButtonsToView; |
56 - (void)addButtonsToView; | 57 - (void)addButtonsToView; |
57 - (void)resizeButtons; | 58 - (void)resizeButtons; |
58 - (void)centerNoItemsLabel; | 59 - (void)centerNoItemsLabel; |
60 - (NSImage*)getFavIconForNode:(const BookmarkNode*)node; | |
pink (ping after 24hrs)
2009/11/03 19:42:44
the normal obj-c method naming conventions avoid t
| |
59 @end | 61 @end |
60 | 62 |
61 @implementation BookmarkBarController | 63 @implementation BookmarkBarController |
62 | 64 |
63 - (id)initWithBrowser:(Browser*)browser | 65 - (id)initWithBrowser:(Browser*)browser |
64 initialWidth:(float)initialWidth | 66 initialWidth:(float)initialWidth |
65 compressDelegate:(id<ToolbarCompressable>)compressDelegate | 67 compressDelegate:(id<ToolbarCompressable>)compressDelegate |
66 resizeDelegate:(id<ViewResizer>)resizeDelegate | 68 resizeDelegate:(id<ViewResizer>)resizeDelegate |
67 urlDelegate:(id<BookmarkURLOpener>)urlDelegate { | 69 urlDelegate:(id<BookmarkURLOpener>)urlDelegate { |
68 if ((self = [super initWithNibName:@"BookmarkBar" | 70 if ((self = [super initWithNibName:@"BookmarkBar" |
69 bundle:mac_util::MainAppBundle()])) { | 71 bundle:mac_util::MainAppBundle()])) { |
70 browser_ = browser; | 72 browser_ = browser; |
71 initialWidth_ = initialWidth; | 73 initialWidth_ = initialWidth; |
72 bookmarkModel_ = browser_->profile()->GetBookmarkModel(); | 74 bookmarkModel_ = browser_->profile()->GetBookmarkModel(); |
73 buttons_.reset([[NSMutableArray alloc] init]); | 75 buttons_.reset([[NSMutableArray alloc] init]); |
74 compressDelegate_ = compressDelegate; | 76 compressDelegate_ = compressDelegate; |
75 resizeDelegate_ = resizeDelegate; | 77 resizeDelegate_ = resizeDelegate; |
76 urlDelegate_ = urlDelegate; | 78 urlDelegate_ = urlDelegate; |
77 tabObserver_.reset( | 79 tabObserver_.reset( |
78 new TabStripModelObserverBridge(browser_->tabstrip_model(), self)); | 80 new TabStripModelObserverBridge(browser_->tabstrip_model(), self)); |
79 | 81 |
80 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 82 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
81 folderImage_.reset([rb.GetNSImageNamed(IDR_BOOKMARK_BAR_FOLDER) retain]); | 83 folderImage_.reset([rb.GetNSImageNamed(IDR_BOOKMARK_BAR_FOLDER) retain]); |
84 defaultImage_.reset([rb.GetNSImageNamed(IDR_DEFAULT_FAVICON) retain]); | |
82 } | 85 } |
83 return self; | 86 return self; |
84 } | 87 } |
85 | 88 |
86 - (void)dealloc { | 89 - (void)dealloc { |
87 // Remove our view from its superview so it doesn't attempt to reference | 90 // Remove our view from its superview so it doesn't attempt to reference |
88 // it when the controller is gone. | 91 // it when the controller is gone. |
89 //TODO(dmaclach): Remove -- http://crbug.com/25845 | 92 //TODO(dmaclach): Remove -- http://crbug.com/25845 |
90 [[self view] removeFromSuperview]; | 93 [[self view] removeFromSuperview]; |
91 | 94 |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
350 } | 353 } |
351 | 354 |
352 // Recursively add the given bookmark node and all its children to | 355 // Recursively add the given bookmark node and all its children to |
353 // menu, one menu item per node. | 356 // menu, one menu item per node. |
354 - (void)addNode:(const BookmarkNode*)child toMenu:(NSMenu*)menu { | 357 - (void)addNode:(const BookmarkNode*)child toMenu:(NSMenu*)menu { |
355 NSString* title = [BookmarkMenuCocoaController menuTitleForNode:child]; | 358 NSString* title = [BookmarkMenuCocoaController menuTitleForNode:child]; |
356 NSMenuItem* item = [[[NSMenuItem alloc] initWithTitle:title | 359 NSMenuItem* item = [[[NSMenuItem alloc] initWithTitle:title |
357 action:nil | 360 action:nil |
358 keyEquivalent:@""] autorelease]; | 361 keyEquivalent:@""] autorelease]; |
359 [menu addItem:item]; | 362 [menu addItem:item]; |
363 [item setImage:[self getFavIconForNode:child]]; | |
360 if (child->is_folder()) { | 364 if (child->is_folder()) { |
361 NSMenu* submenu = [[[NSMenu alloc] initWithTitle:title] autorelease]; | 365 NSMenu* submenu = [[[NSMenu alloc] initWithTitle:title] autorelease]; |
362 [menu setSubmenu:submenu forItem:item]; | 366 [menu setSubmenu:submenu forItem:item]; |
363 if (child->GetChildCount()) { | 367 if (child->GetChildCount()) { |
364 [self addFolderNode:child toMenu:submenu]; // potentially recursive | 368 [self addFolderNode:child toMenu:submenu]; // potentially recursive |
365 } else { | 369 } else { |
366 [self tagEmptyMenu:submenu]; | 370 [self tagEmptyMenu:submenu]; |
367 } | 371 } |
368 } else { | 372 } else { |
369 [item setTarget:self]; | 373 [item setTarget:self]; |
370 [item setAction:@selector(openBookmarkMenuItem:)]; | 374 [item setAction:@selector(openBookmarkMenuItem:)]; |
371 [item setTag:[self menuTagFromNodeId:child->id()]]; | 375 [item setTag:[self menuTagFromNodeId:child->id()]]; |
372 // Add a tooltip | 376 // Add a tooltip |
373 std::string url_string = child->GetURL().possibly_invalid_spec(); | 377 std::string url_string = child->GetURL().possibly_invalid_spec(); |
374 NSString* tooltip = [NSString stringWithFormat:@"%@\n%s", | 378 NSString* tooltip = [NSString stringWithFormat:@"%@\n%s", |
375 base::SysWideToNSString(child->GetTitle()), | 379 base::SysWideToNSString(child->GetTitle()), |
376 url_string.c_str()]; | 380 url_string.c_str()]; |
377 [item setToolTip:tooltip]; | 381 [item setToolTip:tooltip]; |
378 const SkBitmap& favicon = bookmarkModel_->GetFavIcon(child); | |
379 if (!favicon.isNull()) { | |
380 NSImage* image = gfx::SkBitmapToNSImage(favicon); | |
381 if (image) { | |
382 [item setImage:image]; | |
383 } | |
384 } | |
385 } | 382 } |
386 } | 383 } |
387 | 384 |
388 // Empty menus are odd; if empty, add something to look at. | 385 // Empty menus are odd; if empty, add something to look at. |
389 // Matches windows behavior. | 386 // Matches windows behavior. |
390 - (void)tagEmptyMenu:(NSMenu*)menu { | 387 - (void)tagEmptyMenu:(NSMenu*)menu { |
391 NSString* empty_menu_title = l10n_util::GetNSString(IDS_MENU_EMPTY_SUBMENU); | 388 NSString* empty_menu_title = l10n_util::GetNSString(IDS_MENU_EMPTY_SUBMENU); |
392 [menu addItem:[[[NSMenuItem alloc] initWithTitle:empty_menu_title | 389 [menu addItem:[[[NSMenuItem alloc] initWithTitle:empty_menu_title |
393 action:NULL | 390 action:NULL |
394 keyEquivalent:@""] autorelease]]; | 391 keyEquivalent:@""] autorelease]]; |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
588 | 585 |
589 // Return an autoreleased NSCell suitable for a bookmark button. | 586 // Return an autoreleased NSCell suitable for a bookmark button. |
590 // TODO(jrg): move much of the cell config into the BookmarkButtonCell class. | 587 // TODO(jrg): move much of the cell config into the BookmarkButtonCell class. |
591 - (NSCell*)cellForBookmarkNode:(const BookmarkNode*)node { | 588 - (NSCell*)cellForBookmarkNode:(const BookmarkNode*)node { |
592 NSString* title = base::SysWideToNSString(node->GetTitle()); | 589 NSString* title = base::SysWideToNSString(node->GetTitle()); |
593 NSButtonCell *cell = [[[BookmarkButtonCell alloc] initTextCell:nil] | 590 NSButtonCell *cell = [[[BookmarkButtonCell alloc] initTextCell:nil] |
594 autorelease]; | 591 autorelease]; |
595 DCHECK(cell); | 592 DCHECK(cell); |
596 [cell setRepresentedObject:[NSValue valueWithPointer:node]]; | 593 [cell setRepresentedObject:[NSValue valueWithPointer:node]]; |
597 | 594 |
598 NSImage* image = NULL; | 595 [cell setImage:[self getFavIconForNode:node]]; |
599 if (node->is_folder()) { | 596 [cell setImagePosition:NSImageLeft]; |
600 image = folderImage_; | |
601 } else { | |
602 const SkBitmap& favicon = bookmarkModel_->GetFavIcon(node); | |
603 if (!favicon.isNull()) { | |
604 image = gfx::SkBitmapToNSImage(favicon); | |
605 } | |
606 } | |
607 if (image) { | |
608 [cell setImage:image]; | |
609 [cell setImagePosition:NSImageLeft]; | |
610 } | |
611 [cell setTitle:title]; | 597 [cell setTitle:title]; |
612 [cell setMenu:buttonContextMenu_]; | 598 [cell setMenu:buttonContextMenu_]; |
613 return cell; | 599 return cell; |
614 } | 600 } |
615 | 601 |
616 // Return an appropriate width for the given bookmark button cell. | 602 // Return an appropriate width for the given bookmark button cell. |
617 // The "+2" is needed because, sometimes, Cocoa is off by a tad. | 603 // The "+2" is needed because, sometimes, Cocoa is off by a tad. |
618 // Example: for a bookmark named "Moma" or "SFGate", it is one pixel | 604 // Example: for a bookmark named "Moma" or "SFGate", it is one pixel |
619 // too small. For "FBL" it is 2 pixels too small. | 605 // too small. For "FBL" it is 2 pixels too small. |
620 // For a bookmark named "SFGateFooWoo", it is just fine. | 606 // For a bookmark named "SFGateFooWoo", it is just fine. |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
866 // this looks bad I may need to change widthForBookmarkButtonCell to | 852 // this looks bad I may need to change widthForBookmarkButtonCell to |
867 // add space for an image even if not there on the assumption that | 853 // add space for an image even if not there on the assumption that |
868 // favicons will eventually load. | 854 // favicons will eventually load. |
869 - (void)nodeFavIconLoaded:(BookmarkModel*)model | 855 - (void)nodeFavIconLoaded:(BookmarkModel*)model |
870 node:(const BookmarkNode*)node { | 856 node:(const BookmarkNode*)node { |
871 for (NSButton* button in buttons_.get()) { | 857 for (NSButton* button in buttons_.get()) { |
872 NSButtonCell* cell = [button cell]; | 858 NSButtonCell* cell = [button cell]; |
873 void* pointer = [[cell representedObject] pointerValue]; | 859 void* pointer = [[cell representedObject] pointerValue]; |
874 const BookmarkNode* cellnode = static_cast<const BookmarkNode*>(pointer); | 860 const BookmarkNode* cellnode = static_cast<const BookmarkNode*>(pointer); |
875 if (cellnode == node) { | 861 if (cellnode == node) { |
876 NSImage* image = gfx::SkBitmapToNSImage(bookmarkModel_->GetFavIcon(node)); | 862 [cell setImage:[self getFavIconForNode:node]]; |
877 if (image) { | 863 [cell setImagePosition:NSImageLeft]; |
878 [cell setImage:image]; | 864 // Adding an image means we might need more room for the |
879 [cell setImagePosition:NSImageLeft]; | 865 // bookmark. Test for it by growing the button (if needed) |
880 // Adding an image means we might need more room for the | 866 // and shifting everything else over. |
881 // bookmark. Test for it by growing the button (if needed) | 867 [self checkForBookmarkButtonGrowth:button]; |
882 // and shifting everything else over. | |
883 [self checkForBookmarkButtonGrowth:button]; | |
884 } | |
885 return; | |
886 } | 868 } |
887 } | 869 } |
888 } | 870 } |
889 | 871 |
890 // TODO(jrg): for now this is brute force. | 872 // TODO(jrg): for now this is brute force. |
891 - (void)nodeChildrenReordered:(BookmarkModel*)model | 873 - (void)nodeChildrenReordered:(BookmarkModel*)model |
892 node:(const BookmarkNode*)node { | 874 node:(const BookmarkNode*)node { |
893 [self loaded:model]; | 875 [self loaded:model]; |
894 } | 876 } |
895 | 877 |
896 - (void)setUrlDelegate:(id<BookmarkURLOpener>)urlDelegate { | 878 - (void)setUrlDelegate:(id<BookmarkURLOpener>)urlDelegate { |
897 urlDelegate_ = urlDelegate; | 879 urlDelegate_ = urlDelegate; |
898 } | 880 } |
899 | 881 |
900 - (NSArray*)buttons { | 882 - (NSArray*)buttons { |
901 return buttons_.get(); | 883 return buttons_.get(); |
902 } | 884 } |
903 | 885 |
904 - (NSButton*)offTheSideButton { | 886 - (NSButton*)offTheSideButton { |
905 return offTheSideButton_; | 887 return offTheSideButton_; |
906 } | 888 } |
907 | 889 |
908 - (NSButton*)otherBookmarksButton { | 890 - (NSButton*)otherBookmarksButton { |
909 return otherBookmarksButton_.get(); | 891 return otherBookmarksButton_.get(); |
910 } | 892 } |
911 | 893 |
894 - (NSImage*)getFavIconForNode:(const BookmarkNode*)node { | |
895 if (node->is_folder()) | |
896 return folderImage_; | |
897 | |
898 const SkBitmap& favIcon = bookmarkModel_->GetFavIcon(node); | |
899 if (!favIcon.isNull()) | |
900 return gfx::SkBitmapToNSImage(favIcon); | |
901 | |
902 return defaultImage_; | |
903 } | |
904 | |
912 @end | 905 @end |
OLD | NEW |