summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-03 20:10:41 +0000
committerrsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-03 20:10:41 +0000
commit9c3ad87fcb8e2cf422aeb11454bb22ef17b54129 (patch)
tree7187da6ff8ef872037f64a782e3db5dabb303a8e
parent210363ef5175e2d619d1aada3285bfa8c728fb04 (diff)
downloadchromium_src-9c3ad87fcb8e2cf422aeb11454bb22ef17b54129.zip
chromium_src-9c3ad87fcb8e2cf422aeb11454bb22ef17b54129.tar.gz
chromium_src-9c3ad87fcb8e2cf422aeb11454bb22ef17b54129.tar.bz2
[Mac] Enable click-drag-release behavior in the Wrench menu's custom items.
XIB changes: * Replace the edit item's segmented control with 3 buttons * Make the root view of both items a MenuTrackedRootView * Use the custom MenuTrackedButton for all the buttons BUG=49356 TEST=Click open the Wrench menu, hold, and drag over the buttons and they perform their function. Review URL: http://codereview.chromium.org/3072014 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@54804 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/app/nibs/Toolbar.xib1080
-rw-r--r--chrome/browser/cocoa/menu_tracked_button.h28
-rw-r--r--chrome/browser/cocoa/menu_tracked_button.mm32
-rw-r--r--chrome/browser/cocoa/menu_tracked_button_unittest.mm117
-rw-r--r--chrome/browser/cocoa/menu_tracked_root_view.h25
-rw-r--r--chrome/browser/cocoa/menu_tracked_root_view.mm15
-rw-r--r--chrome/browser/cocoa/menu_tracked_root_view_unittest.mm45
-rw-r--r--chrome/browser/cocoa/wrench_menu_controller.h9
-rw-r--r--chrome/browser/cocoa/wrench_menu_controller.mm65
-rw-r--r--chrome/browser/cocoa/wrench_menu_controller_unittest.mm14
-rw-r--r--chrome/chrome_browser.gypi4
-rw-r--r--chrome/chrome_tests.gypi2
12 files changed, 1273 insertions, 163 deletions
diff --git a/chrome/app/nibs/Toolbar.xib b/chrome/app/nibs/Toolbar.xib
index c0d5f13..6c8e1b8 100644
--- a/chrome/app/nibs/Toolbar.xib
+++ b/chrome/app/nibs/Toolbar.xib
@@ -1,16 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
<data>
<int key="IBDocument.SystemTarget">1050</int>
- <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>
+ <string key="IBDocument.SystemVersion">10F569</string>
+ <string key="IBDocument.InterfaceBuilderVersion">762</string>
+ <string key="IBDocument.AppKitVersion">1038.29</string>
+ <string key="IBDocument.HIToolboxVersion">461.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="NS.object.0">762</string>
+ </object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="208"/>
- <integer value="156"/>
<integer value="1"/>
+ <integer value="208"/>
+ <integer value="211"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -18,7 +22,7 @@
</object>
<object class="NSMutableDictionary" key="IBDocument.Metadata">
<bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
+ <object class="NSArray" key="dict.sortedKeys" id="0">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
<object class="NSMutableArray" key="dict.values">
@@ -61,7 +65,7 @@
<string key="NSContents">chromium.org</string>
<object class="NSFont" key="NSSupport" id="654028904">
<string key="NSName">LucidaGrande</string>
- <double key="NSSize">1.300000e+01</double>
+ <double key="NSSize">13</double>
<int key="NSfFlags">16</int>
</object>
<reference key="NSControlView" ref="535508469"/>
@@ -99,7 +103,7 @@
<string key="NSContents"/>
<object class="NSFont" key="NSSupport" id="64724822">
<string key="NSName">LucidaGrande</string>
- <double key="NSSize">1.300000e+01</double>
+ <double key="NSSize">13</double>
<int key="NSfFlags">1044</int>
</object>
<reference key="NSControlView" ref="368496192"/>
@@ -240,7 +244,6 @@
<int key="NSvFlags">270</int>
<string key="NSFrame">{{17, 20}, {73, 17}}</string>
<reference key="NSSuperview" ref="685460050"/>
- <reference key="NSNextKeyView" ref="311802185"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="881623077">
<int key="NSCellFlags">68288064</int>
@@ -254,7 +257,7 @@
<string key="NSColorName">controlColor</string>
<object class="NSColor" key="NSColor">
<int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+ <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
</object>
</object>
<object class="NSColor" key="NSTextColor" id="722572692">
@@ -270,48 +273,88 @@
<reference key="NSSuperview" ref="974949794"/>
<string key="NSClassName">GTMWidthBasedTweaker</string>
</object>
- <object class="NSSegmentedControl" id="311802185">
+ <object class="NSCustomView" id="192185985">
<reference key="NSNextResponder" ref="974949794"/>
<int key="NSvFlags">265</int>
- <string key="NSFrame">{{134, 0}, {126, 21}}</string>
- <reference key="NSSuperview" ref="974949794"/>
- <bool key="NSEnabled">YES</bool>
- <object class="NSSegmentedCell" key="NSCell" id="208223583">
- <int key="NSCellFlags">-2080244224</int>
- <int key="NSCellFlags2">131072</int>
- <object class="NSFont" key="NSSupport" id="26">
- <string key="NSName">LucidaGrande</string>
- <double key="NSSize">1.100000e+01</double>
- <int key="NSfFlags">3100</int>
- </object>
- <reference key="NSControlView" ref="311802185"/>
- <object class="NSMutableArray" key="NSSegmentImages">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSSegmentItem">
- <string key="NSSegmentItemLabel">^IDS_CUT</string>
- <int key="NSSegmentItemTag">36000</int>
- <int key="NSSegmentItemImageScaling">0</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSButton" id="561116462">
+ <reference key="NSNextResponder" ref="192185985"/>
+ <int key="NSvFlags">297</int>
+ <string key="NSFrame">{{91, 38}, {43, 21}}</string>
+ <reference key="NSSuperview" ref="192185985"/>
+ <int key="NSTag">36003</int>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="129505148">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134348800</int>
+ <string key="NSContents">^IDS_PASTE</string>
+ <object class="NSFont" key="NSSupport" id="26">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">11</double>
+ <int key="NSfFlags">3100</int>
+ </object>
+ <reference key="NSControlView" ref="561116462"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">162</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
</object>
- <object class="NSSegmentItem">
- <string key="NSSegmentItemLabel">^IDS_COPY</string>
- <int key="NSSegmentItemTag">36001</int>
- <int key="NSSegmentItemImageScaling">0</int>
+ </object>
+ <object class="NSButton" id="924346418">
+ <reference key="NSNextResponder" ref="192185985"/>
+ <int key="NSvFlags">297</int>
+ <string key="NSFrame">{{50, 38}, {43, 21}}</string>
+ <reference key="NSSuperview" ref="192185985"/>
+ <int key="NSTag">36001</int>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="273339899">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134348800</int>
+ <string key="NSContents">^IDS_COPY</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="924346418"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">162</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
</object>
- <object class="NSSegmentItem">
- <string key="NSSegmentItemLabel">^IDS_PASTE</string>
- <int key="NSSegmentItemTag">36003</int>
- <int key="NSSegmentItemImageScaling">0</int>
+ </object>
+ <object class="NSButton" id="157954857">
+ <reference key="NSNextResponder" ref="192185985"/>
+ <int key="NSvFlags">297</int>
+ <string key="NSFrame">{{9, 38}, {43, 21}}</string>
+ <reference key="NSSuperview" ref="192185985"/>
+ <int key="NSTag">36000</int>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="46853127">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134348800</int>
+ <string key="NSContents">^IDS_CUT</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="157954857"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">162</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
</object>
</object>
- <int key="NSTrackingMode">2</int>
- <int key="NSSegmentStyle">6</int>
</object>
+ <string key="NSFrame">{{126, -38}, {149, 59}}</string>
+ <reference key="NSSuperview" ref="974949794"/>
+ <string key="NSClassName">NSView</string>
</object>
</object>
<string key="NSFrameSize">{275, 20}</string>
<reference key="NSSuperview"/>
<reference key="NSNextKeyView" ref="950178043"/>
- <string key="NSClassName">NSView</string>
+ <string key="NSClassName">MenuTrackedRootView</string>
</object>
<object class="NSCustomView" id="388169352">
<reference key="NSNextResponder"/>
@@ -456,7 +499,7 @@
<string key="NSFrameSize">{275, 20}</string>
<reference key="NSSuperview"/>
<reference key="NSNextKeyView" ref="370565926"/>
- <string key="NSClassName">NSView</string>
+ <string key="NSClassName">MenuTrackedRootView</string>
</object>
<object class="NSCustomObject" id="301580502">
<string key="NSClassName">WrenchMenuController</string>
@@ -642,14 +685,6 @@
<int key="connectionID">195</int>
</object>
<object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">editControl_</string>
- <reference key="source" ref="301580502"/>
- <reference key="destination" ref="311802185"/>
- </object>
- <int key="connectionID">196</int>
- </object>
- <object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">dispatchWrenchMenuCommand:</string>
<reference key="source" ref="301580502"/>
@@ -674,14 +709,6 @@
<int key="connectionID">199</int>
</object>
<object class="IBConnectionRecord">
- <object class="IBActionConnection" key="connection">
- <string key="label">dispatchWrenchMenuCommand:</string>
- <reference key="source" ref="301580502"/>
- <reference key="destination" ref="311802185"/>
- </object>
- <int key="connectionID">200</int>
- </object>
- <object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">wrenchMenuController_</string>
<reference key="source" ref="1001"/>
@@ -691,14 +718,6 @@
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
- <string key="label">viewToSlide_</string>
- <reference key="source" ref="685460050"/>
- <reference key="destination" ref="311802185"/>
- </object>
- <int key="connectionID">205</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
<string key="label">viewToResize_</string>
<reference key="source" ref="685460050"/>
<reference key="destination" ref="974949794"/>
@@ -721,34 +740,88 @@
</object>
<int key="connectionID">210</int>
</object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">dispatchWrenchMenuCommand:</string>
+ <reference key="source" ref="301580502"/>
+ <reference key="destination" ref="157954857"/>
+ </object>
+ <int key="connectionID">218</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">dispatchWrenchMenuCommand:</string>
+ <reference key="source" ref="301580502"/>
+ <reference key="destination" ref="924346418"/>
+ </object>
+ <int key="connectionID">219</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">dispatchWrenchMenuCommand:</string>
+ <reference key="source" ref="301580502"/>
+ <reference key="destination" ref="561116462"/>
+ </object>
+ <int key="connectionID">220</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">editCut_</string>
+ <reference key="source" ref="301580502"/>
+ <reference key="destination" ref="157954857"/>
+ </object>
+ <int key="connectionID">221</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">editCopy_</string>
+ <reference key="source" ref="301580502"/>
+ <reference key="destination" ref="924346418"/>
+ </object>
+ <int key="connectionID">222</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">editPaste_</string>
+ <reference key="source" ref="301580502"/>
+ <reference key="destination" ref="561116462"/>
+ </object>
+ <int key="connectionID">223</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">viewToSlide_</string>
+ <reference key="source" ref="685460050"/>
+ <reference key="destination" ref="192185985"/>
+ </object>
+ <int key="connectionID">224</int>
+ </object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBObjectRecord">
<int key="objectID">0</int>
- <object class="NSArray" key="object" id="806568350">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
+ <reference key="object" ref="0"/>
<reference key="children" ref="1000"/>
<nil key="parent"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">-2</int>
<reference key="object" ref="1001"/>
- <reference key="parent" ref="806568350"/>
- <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">-1</int>
<reference key="object" ref="1003"/>
- <reference key="parent" ref="806568350"/>
+ <reference key="parent" ref="0"/>
<string key="objectName">First Responder</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">-3</int>
<reference key="object" ref="1004"/>
- <reference key="parent" ref="806568350"/>
+ <reference key="parent" ref="0"/>
<string key="objectName">Application</string>
</object>
<object class="IBObjectRecord">
@@ -764,7 +837,7 @@
<reference ref="421615633"/>
<reference ref="602421009"/>
</object>
- <reference key="parent" ref="806568350"/>
+ <reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2</int>
@@ -853,12 +926,12 @@
<object class="IBObjectRecord">
<int key="objectID">122</int>
<reference key="object" ref="1044322163"/>
- <reference key="parent" ref="806568350"/>
+ <reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">130</int>
<reference key="object" ref="306232897"/>
- <reference key="parent" ref="806568350"/>
+ <reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">144</int>
@@ -871,10 +944,10 @@
<reference key="object" ref="974949794"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="311802185"/>
<reference ref="685460050"/>
+ <reference ref="192185985"/>
</object>
- <reference key="parent" ref="806568350"/>
+ <reference key="parent" ref="0"/>
<string key="objectName">Wrench Menu - Edit Item</string>
</object>
<object class="IBObjectRecord">
@@ -885,27 +958,13 @@
<reference ref="38627075"/>
<reference ref="1015660087"/>
</object>
- <reference key="parent" ref="806568350"/>
+ <reference key="parent" ref="0"/>
<string key="objectName">Wrench Menu - Zoom Item</string>
</object>
<object class="IBObjectRecord">
- <int key="objectID">169</int>
- <reference key="object" ref="311802185"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="208223583"/>
- </object>
- <reference key="parent" ref="974949794"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">170</int>
- <reference key="object" ref="208223583"/>
- <reference key="parent" ref="311802185"/>
- </object>
- <object class="IBObjectRecord">
<int key="objectID">189</int>
<reference key="object" ref="301580502"/>
- <reference key="parent" ref="806568350"/>
+ <reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">204</int>
@@ -1021,11 +1080,64 @@
<reference key="object" ref="1052876110"/>
<reference key="parent" ref="545855108"/>
</object>
+ <object class="IBObjectRecord">
+ <int key="objectID">211</int>
+ <reference key="object" ref="192185985"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="157954857"/>
+ <reference ref="924346418"/>
+ <reference ref="561116462"/>
+ </object>
+ <reference key="parent" ref="974949794"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">212</int>
+ <reference key="object" ref="157954857"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="46853127"/>
+ </object>
+ <reference key="parent" ref="192185985"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">213</int>
+ <reference key="object" ref="46853127"/>
+ <reference key="parent" ref="157954857"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">214</int>
+ <reference key="object" ref="924346418"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="273339899"/>
+ </object>
+ <reference key="parent" ref="192185985"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">215</int>
+ <reference key="object" ref="273339899"/>
+ <reference key="parent" ref="924346418"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">216</int>
+ <reference key="object" ref="561116462"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="129505148"/>
+ </object>
+ <reference key="parent" ref="192185985"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">217</int>
+ <reference key="object" ref="129505148"/>
+ <reference key="parent" ref="561116462"/>
+ </object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
<bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSMutableArray" key="dict.sortedKeys">
+ <object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>-1.IBPluginDependency</string>
<string>-2.IBPluginDependency</string>
@@ -1048,8 +1160,11 @@
<string>156.IBPluginDependency</string>
<string>157.IBEditorWindowLastContentRect</string>
<string>157.IBPluginDependency</string>
+ <string>159.CustomClassName</string>
<string>159.IBPluginDependency</string>
+ <string>160.CustomClassName</string>
<string>160.IBPluginDependency</string>
+ <string>161.CustomClassName</string>
<string>161.IBPluginDependency</string>
<string>162.IBPluginDependency</string>
<string>163.IBPluginDependency</string>
@@ -1057,10 +1172,6 @@
<string>165.IBPluginDependency</string>
<string>166.IBPluginDependency</string>
<string>168.IBPluginDependency</string>
- <string>169.IBPluginDependency</string>
- <string>170.IBNSSegmentedControlInspectorSelectedSegmentMetadataKey</string>
- <string>170.IBPluginDependency</string>
- <string>170.IBSegmentedControlInspectorSelectedSegmentMetadataKey</string>
<string>171.IBPluginDependency</string>
<string>186.IBPluginDependency</string>
<string>187.IBPluginDependency</string>
@@ -1068,6 +1179,16 @@
<string>2.CustomClassName</string>
<string>2.IBAttributePlaceholdersKey</string>
<string>2.IBPluginDependency</string>
+ <string>211.IBPluginDependency</string>
+ <string>212.CustomClassName</string>
+ <string>212.IBPluginDependency</string>
+ <string>213.IBPluginDependency</string>
+ <string>214.CustomClassName</string>
+ <string>214.IBPluginDependency</string>
+ <string>215.IBPluginDependency</string>
+ <string>216.CustomClassName</string>
+ <string>216.IBPluginDependency</string>
+ <string>217.IBPluginDependency</string>
<string>3.CustomClassName</string>
<string>3.IBAttributePlaceholdersKey</string>
<string>3.IBPluginDependency</string>
@@ -1109,8 +1230,11 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{644, 640}, {275, 20}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>MenuTrackedButton</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>MenuTrackedButton</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>MenuTrackedButton</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1119,10 +1243,6 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <integer value="0" id="8"/>
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <reference ref="8"/>
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1136,6 +1256,16 @@
</object>
</object>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>MenuTrackedButton</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>MenuTrackedButton</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>MenuTrackedButton</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>ReloadButton</string>
<object class="NSMutableDictionary">
<string key="NS.key.0">ToolTip</string>
@@ -1185,9 +1315,7 @@
</object>
<object class="NSMutableDictionary" key="unlocalizedProperties">
<bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
+ <reference key="dict.sortedKeys" ref="0"/>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
@@ -1195,15 +1323,13 @@
<nil key="activeLocalization"/>
<object class="NSMutableDictionary" key="localizations">
<bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSArray" key="dict.sortedKeys">
- <bool key="EncodedWithXMLCoder">YES</bool>
- </object>
+ <reference key="dict.sortedKeys" ref="0"/>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<nil key="sourceID"/>
- <int key="maxID">210</int>
+ <int key="maxID">224</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -1273,7 +1399,7 @@
<string key="superclassName">NSObject</string>
<object class="NSMutableDictionary" key="actions">
<bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSMutableArray" key="dict.sortedKeys">
+ <object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>commandDispatch:</string>
<string>commandDispatchUsingKeyModifiers:</string>
@@ -1294,7 +1420,7 @@
<string key="superclassName">NSObject</string>
<object class="NSMutableDictionary" key="outlets">
<bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSMutableArray" key="dict.sortedKeys">
+ <object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>otherObjectToLocalize_</string>
<string>owner_</string>
@@ -1317,7 +1443,7 @@
<string key="superclassName">NSView</string>
<object class="NSMutableDictionary" key="outlets">
<bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSMutableArray" key="dict.sortedKeys">
+ <object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>viewToResize_</string>
<string>viewToSlideAndResize_</string>
@@ -1364,6 +1490,22 @@
</object>
</object>
<object class="IBPartialClassDescription">
+ <string key="className">MenuTrackedButton</string>
+ <string key="superclassName">NSButton</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">browser/cocoa/menu_tracked_button.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">MenuTrackedRootView</string>
+ <string key="superclassName">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">browser/cocoa/menu_tracked_root_view.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
<string key="className">NSObject</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
@@ -1427,7 +1569,7 @@
<string key="superclassName">NSViewController</string>
<object class="NSMutableDictionary" key="outlets">
<bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSMutableArray" key="dict.sortedKeys">
+ <object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>backButton_</string>
<string>browserActionsContainerView_</string>
@@ -1482,10 +1624,12 @@
</object>
<object class="NSMutableDictionary" key="outlets">
<bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSMutableArray" key="dict.sortedKeys">
+ <object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
- <string>editControl_</string>
+ <string>editCopy_</string>
+ <string>editCut_</string>
<string>editItem_</string>
+ <string>editPaste_</string>
<string>zoomDisplay_</string>
<string>zoomFullScreen_</string>
<string>zoomItem_</string>
@@ -1494,11 +1638,13 @@
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
- <string>NSSegmentedControl</string>
- <string>NSView</string>
<string>NSButton</string>
<string>NSButton</string>
- <string>NSView</string>
+ <string>MenuTrackedRootView</string>
+ <string>NSButton</string>
+ <string>NSButton</string>
+ <string>NSButton</string>
+ <string>MenuTrackedRootView</string>
<string>NSButton</string>
<string>NSButton</string>
</object>
@@ -1509,9 +1655,703 @@
</object>
</object>
</object>
+ <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSActionCell</string>
+ <string key="superclassName">NSCell</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSActionCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <string key="superclassName">NSResponder</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="234639029">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSApplication.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="656281629">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="877248804">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSButton</string>
+ <string key="superclassName">NSControl</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSButton.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSButtonCell</string>
+ <string key="superclassName">NSActionCell</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSButtonCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSCell</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSControl</string>
+ <string key="superclassName">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="382180238">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSControl.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSFormatter</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSFormatter.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSMenu</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="628259896">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSMenu.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AddressBook.framework/Headers/ABActions.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSAlert.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSAnimation.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <reference key="sourceIdentifier" ref="234639029"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <reference key="sourceIdentifier" ref="656281629"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSBrowser.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <reference key="sourceIdentifier" ref="877248804"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSComboBox.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSComboBoxCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <reference key="sourceIdentifier" ref="382180238"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSDatePickerCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSDictionaryController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSDragging.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSDrawer.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSFontManager.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSFontPanel.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSImage.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSKeyValueBinding.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <reference key="sourceIdentifier" ref="628259896"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSNibLoading.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSOutlineView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSPasteboard.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSRuleEditor.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSSavePanel.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSSound.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSSpeechRecognizer.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSSpeechSynthesizer.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSSplitView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSTabView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSTableView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSText.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSTextStorage.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSTextView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSTokenField.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSTokenFieldCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSToolbar.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSToolbarItem.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="349778705">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSWindow.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSArchiver.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSClassDescription.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSConnection.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSMetadata.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSNetServices.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSObjectScripting.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSPort.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSPortCoder.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSScriptClassDescription.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSScriptKeyValueCoding.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSScriptObjectSpecifiers.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSScriptWhoseTests.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSSpellServer.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSStream.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSURLDownload.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Foundation.framework/Headers/NSXMLParser.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">Print.framework/Headers/PDEPluginInterface.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">SecurityInterface.framework/Headers/SFAuthorizationView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">SecurityInterface.framework/Headers/SFCertificatePanel.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">SecurityInterface.framework/Headers/SFChooseIdentityPanel.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSResponder</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSInterfaceStyle.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSResponder</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSResponder.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSTextField</string>
+ <string key="superclassName">NSControl</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSTextField.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSTextFieldCell</string>
+ <string key="superclassName">NSActionCell</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSTextFieldCell.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSUserDefaultsController</string>
+ <string key="superclassName">NSController</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSUserDefaultsController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSClipView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSMenuItem.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSRulerView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSView</string>
+ <string key="superclassName">NSResponder</string>
+ <reference key="sourceIdentifier" ref="349778705"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSViewController</string>
+ <string key="superclassName">NSResponder</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">view</string>
+ <string key="NS.object.0">NSView</string>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSViewController.h</string>
+ </object>
+ </object>
+ </object>
</object>
<int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1050" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1050" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+ <integer value="3000" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
<string key="IBDocument.LastKnownRelativeProjectPath">../../chrome.xcodeproj</string>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSActionTemplate</string>
+ <string>NSAddTemplate</string>
+ <string>NSEnterFullScreenTemplate</string>
+ <string>NSRemoveTemplate</string>
+ <string>back_Template</string>
+ <string>forward_Template</string>
+ <string>home_Template</string>
+ <string>reload_Template</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>{15, 15}</string>
+ <string>{8, 8}</string>
+ <string>{16, 15}</string>
+ <string>{8, 8}</string>
+ <string>{19, 19}</string>
+ <string>{19, 19}</string>
+ <string>{19, 19}</string>
+ <string>{19, 19}</string>
+ </object>
+ </object>
</data>
</archive>
diff --git a/chrome/browser/cocoa/menu_tracked_button.h b/chrome/browser/cocoa/menu_tracked_button.h
new file mode 100644
index 0000000..df42255
--- /dev/null
+++ b/chrome/browser/cocoa/menu_tracked_button.h
@@ -0,0 +1,28 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_COCOA_MENU_TRACKED_BUTTON_H_
+#define CHROME_BROWSER_COCOA_MENU_TRACKED_BUTTON_H_
+#pragma once
+
+#import <Cocoa/Cocoa.h>
+
+// A MenuTrackedButton is meant to be used whenever a button is placed inside
+// the custom view of an NSMenuItem. If the user opens the menu in a non-sticky
+// fashion (i.e. clicks, holds, and drags) and then releases the mouse over
+// a MenuTrackedButton, it will |-performClick:| itself.
+@interface MenuTrackedButton : NSButton {
+ @private
+ // If the button received a |-mouseEntered:| event. This short-circuits the
+ // custom drag tracking logic.
+ BOOL didEnter_;
+
+ // Whether or not the user is in a click-drag-release event sequence. If so
+ // and this receives a |-mouseUp:|, then this will click itself.
+ BOOL tracking_;
+}
+
+@end
+
+#endif // CHROME_BROWSER_COCOA_MENU_TRACKED_BUTTON_H_
diff --git a/chrome/browser/cocoa/menu_tracked_button.mm b/chrome/browser/cocoa/menu_tracked_button.mm
new file mode 100644
index 0000000..654e850
--- /dev/null
+++ b/chrome/browser/cocoa/menu_tracked_button.mm
@@ -0,0 +1,32 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "chrome/browser/cocoa/menu_tracked_button.h"
+
+@implementation MenuTrackedButton
+
+- (void)mouseEntered:(NSEvent*)theEvent {
+ didEnter_ = YES;
+ [super mouseEntered:theEvent];
+}
+
+- (void)mouseExited:(NSEvent*)theEvent {
+ didEnter_ = NO;
+ tracking_ = NO;
+ [super mouseExited:theEvent];
+}
+
+- (void)mouseDragged:(NSEvent*)theEvent {
+ tracking_ = !didEnter_;
+ [super mouseDragged:theEvent];
+}
+
+- (void)mouseUp:(NSEvent*)theEvent {
+ if (!tracking_) {
+ return [super mouseUp:theEvent];
+ }
+ [self performClick:self];
+}
+
+@end
diff --git a/chrome/browser/cocoa/menu_tracked_button_unittest.mm b/chrome/browser/cocoa/menu_tracked_button_unittest.mm
new file mode 100644
index 0000000..b900db6
--- /dev/null
+++ b/chrome/browser/cocoa/menu_tracked_button_unittest.mm
@@ -0,0 +1,117 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <Cocoa/Cocoa.h>
+
+#include "base/scoped_nsobject.h"
+#import "chrome/browser/cocoa/cocoa_test_helper.h"
+#import "chrome/browser/cocoa/menu_tracked_button.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/platform_test.h"
+
+// This test does not test what you'd think it does. Testing around event
+// tracking run loops is probably not worh the effort when the size of the
+// helper MakeEvent() is larger than the class being tested. If we ever figure
+// out a good way to test event tracking, this should be revisited.
+
+@interface MenuTrackedButtonTestReceiver : NSObject {
+ @public
+ BOOL didThat_;
+}
+- (void)doThat:(id)sender;
+@end
+@implementation MenuTrackedButtonTestReceiver
+- (void)doThat:(id)sender {
+ didThat_ = YES;
+}
+@end
+
+
+class MenuTrackedButtonTest : public CocoaTest {
+ public:
+ MenuTrackedButtonTest() : event_number_(0) {}
+
+ void SetUp() {
+ listener_.reset([[MenuTrackedButtonTestReceiver alloc] init]);
+ button_.reset(
+ [[MenuTrackedButton alloc] initWithFrame:NSMakeRect(10, 10, 50, 50)]);
+ [[test_window() contentView] addSubview:button()];
+ [button_ setTarget:listener()];
+ [button_ setAction:@selector(doThat:)];
+ }
+
+ // Creates an event of |type|, with |location| in test_window()'s coordinates.
+ NSEvent* MakeEvent(NSEventType type, NSPoint location) {
+ NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
+ location = [test_window() convertBaseToScreen:location];
+ if (type == NSMouseEntered || type == NSMouseExited) {
+ return [NSEvent enterExitEventWithType:type
+ location:location
+ modifierFlags:0
+ timestamp:now
+ windowNumber:[test_window() windowNumber]
+ context:nil
+ eventNumber:event_number_++
+ trackingNumber:0
+ userData:nil];
+ } else {
+ return [NSEvent mouseEventWithType:type
+ location:location
+ modifierFlags:0
+ timestamp:now
+ windowNumber:[test_window() windowNumber]
+ context:nil
+ eventNumber:event_number_++
+ clickCount:1
+ pressure:1.0];
+ }
+ }
+
+ MenuTrackedButtonTestReceiver* listener() { return listener_.get(); }
+ NSButton* button() { return button_.get(); }
+
+ scoped_nsobject<MenuTrackedButtonTestReceiver> listener_;
+ scoped_nsobject<MenuTrackedButton> button_;
+ NSInteger event_number_;
+};
+
+// User mouses over and then off.
+TEST_F(MenuTrackedButtonTest, DISABLED_EnterExit) {
+ [NSApp postEvent:MakeEvent(NSMouseEntered, NSMakePoint(11, 11)) atStart:YES];
+ [NSApp postEvent:MakeEvent(NSMouseExited, NSMakePoint(9, 9)) atStart:YES];
+ EXPECT_FALSE(listener()->didThat_);
+}
+
+// User mouses over, clicks, drags, and exits.
+TEST_F(MenuTrackedButtonTest, DISABLED_EnterDragExit) {
+ [NSApp postEvent:MakeEvent(NSMouseEntered, NSMakePoint(11, 11)) atStart:YES];
+ [NSApp postEvent:MakeEvent(NSLeftMouseDown, NSMakePoint(12, 12)) atStart:YES];
+ [NSApp postEvent:MakeEvent(NSLeftMouseDragged, NSMakePoint(13, 11))
+ atStart:YES];
+ [NSApp postEvent:MakeEvent(NSLeftMouseDragged, NSMakePoint(13, 10))
+ atStart:YES];
+ [NSApp postEvent:MakeEvent(NSMouseExited, NSMakePoint(13, 9)) atStart:YES];
+ EXPECT_FALSE(listener()->didThat_);
+}
+
+// User mouses over, clicks, drags, and releases.
+TEST_F(MenuTrackedButtonTest, DISABLED_EnterDragUp) {
+ [NSApp postEvent:MakeEvent(NSMouseEntered, NSMakePoint(11, 11)) atStart:YES];
+ [NSApp postEvent:MakeEvent(NSLeftMouseDown, NSMakePoint(12, 12)) atStart:YES];
+ [NSApp postEvent:MakeEvent(NSLeftMouseDragged, NSMakePoint(13, 13))
+ atStart:YES];
+ [NSApp postEvent:MakeEvent(NSLeftMouseUp, NSMakePoint(14, 14)) atStart:YES];
+ EXPECT_TRUE(listener()->didThat_);
+}
+
+// User drags in and releases.
+TEST_F(MenuTrackedButtonTest, DISABLED_DragUp) {
+ [NSApp postEvent:MakeEvent(NSLeftMouseDragged, NSMakePoint(11, 11))
+ atStart:YES];
+ [NSApp postEvent:MakeEvent(NSLeftMouseDragged, NSMakePoint(12, 12))
+ atStart:YES];
+ [NSApp postEvent:MakeEvent(NSLeftMouseUp, NSMakePoint(13, 13))
+ atStart:YES];
+ EXPECT_TRUE(listener()->didThat_);
+}
diff --git a/chrome/browser/cocoa/menu_tracked_root_view.h b/chrome/browser/cocoa/menu_tracked_root_view.h
new file mode 100644
index 0000000..6d4bffa
--- /dev/null
+++ b/chrome/browser/cocoa/menu_tracked_root_view.h
@@ -0,0 +1,25 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_COCOA_MENU_TRACKED_ROOT_VIEW_H_
+#define CHROME_BROWSER_COCOA_MENU_TRACKED_ROOT_VIEW_H_
+#pragma once
+
+#import <Cocoa/Cocoa.h>
+
+// An instance of MenuTrackedRootView should be the root of the view hierarchy
+// of the custom view of NSMenuItems. If the user opens the menu in a non-
+// sticky fashion (i.e. clicks, holds, and drags) and then releases the mouse
+// over the menu item, it will cancel tracking on the |[menuItem_ menu]|.
+@interface MenuTrackedRootView : NSView {
+ @private
+ // The menu item whose custom view's root view is an instance of this class.
+ NSMenuItem* menuItem_; // weak
+}
+
+@property (assign, nonatomic) NSMenuItem* menuItem;
+
+@end
+
+#endif // CHROME_BROWSER_COCOA_MENU_TRACKED_ROOT_VIEW_H_
diff --git a/chrome/browser/cocoa/menu_tracked_root_view.mm b/chrome/browser/cocoa/menu_tracked_root_view.mm
new file mode 100644
index 0000000..ef3c246
--- /dev/null
+++ b/chrome/browser/cocoa/menu_tracked_root_view.mm
@@ -0,0 +1,15 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "chrome/browser/cocoa/menu_tracked_root_view.h"
+
+@implementation MenuTrackedRootView
+
+@synthesize menuItem = menuItem_;
+
+- (void)mouseUp:(NSEvent*)theEvent {
+ [[menuItem_ menu] cancelTracking];
+}
+
+@end
diff --git a/chrome/browser/cocoa/menu_tracked_root_view_unittest.mm b/chrome/browser/cocoa/menu_tracked_root_view_unittest.mm
new file mode 100644
index 0000000..f2e5f2c
--- /dev/null
+++ b/chrome/browser/cocoa/menu_tracked_root_view_unittest.mm
@@ -0,0 +1,45 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <Cocoa/Cocoa.h>
+
+#include "base/scoped_nsobject.h"
+#import "chrome/browser/cocoa/cocoa_test_helper.h"
+#import "chrome/browser/cocoa/menu_tracked_root_view.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/platform_test.h"
+#import "third_party/ocmock/OCMock/OCMock.h"
+
+class MenuTrackedRootViewTest : public CocoaTest {
+ public:
+ void SetUp() {
+ CocoaTest::SetUp();
+ view_.reset([[MenuTrackedRootView alloc] init]);
+ }
+
+ scoped_nsobject<MenuTrackedRootView> view_;
+};
+
+TEST_F(MenuTrackedRootViewTest, MouseUp) {
+ id menu = [OCMockObject mockForClass:[NSMenu class]];
+ [[menu expect] cancelTracking];
+
+ id menuItem = [OCMockObject mockForClass:[NSMenuItem class]];
+ [[[menuItem stub] andReturn:menu] menu];
+
+ [view_ setMenuItem:menuItem];
+ NSEvent* event = [NSEvent mouseEventWithType:NSLeftMouseUp
+ location:NSMakePoint(42, 42)
+ modifierFlags:0
+ timestamp:0
+ windowNumber:[test_window() windowNumber]
+ context:nil
+ eventNumber:1
+ clickCount:1
+ pressure:1.0];
+ [view_ mouseUp:event];
+
+ [menu verify];
+ [menuItem verify];
+}
diff --git a/chrome/browser/cocoa/wrench_menu_controller.h b/chrome/browser/cocoa/wrench_menu_controller.h
index 242848d..fc6801c 100644
--- a/chrome/browser/cocoa/wrench_menu_controller.h
+++ b/chrome/browser/cocoa/wrench_menu_controller.h
@@ -11,6 +11,7 @@
#import "base/cocoa_protocols_mac.h"
#import "chrome/browser/cocoa/menu_controller.h"
+@class MenuTrackedRootView;
@class ToolbarController;
class WrenchMenuModel;
@@ -23,10 +24,12 @@ class WrenchMenuModel;
// This object is instantiated in Toolbar.xib and is configured by the
// ToolbarController.
@interface WrenchMenuController : MenuController<NSMenuDelegate> {
- IBOutlet NSView* editItem_;
- IBOutlet NSSegmentedControl* editControl_;
+ IBOutlet MenuTrackedRootView* editItem_;
+ IBOutlet NSButton* editCut_;
+ IBOutlet NSButton* editCopy_;
+ IBOutlet NSButton* editPaste_;
- IBOutlet NSView* zoomItem_;
+ IBOutlet MenuTrackedRootView* zoomItem_;
IBOutlet NSButton* zoomPlus_;
IBOutlet NSButton* zoomDisplay_;
IBOutlet NSButton* zoomMinus_;
diff --git a/chrome/browser/cocoa/wrench_menu_controller.mm b/chrome/browser/cocoa/wrench_menu_controller.mm
index fca4d04..28553fe 100644
--- a/chrome/browser/cocoa/wrench_menu_controller.mm
+++ b/chrome/browser/cocoa/wrench_menu_controller.mm
@@ -9,6 +9,7 @@
#include "chrome/app/chrome_dll_resource.h"
#include "chrome/browser/browser.h"
#include "chrome/browser/browser_window.h"
+#import "chrome/browser/cocoa/menu_tracked_root_view.h"
#import "chrome/browser/cocoa/toolbar_controller.h"
#include "chrome/browser/wrench_menu_model.h"
@@ -48,10 +49,12 @@
case IDC_EDIT_MENU:
DCHECK(editItem_);
[customItem setView:editItem_];
+ [editItem_ setMenuItem:customItem];
break;
case IDC_ZOOM_MENU:
DCHECK(zoomItem_);
[customItem setView:zoomItem_];
+ [zoomItem_ setMenuItem:customItem];
break;
default:
NOTREACHED();
@@ -73,10 +76,10 @@
NSString* title = base::SysUTF16ToNSString(
[self wrenchMenuModel]->GetLabelForCommandId(IDC_ZOOM_PERCENT_DISPLAY));
[[zoomItem_ viewWithTag:IDC_ZOOM_PERCENT_DISPLAY] setTitle:title];
+
bool plusEnabled = [self wrenchMenuModel]->IsCommandIdEnabled(IDC_ZOOM_PLUS);
bool minusEnabled = [self wrenchMenuModel]->IsCommandIdEnabled(
IDC_ZOOM_MINUS);
-
[zoomPlus_ setEnabled:plusEnabled];
[zoomMinus_ setEnabled:minusEnabled];
@@ -92,12 +95,6 @@
// NSCarbonMenuWindow; this screws up the typical |-commandDispatch:| system.
- (IBAction)dispatchWrenchMenuCommand:(id)sender {
NSInteger tag = [sender tag];
-
- // NSSegmentedControls (used for the Edit item) need a little help to get the
- // command_id of the pressed item.
- if ([sender isKindOfClass:[NSSegmentedControl class]])
- tag = [[sender cell] tagForSegment:[sender selectedSegment]];
-
// The custom views within the Wrench menu are abnormal and keep the menu open
// after a target-action. Close the menu manually.
// TODO(rsesek): It'd be great if the zoom buttons didn't have to close the
@@ -127,28 +124,44 @@
// Fit the localized strings into the Cut/Copy/Paste control, then resize the
// whole menu item accordingly.
- (void)adjustPositioning {
+ const CGFloat kButtonPadding = 12;
+ CGFloat delta = 0;
+
+ // Go through the three buttons from right-to-left, adjusting the size to fit
+ // the localized strings while keeping them all aligned on their horizontal
+ // edges.
+ const size_t kAdjustViewCount = 3;
+ NSButton* views[kAdjustViewCount] = { editPaste_, editCopy_, editCut_ };
+ for (size_t i = 0; i < kAdjustViewCount; ++i) {
+ NSButton* button = views[i];
+ CGFloat originalWidth = NSWidth([button frame]);
+
+ // Do not let |-sizeToFit| change the height of the button.
+ NSSize size = [button frame].size;
+ [button sizeToFit];
+ size.width = [button frame].size.width + kButtonPadding;
+ [button setFrameSize:size];
+
+ CGFloat newWidth = size.width;
+ delta += newWidth - originalWidth;
+
+ NSRect frame = [button frame];
+ frame.origin.x -= delta;
+ [button setFrame:frame];
+ }
+
+ // Resize the menu item by the total amound the buttons changed so that the
+ // spacing between the buttons and the title remains the same.
NSRect itemFrame = [editItem_ frame];
- NSRect controlFrame = [editControl_ frame];
-
- CGFloat originalControlWidth = NSWidth(controlFrame);
- // Maintain the carefully pixel-pushed gap between the edge of the menu and
- // the rightmost control.
- CGFloat edge = NSWidth(itemFrame) -
- (controlFrame.origin.x + originalControlWidth);
-
- // Resize the edit segmented control to fit the localized strings.
- [editControl_ sizeToFit];
- controlFrame = [editControl_ frame];
- CGFloat resizeAmount = NSWidth(controlFrame) - originalControlWidth;
-
- // Adjust the size of the entire menu item to account for changes in the size
- // of the segmented control.
- itemFrame.size.width += resizeAmount;
+ itemFrame.size.width += delta;
[editItem_ setFrame:itemFrame];
- // Keep the spacing between the right edges of the menu and the control.
- controlFrame.origin.x = NSWidth(itemFrame) - edge - NSWidth(controlFrame);
- [editControl_ setFrame:controlFrame];
+ // Also resize the superview of the buttons, which is an NSView used to slide
+ // when the item title is too big and GTM resizes it.
+ NSRect parentFrame = [[editCut_ superview] frame];
+ parentFrame.size.width += delta;
+ parentFrame.origin.x -= delta;
+ [[editCut_ superview] setFrame:parentFrame];
}
@end // @implementation WrenchMenuController
diff --git a/chrome/browser/cocoa/wrench_menu_controller_unittest.mm b/chrome/browser/cocoa/wrench_menu_controller_unittest.mm
index fbbf740..446bd80 100644
--- a/chrome/browser/cocoa/wrench_menu_controller_unittest.mm
+++ b/chrome/browser/cocoa/wrench_menu_controller_unittest.mm
@@ -81,18 +81,4 @@ TEST_F(WrenchMenuControllerTest, DispatchSimple) {
[controller() dispatchWrenchMenuCommand:button.get()];
}
-TEST_F(WrenchMenuControllerTest, DispatchSegmentedControl) {
- // Set fake model to test dispatching.
- EXPECT_CALL(fake_model_, ExecuteCommand(IDC_CUT));
- [controller() setModel:&fake_model_];
-
- scoped_nsobject<NSSegmentedControl> control(
- [[NSSegmentedControl alloc] init]);
- [control setSegmentCount:2];
- [[control cell] setTag:IDC_CUT forSegment:0];
- [[control cell] setSelectedSegment:0];
-
- [controller() dispatchWrenchMenuCommand:control.get()];
-}
-
} // namespace
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 6e434c6..150f0fd 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -927,6 +927,10 @@
'browser/cocoa/menu_button.mm',
'browser/cocoa/menu_controller.h',
'browser/cocoa/menu_controller.mm',
+ 'browser/cocoa/menu_tracked_button.h',
+ 'browser/cocoa/menu_tracked_button.mm',
+ 'browser/cocoa/menu_tracked_root_view.h',
+ 'browser/cocoa/menu_tracked_root_view.mm',
'browser/cocoa/multi_key_equivalent_button.h',
'browser/cocoa/multi_key_equivalent_button.mm',
'browser/cocoa/new_tab_button.h',
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index a57a4ed..1b7ff71 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -859,6 +859,8 @@
'browser/cocoa/location_bar/selected_keyword_decoration_unittest.mm',
'browser/cocoa/menu_button_unittest.mm',
'browser/cocoa/menu_controller_unittest.mm',
+ 'browser/cocoa/menu_tracked_button_unittest.mm',
+ 'browser/cocoa/menu_tracked_root_view_unittest.mm',
'browser/cocoa/notifications/balloon_controller_unittest.mm',
'browser/cocoa/nsimage_cache_unittest.mm',
'browser/cocoa/nsmenuitem_additions_unittest.mm',