diff options
author | viettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-04 20:43:14 +0000 |
---|---|---|
committer | viettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-04 20:43:14 +0000 |
commit | 04a3942cf4419e0f21105934e92168583e1d49c4 (patch) | |
tree | 4ace473662dcaf431cc392a78cce6dd817e0f08d /chrome | |
parent | 1319d3b2391006b26b095b2d1f69c424eb237ae9 (diff) | |
download | chromium_src-04a3942cf4419e0f21105934e92168583e1d49c4.zip chromium_src-04a3942cf4419e0f21105934e92168583e1d49c4.tar.gz chromium_src-04a3942cf4419e0f21105934e92168583e1d49c4.tar.bz2 |
(Mac) Display the bookmark bar off-the-side menu on mouse down. Also align the menu.
(Basically, make it like Safari's button.)
We make the button into a |MenuButton|, attach a fixed menu to it in the
nib, and make the |BookmarkBarController| the delegate for this menu so
that we can update the menu just before it's displayed.
As a side effect, also fixes bug 20813.
BUG=21093,20813
TEST=Make sure the bookmark bar off-the-side button works properly under a variety of circumstances, making sure the menu is properly aligned, etc.
Review URL: http://codereview.chromium.org/199024
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@25507 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/app/nibs/BookmarkBar.xib | 224 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_bar_controller.h | 6 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_bar_controller.mm | 40 | ||||
-rw-r--r-- | chrome/browser/cocoa/bookmark_bar_controller_unittest.mm | 43 | ||||
-rw-r--r-- | chrome/browser/cocoa/menu_button.h | 8 | ||||
-rw-r--r-- | chrome/browser/cocoa/menu_button.mm | 2 |
6 files changed, 234 insertions, 89 deletions
diff --git a/chrome/app/nibs/BookmarkBar.xib b/chrome/app/nibs/BookmarkBar.xib index 30beaba..c2b1784 100644 --- a/chrome/app/nibs/BookmarkBar.xib +++ b/chrome/app/nibs/BookmarkBar.xib @@ -2,15 +2,16 @@ <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03"> <data> <int key="IBDocument.SystemTarget">1050</int> - <string key="IBDocument.SystemVersion">9L30</string> + <string key="IBDocument.SystemVersion">9L31a</string> <string key="IBDocument.InterfaceBuilderVersion">677</string> <string key="IBDocument.AppKitVersion">949.54</string> <string key="IBDocument.HIToolboxVersion">353.00</string> <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="18"/> - <integer value="4"/> <integer value="1"/> + <integer value="75"/> + <integer value="4"/> + <integer value="18"/> </object> <object class="NSArray" key="IBDocument.PluginDependencies"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -36,6 +37,26 @@ <object class="NSCustomObject" id="1004"> <string key="NSClassName">NSApplication</string> </object> + <object class="NSMenu" id="190917733"> + <string key="NSTitle"/> + <object class="NSMutableArray" key="NSMenuItems"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMenuItem" id="582055256"> + <reference key="NSMenu" ref="190917733"/> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <object class="NSCustomResource" key="NSOnImage" id="932677134"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSMenuCheckmark</string> + </object> + <object class="NSCustomResource" key="NSMixedImage" id="126584967"> + <string key="NSClassName">NSImage</string> + <string key="NSResourceName">NSMenuMixedState</string> + </object> + </object> + </object> + </object> <object class="NSCustomView" id="620641226"> <reference key="NSNextResponder"/> <int key="NSvFlags">-2147483358</int> @@ -85,30 +106,24 @@ <string key="NSTitle">^IDS_BOOMARK_BAR_OPEN_ALL</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <object class="NSCustomResource" key="NSOnImage" id="636322919"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">NSMenuCheckmark</string> - </object> - <object class="NSCustomResource" key="NSMixedImage" id="607448274"> - <string key="NSClassName">NSImage</string> - <string key="NSResourceName">NSMenuMixedState</string> - </object> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="115646576"> <reference key="NSMenu" ref="183701277"/> <string key="NSTitle">^IDS_BOOMARK_BAR_OPEN_ALL_NEW_WINDOW</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="509003741"> <reference key="NSMenu" ref="183701277"/> <string key="NSTitle">^IDS_BOOMARK_BAR_OPEN_ALL_INCOGNITO</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="694014238"> <reference key="NSMenu" ref="183701277"/> @@ -117,24 +132,24 @@ <string key="NSTitle"/> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="112128065"> <reference key="NSMenu" ref="183701277"/> <string key="NSTitle">^IDS_BOOKMARK_BAR_RENAME_FOLDER</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="168951506"> <reference key="NSMenu" ref="183701277"/> <string key="NSTitle">^IDS_BOOKMARK_BAR_REMOVE</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="1022383113"> <reference key="NSMenu" ref="183701277"/> @@ -143,24 +158,24 @@ <string key="NSTitle"/> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="926809071"> <reference key="NSMenu" ref="183701277"/> <string key="NSTitle">^IDS_BOOMARK_BAR_ADD_NEW_BOOKMARK</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="90793013"> <reference key="NSMenu" ref="183701277"/> <string key="NSTitle">^IDS_BOOMARK_BAR_NEW_FOLDER</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="149427359"> <reference key="NSMenu" ref="183701277"/> @@ -169,16 +184,16 @@ <string key="NSTitle"/> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="61770624"> <reference key="NSMenu" ref="183701277"/> <string key="NSTitle">^IDS_BOOKMARK_MANAGER</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> <int key="NSTag">40011</int> </object> <object class="NSMenuItem" id="23014313"> @@ -186,8 +201,8 @@ <string key="NSTitle">^IDS_BOOMARK_BAR_ALWAYS_SHOW</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> <int key="NSTag">40009</int> </object> </object> @@ -201,24 +216,24 @@ <string key="NSTitle">^IDS_BOOMARK_BAR_OPEN_IN_NEW_TAB</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="308357419"> <reference key="NSMenu" ref="672481054"/> <string key="NSTitle">^IDS_BOOMARK_BAR_OPEN_IN_NEW_WINDOW</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="300791080"> <reference key="NSMenu" ref="672481054"/> <string key="NSTitle">^IDS_BOOMARK_BAR_OPEN_INCOGNITO</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="878416689"> <reference key="NSMenu" ref="672481054"/> @@ -227,24 +242,24 @@ <string key="NSTitle"/> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="182996500"> <reference key="NSMenu" ref="672481054"/> <string key="NSTitle">^IDS_BOOKMARK_BAR_EDIT</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="908072523"> <reference key="NSMenu" ref="672481054"/> <string key="NSTitle">^IDS_BOOKMARK_BAR_REMOVE</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="554011295"> <reference key="NSMenu" ref="672481054"/> @@ -253,24 +268,24 @@ <string key="NSTitle"/> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="527115352"> <reference key="NSMenu" ref="672481054"/> <string key="NSTitle">^IDS_BOOMARK_BAR_ADD_NEW_BOOKMARK</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="595609715"> <reference key="NSMenu" ref="672481054"/> <string key="NSTitle">^IDS_BOOMARK_BAR_NEW_FOLDER</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="422582534"> <reference key="NSMenu" ref="672481054"/> @@ -279,16 +294,16 @@ <string key="NSTitle"/> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> </object> <object class="NSMenuItem" id="807677456"> <reference key="NSMenu" ref="672481054"/> <string key="NSTitle">^IDS_BOOKMARK_MANAGER</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> <int key="NSTag">40011</int> </object> <object class="NSMenuItem" id="515274494"> @@ -296,8 +311,8 @@ <string key="NSTitle">^IDS_BOOMARK_BAR_ALWAYS_SHOW</string> <string key="NSKeyEquiv"/> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="636322919"/> - <reference key="NSMixedImage" ref="607448274"/> + <reference key="NSOnImage" ref="932677134"/> + <reference key="NSMixedImage" ref="126584967"/> <int key="NSTag">40009</int> </object> </object> @@ -486,14 +501,6 @@ <int key="connectionID">66</int> </object> <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">openOffTheSideMenuFromButton:</string> - <reference key="source" ref="1001"/> - <reference key="destination" ref="1071220197"/> - </object> - <int key="connectionID">69</int> - </object> - <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> <string key="label">menu</string> <reference key="source" ref="610146462"/> @@ -525,6 +532,22 @@ </object> <int key="connectionID">74</int> </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">menu_</string> + <reference key="source" ref="1071220197"/> + <reference key="destination" ref="190917733"/> + </object> + <int key="connectionID">79</int> + </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">delegate</string> + <reference key="source" ref="190917733"/> + <reference key="destination" ref="1001"/> + </object> + <int key="connectionID">81</int> + </object> </object> <object class="IBMutableOrderedSet" key="objectRecords"> <object class="NSArray" key="orderedObjects"> @@ -751,6 +774,21 @@ <reference key="object" ref="849863465"/> <reference key="parent" ref="1002"/> </object> + <object class="IBObjectRecord"> + <int key="objectID">75</int> + <reference key="object" ref="190917733"/> + <object class="NSMutableArray" key="children"> + <bool key="EncodedWithXMLCoder">YES</bool> + <reference ref="582055256"/> + </object> + <reference key="parent" ref="1002"/> + <string key="objectName">Off-the-side Menu</string> + </object> + <object class="IBObjectRecord"> + <int key="objectID">76</int> + <reference key="object" ref="582055256"/> + <reference key="parent" ref="190917733"/> + </object> </object> </object> <object class="NSMutableDictionary" key="flattenedProperties"> @@ -788,10 +826,15 @@ <string>5.IBPluginDependency</string> <string>6.IBPluginDependency</string> <string>62.IBPluginDependency</string> + <string>63.CustomClassName</string> <string>63.IBPluginDependency</string> + <string>64.CustomClassName</string> <string>64.IBPluginDependency</string> <string>7.IBPluginDependency</string> <string>72.IBPluginDependency</string> + <string>75.IBEditorWindowLastContentRect</string> + <string>75.IBPluginDependency</string> + <string>76.IBPluginDependency</string> <string>8.IBPluginDependency</string> <string>9.IBPluginDependency</string> </object> @@ -800,16 +843,18 @@ <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{519, 477}, {600, 144}}</string> + <string>{{96, 477}, {600, 144}}</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{380, 543}, {365, 213}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{859, 729}, {365, 213}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -821,15 +866,18 @@ <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{370, 543}, {375, 213}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{655, 726}, {375, 213}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>MenuButton</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>ClickHoldButtonCell</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{0, 722}, {75, 23}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -856,7 +904,7 @@ </object> </object> <nil key="sourceID"/> - <int key="maxID">74</int> + <int key="maxID">81</int> </object> <object class="IBClassDescriber" key="IBDocument.Classes"> <object class="NSMutableArray" key="referencedPartialClassDescriptions"> @@ -909,7 +957,7 @@ <bool key="EncodedWithXMLCoder">YES</bool> <string>NSMenu</string> <string>NSView</string> - <string>NSButton</string> + <string>MenuButton</string> <string>id</string> <string>id</string> </object> @@ -936,6 +984,18 @@ </object> </object> <object class="IBPartialClassDescription"> + <string key="className">ClickHoldButtonCell</string> + <string key="superclassName">GradientButtonCell</string> + <object class="NSMutableDictionary" key="outlets"> + <string key="NS.key.0">clickHoldTarget_</string> + <string key="NS.object.0">id</string> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">browser/cocoa/clickhold_button_cell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> <string key="className">GTMUILocalizer</string> <string key="superclassName">NSObject</string> <object class="NSMutableDictionary" key="outlets"> @@ -959,6 +1019,26 @@ </object> </object> <object class="IBPartialClassDescription"> + <string key="className">GradientButtonCell</string> + <string key="superclassName">NSButtonCell</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">browser/cocoa/gradient_button_cell.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> + <string key="className">MenuButton</string> + <string key="superclassName">NSButton</string> + <object class="NSMutableDictionary" key="outlets"> + <string key="NS.key.0">menu_</string> + <string key="NS.object.0">NSMenu</string> + </object> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">browser/cocoa/menu_button.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> <string key="className">NSObject</string> <object class="IBClassDescriptionSource" key="sourceIdentifier"> <string key="majorKey">IBProjectSource</string> @@ -992,19 +1072,19 @@ <bool key="EncodedWithXMLCoder">YES</bool> <object class="NSMutableArray" key="dict.sortedKeys"> <bool key="EncodedWithXMLCoder">YES</bool> - <string>backgroundButton_</string> <string>closeButton_</string> <string>contextMenu_</string> <string>iconView_</string> <string>target_</string> + <string>titleView_</string> </object> <object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> <string>NSButton</string> - <string>NSButton</string> <string>NSMenu</string> <string>NSView</string> <string>id</string> + <string>NSTextField</string> </object> </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> diff --git a/chrome/browser/cocoa/bookmark_bar_controller.h b/chrome/browser/cocoa/bookmark_bar_controller.h index a2ae151..548210e 100644 --- a/chrome/browser/cocoa/bookmark_bar_controller.h +++ b/chrome/browser/cocoa/bookmark_bar_controller.h @@ -18,6 +18,7 @@ class BookmarkModel; class BookmarkNode; @class BookmarkBarView; class GURL; +@class MenuButton; class Profile; class PrefService; @protocol ViewResizer; @@ -68,7 +69,7 @@ class PrefService; id<BookmarkURLOpener> urlDelegate_; // weak IBOutlet NSView* buttonView_; - IBOutlet NSButton* offTheSideButton_; + IBOutlet MenuButton* offTheSideButton_; IBOutlet NSMenu* buttonContextMenu_; } @@ -98,7 +99,6 @@ class PrefService; // From a button, ... - (IBAction)openBookmark:(id)sender; - (IBAction)openFolderMenuFromButton:(id)sender; -- (IBAction)openOffTheSideMenuFromButton:(id)sender; // From a context menu over the button, ... - (IBAction)openBookmarkInNewForegroundTab:(id)sender; - (IBAction)openBookmarkInNewWindow:(id)sender; @@ -148,6 +148,8 @@ class PrefService; - (NSMenu *)menuForFolderNode:(const BookmarkNode*)node; - (int64)nodeIdFromMenuTag:(int32)tag; - (int32)menuTagFromNodeId:(int64)menuid; +- (void)buildOffTheSideMenu; +- (NSMenu*)offTheSideMenu; @end #endif // CHROME_BROWSER_COCOA_BOOKMARK_BAR_CONTROLLER_H_ diff --git a/chrome/browser/cocoa/bookmark_bar_controller.mm b/chrome/browser/cocoa/bookmark_bar_controller.mm index e8e5daf..a8cac69 100644 --- a/chrome/browser/cocoa/bookmark_bar_controller.mm +++ b/chrome/browser/cocoa/bookmark_bar_controller.mm @@ -15,6 +15,7 @@ #import "chrome/browser/cocoa/bookmark_name_folder_controller.h" #import "chrome/browser/cocoa/bookmark_menu_cocoa_controller.h" #import "chrome/browser/cocoa/event_utils.h" +#import "chrome/browser/cocoa/menu_button.h" #import "chrome/browser/cocoa/view_resizer.h" #include "chrome/browser/cocoa/nsimage_cache.h" #include "chrome/browser/profile.h" @@ -101,6 +102,8 @@ const CGFloat kBookmarkHorizontalPadding = 1.0; selector:@selector(frameDidChange) name:NSViewFrameDidChangeNotification object:[self view]]; + + DCHECK([offTheSideButton_ menu]); } - (void)showIfNeeded { @@ -294,28 +297,41 @@ const CGFloat kBookmarkHorizontalPadding = 1.0; } } -// TODO(jrg): cache the menu so we don't need to build it every time. +// Rebuild the off-the-side menu, taking into account which buttons are +// displayed. +// TODO(jrg,viettrungluu): only (re)build the menu when necessary. // TODO(jrg): if we get smarter such that we don't even bother // creating buttons which aren't visible, we'll need to be smarter // here. -- (IBAction)openOffTheSideMenuFromButton:(id)sender { - scoped_nsobject<NSMenu> menu([[NSMenu alloc] initWithTitle:@""]); +- (void)buildOffTheSideMenu { + NSMenu* menu = [self offTheSideMenu]; + DCHECK(menu); + + // Remove old menu items (backwards order is as good as any); leave the + // blank one at position 0 (see menu_button.h). + for (NSInteger i = [menu numberOfItems] - 1; i >= 1 ; i--) + [menu removeItemAtIndex:i]; + + // Add items corresponding to buttons which aren't displayed or are only + // partly displayed. for (NSButton* each_button in buttons_.get()) { if (NSMaxX([each_button frame]) > NSMaxX([[each_button superview] frame])) { - [self addNode:[self nodeFromButton:each_button] toMenu:menu.get()]; + [self addNode:[self nodeFromButton:each_button] toMenu:menu]; } } +} - // TODO(jrg): once we disable the button when the menu should be - // empty, remove this 'helper'. - if (![menu numberOfItems]) { - [self tagEmptyMenu:menu]; - } +// Get the off-the-side menu. +- (NSMenu*)offTheSideMenu { + return [offTheSideButton_ menu]; +} - [NSMenu popUpContextMenu:menu - withEvent:[NSApp currentEvent] - forView:sender]; +// Called by any menus which have set us as their delegate (right now just the +// off-the-side menu?). +- (void)menuNeedsUpdate:(NSMenu*)menu { + if (menu == [self offTheSideMenu]) + [self buildOffTheSideMenu]; } // As a convention we set the menu's delegate to be the button's cell diff --git a/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm b/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm index 55c4c18..7799e5c 100644 --- a/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm +++ b/chrome/browser/cocoa/bookmark_bar_controller_unittest.mm @@ -524,6 +524,49 @@ TEST_F(BookmarkBarControllerTest, MiddleClick) { [bar_ setUrlDelegate:nil]; } +TEST_F(BookmarkBarControllerTest, TestBuildOffTheSideMenu) { + BookmarkModel* model = helper_.profile()->GetBookmarkModel(); + NSMenu* menu = [bar_ offTheSideMenu]; + ASSERT_TRUE(menu); + + // The bookmark bar should start out with nothing. + EXPECT_EQ(0U, [[bar_ buttons] count]); + + // Make sure things work when there's nothing. Note that there should always + // be a blank first menu item. + [bar_ buildOffTheSideMenu]; + EXPECT_EQ(1, [menu numberOfItems]); + + // We add lots of bookmarks. At first, we expect nothing to be added to the + // off-the-side menu. But once they start getting added, we expect the + // remaining ones to be added too. We expect a reasonably substantial number + // of items to be added by the end. + int num_off_the_side = 0; + for (int i = 0; i < 50; i++) { + const BookmarkNode* parent = model->GetBookmarkBarNode(); + model->AddURL(parent, parent->GetChildCount(), + L"very wide title", + GURL("http://www.foobar.com/")); + [bar_ buildOffTheSideMenu]; + + if (num_off_the_side) { + num_off_the_side++; + EXPECT_EQ(1 + num_off_the_side, [menu numberOfItems]); + } else { + EXPECT_TRUE([menu numberOfItems] == 1 || [menu numberOfItems] == 2); + if ([menu numberOfItems] == 2) + num_off_the_side++; + } + } + EXPECT_GE(num_off_the_side, 20); + + // Reset, and check that the built menu is "empty" again. + [bar_ clearBookmarkBar]; + EXPECT_EQ(0U, [[bar_ buttons] count]); + [bar_ buildOffTheSideMenu]; + EXPECT_EQ(1, [menu numberOfItems]); +} + // Cannot test these methods since they simply call a single static // method, BookmarkEditor::Show(), which is impossible to mock. // editBookmark:, addPage: diff --git a/chrome/browser/cocoa/menu_button.h b/chrome/browser/cocoa/menu_button.h index 92b0569..1fe6853 100644 --- a/chrome/browser/cocoa/menu_button.h +++ b/chrome/browser/cocoa/menu_button.h @@ -13,10 +13,14 @@ @interface MenuButton : NSButton { @private IBOutlet NSMenu* menu_; - BOOL openAtRight_; } -// The menu to display. +// The menu to display. Note that it should have no (i.e., a blank) title and +// that the 0-th entry should be blank (and won't be displayed). (This is +// because we use a pulldown list, for which Cocoa uses the 0-th item as "title" +// in the button. This might change if we ever switch to a pop-up. Our direct +// use of the given NSMenu object means that the one can set and use NSMenu's +// delegate as usual.) @property(assign, nonatomic) NSMenu* menu; @end // @interface MenuButton diff --git a/chrome/browser/cocoa/menu_button.mm b/chrome/browser/cocoa/menu_button.mm index aed8034..23d5d0e 100644 --- a/chrome/browser/cocoa/menu_button.mm +++ b/chrome/browser/cocoa/menu_button.mm @@ -54,7 +54,7 @@ // Reset various settings of the button and its associated |ClickHoldButtonCell| // to the standard state which provides reasonable defaults. - (void)resetToDefaults { - id cell = [self cell]; + ClickHoldButtonCell* cell = [self cell]; DCHECK([cell isKindOfClass:[ClickHoldButtonCell class]]); [cell setEnableClickHold:YES]; [cell setClickHoldTimeout:0.0]; // Make menu trigger immediately. |