summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorjrg@chromium.org <jrg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-16 05:43:44 +0000
committerjrg@chromium.org <jrg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-16 05:43:44 +0000
commitc5cb15a495d51e52e0704f0eb4a2e5e92b963f9a (patch)
tree6c9cb827af73d11d463c87dab763aeb75e4db47a /chrome
parenta44e6102cd74889a4394516db97a2d7bddd1255d (diff)
downloadchromium_src-c5cb15a495d51e52e0704f0eb4a2e5e92b963f9a.zip
chromium_src-c5cb15a495d51e52e0704f0eb4a2e5e92b963f9a.tar.gz
chromium_src-c5cb15a495d51e52e0704f0eb4a2e5e92b963f9a.tar.bz2
Improve bookmark bar folder scroll.
BUG=39791 TEST=\ Create bookmark folders with various quantites of bookmarks. Make sure normal folders work. Open some that don't fit on the screen. See rounded corners on bottom. Try and move mouse to bottom of screen --> window grows and scrolls. Move mouse to top of screen --> window does NOT change size but does scroll. Move mouse off folder while scrolling --> scrolling stops. Make sure no buttons get "stuck" with a mouse-enter (highlit). Make sure no "getting stuck" or "window scrolls off the screen". Briefly test subfolders. xib changes: - Window content view is now BookmarkBarFolderWindowContentView - BookmaerkBarFolderView now wrapped in an NSScrollView - Some view autosizing changed Review URL: http://codereview.chromium.org/1593025 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@44755 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/app/nibs/BookmarkBarFolderWindow.xib852
-rw-r--r--chrome/browser/cocoa/bookmark_bar_controller.mm5
-rw-r--r--chrome/browser/cocoa/bookmark_bar_folder_controller.h12
-rw-r--r--chrome/browser/cocoa/bookmark_bar_folder_controller.mm170
-rw-r--r--chrome/browser/cocoa/bookmark_bar_folder_controller_unittest.mm125
-rw-r--r--chrome/browser/cocoa/bookmark_bar_folder_view.mm2
-rw-r--r--chrome/browser/cocoa/bookmark_bar_folder_window.h6
-rw-r--r--chrome/browser/cocoa/bookmark_bar_folder_window.mm63
-rw-r--r--chrome/browser/cocoa/bookmark_bar_folder_window_unittest.mm12
-rw-r--r--chrome/browser/cocoa/bookmark_button.h3
10 files changed, 1113 insertions, 137 deletions
diff --git a/chrome/app/nibs/BookmarkBarFolderWindow.xib b/chrome/app/nibs/BookmarkBarFolderWindow.xib
index e8cb5f0..a86eeae 100644
--- a/chrome/app/nibs/BookmarkBarFolderWindow.xib
+++ b/chrome/app/nibs/BookmarkBarFolderWindow.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">680</string>
- <string key="IBDocument.AppKitVersion">949.54</string>
- <string key="IBDocument.HIToolboxVersion">353.00</string>
+ <string key="IBDocument.SystemVersion">10B504</string>
+ <string key="IBDocument.InterfaceBuilderVersion">732</string>
+ <string key="IBDocument.AppKitVersion">1038.2</string>
+ <string key="IBDocument.HIToolboxVersion">437.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="NS.object.0">732</string>
+ </object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="2"/>
- <integer value="10"/>
+ <integer value="1"/>
<integer value="12"/>
+ <integer value="10"/>
</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">
@@ -44,25 +48,83 @@
<string key="NSWindowTitle">BmbPopUpWindow</string>
<string key="NSWindowClass">BookmarkBarFolderWindow</string>
<nil key="NSViewClass"/>
- <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
<object class="NSView" key="NSWindowView" id="1006">
<reference key="NSNextResponder"/>
- <int key="NSvFlags">256</int>
+ <int key="NSvFlags">274</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSCustomView" id="762431297">
+ <object class="NSScrollView" id="7382480">
<reference key="NSNextResponder" ref="1006"/>
<int key="NSvFlags">274</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSClipView" id="795270038">
+ <reference key="NSNextResponder" ref="7382480"/>
+ <int key="NSvFlags">2304</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomView" id="762431297">
+ <reference key="NSNextResponder" ref="795270038"/>
+ <int key="NSvFlags">296</int>
+ <string key="NSFrame">{{0, -17}, {480, 270}}</string>
+ <reference key="NSSuperview" ref="795270038"/>
+ <string key="NSClassName">BookmarkBarFolderView</string>
+ </object>
+ </object>
+ <string key="NSFrame">{{1, 1}, {478, 268}}</string>
+ <string key="NSBounds">{{0, -15}, {478, 268}}</string>
+ <reference key="NSSuperview" ref="7382480"/>
+ <reference key="NSNextKeyView" ref="762431297"/>
+ <reference key="NSDocView" ref="762431297"/>
+ <object class="NSColor" key="NSBGColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+ </object>
+ </object>
+ <int key="NScvFlags">2</int>
+ </object>
+ <object class="NSScroller" id="563841282">
+ <reference key="NSNextResponder" ref="7382480"/>
+ <int key="NSvFlags">-2147483392</int>
+ <string key="NSFrame">{{-100, -100}, {15, 285}}</string>
+ <reference key="NSSuperview" ref="7382480"/>
+ <bool key="NSEnabled">YES</bool>
+ <reference key="NSTarget" ref="7382480"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSCurValue">1</double>
+ <double key="NSPercent">0.96363627910614014</double>
+ </object>
+ <object class="NSScroller" id="673728740">
+ <reference key="NSNextResponder" ref="7382480"/>
+ <int key="NSvFlags">-2147483392</int>
+ <string key="NSFrame">{{-100, -100}, {480, 15}}</string>
+ <reference key="NSSuperview" ref="7382480"/>
+ <bool key="NSEnabled">YES</bool>
+ <int key="NSsFlags">1</int>
+ <reference key="NSTarget" ref="7382480"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">0.50602412223815918</double>
+ </object>
+ </object>
<string key="NSFrameSize">{480, 270}</string>
<reference key="NSSuperview" ref="1006"/>
- <string key="NSClassName">BookmarkBarFolderView</string>
+ <reference key="NSNextKeyView" ref="795270038"/>
+ <int key="NSsFlags">194</int>
+ <reference key="NSVScroller" ref="563841282"/>
+ <reference key="NSHScroller" ref="673728740"/>
+ <reference key="NSContentView" ref="795270038"/>
</object>
</object>
<string key="NSFrameSize">{480, 270}</string>
<reference key="NSSuperview"/>
</object>
<string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string>
- <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
</object>
<object class="NSMenu" id="447628937">
<string key="NSTitle"/>
@@ -668,34 +730,40 @@
</object>
<int key="connectionID">89</int>
</object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">scrollView_</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="7382480"/>
+ </object>
+ <int key="connectionID">94</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="648438133">
- <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="648438133"/>
- <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="648438133"/>
+ <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="648438133"/>
+ <reference key="parent" ref="0"/>
<string key="objectName">Application</string>
</object>
<object class="IBObjectRecord">
@@ -705,23 +773,18 @@
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="1006"/>
</object>
- <reference key="parent" ref="648438133"/>
+ <reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">2</int>
<reference key="object" ref="1006"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="762431297"/>
+ <reference ref="7382480"/>
</object>
<reference key="parent" ref="1005"/>
</object>
<object class="IBObjectRecord">
- <int key="objectID">4</int>
- <reference key="object" ref="762431297"/>
- <reference key="parent" ref="1006"/>
- </object>
- <object class="IBObjectRecord">
<int key="objectID">10</int>
<reference key="object" ref="243908609"/>
<object class="NSMutableArray" key="children">
@@ -744,13 +807,13 @@
<reference ref="432629396"/>
<reference ref="147047106"/>
</object>
- <reference key="parent" ref="648438133"/>
+ <reference key="parent" ref="0"/>
<string key="objectName">Folder Menu</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">11</int>
<reference key="object" ref="297726234"/>
- <reference key="parent" ref="648438133"/>
+ <reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">12</int>
@@ -775,13 +838,13 @@
<reference ref="202140151"/>
<reference ref="416998881"/>
</object>
- <reference key="parent" ref="648438133"/>
+ <reference key="parent" ref="0"/>
<string key="objectName">Button Menu</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">13</int>
<reference key="object" ref="493003890"/>
- <reference key="parent" ref="648438133"/>
+ <reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">16</int>
@@ -953,11 +1016,37 @@
<reference key="object" ref="147047106"/>
<reference key="parent" ref="243908609"/>
</object>
+ <object class="IBObjectRecord">
+ <int key="objectID">90</int>
+ <reference key="object" ref="7382480"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="563841282"/>
+ <reference ref="673728740"/>
+ <reference ref="762431297"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">91</int>
+ <reference key="object" ref="563841282"/>
+ <reference key="parent" ref="7382480"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">92</int>
+ <reference key="object" ref="673728740"/>
+ <reference key="parent" ref="7382480"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">4</int>
+ <reference key="object" ref="762431297"/>
+ <reference key="parent" ref="7382480"/>
+ </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>
@@ -980,6 +1069,7 @@
<string>17.IBPluginDependency</string>
<string>18.IBPluginDependency</string>
<string>19.IBPluginDependency</string>
+ <string>2.CustomClassName</string>
<string>2.IBPluginDependency</string>
<string>20.IBPluginDependency</string>
<string>21.IBPluginDependency</string>
@@ -1018,24 +1108,25 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>{{9, 882}, {480, 270}}</string>
+ <string>{{727, 430}, {480, 270}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>{{9, 882}, {480, 270}}</string>
+ <string>{{727, 430}, {480, 270}}</string>
<boolean value="NO"/>
<string>{196, 240}</string>
<string>{{357, 418}, {480, 270}}</string>
<string>BookmarkMenu</string>
- <string>{{222, 479}, {375, 293}}</string>
+ <string>{{222, 452}, {372, 293}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>BookmarkMenu</string>
- <string>{{230, 131}, {365, 293}}</string>
+ <string>{{230, 131}, {362, 293}}</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>BookmarkBarFolderWindowContentView</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@@ -1072,9 +1163,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>
@@ -1082,15 +1171,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">89</int>
+ <int key="maxID">94</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -1100,7 +1187,7 @@
<string key="superclassName">NSWindowController</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>addFolder:</string>
<string>addPage:</string>
@@ -1135,17 +1222,19 @@
</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>buttonMenu_</string>
<string>folderMenu_</string>
<string>mainView_</string>
+ <string>scrollView_</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSMenu</string>
<string>NSMenu</string>
<string>BookmarkBarFolderView</string>
+ <string>NSScrollView</string>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
@@ -1164,12 +1253,17 @@
<object class="IBPartialClassDescription">
<string key="className">BookmarkBarFolderWindow</string>
<string key="superclassName">NSWindow</string>
- <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="882611964">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">browser/cocoa/bookmark_bar_folder_window.h</string>
</object>
</object>
<object class="IBPartialClassDescription">
+ <string key="className">BookmarkBarFolderWindowContentView</string>
+ <string key="superclassName">NSView</string>
+ <reference key="sourceIdentifier" ref="882611964"/>
+ </object>
+ <object class="IBPartialClassDescription">
<string key="className">BookmarkMenu</string>
<string key="superclassName">NSMenu</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
@@ -1202,7 +1296,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>
@@ -1225,7 +1319,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>localizerOwner_</string>
<string>localizer_</string>
@@ -1286,8 +1380,670 @@
</object>
</object>
</object>
+ <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <string key="superclassName">NSResponder</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="142476140">
+ <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="523367666">
+ <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="566275335">
+ <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">NSControl</string>
+ <string key="superclassName">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="1015112038">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSControl.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="372828214">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSMenu.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSMenuItem</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="138001703">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSMenuItem.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="142476140"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <reference key="sourceIdentifier" ref="523367666"/>
+ </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="566275335"/>
+ </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="1015112038"/>
+ </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" id="532209659">
+ <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="372828214"/>
+ </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="503320393">
+ <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" id="254852090">
+ <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">QuartzCore.framework/Headers/CAAnimation.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">QuartzCore.framework/Headers/CALayer.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">QuartzCore.framework/Headers/CIImageProvider.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">NSScrollView</string>
+ <string key="superclassName">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSScrollView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSScroller</string>
+ <string key="superclassName">NSControl</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSScroller.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>
+ <reference key="sourceIdentifier" ref="138001703"/>
+ </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="503320393"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSWindow</string>
+ <reference key="sourceIdentifier" ref="532209659"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSWindow</string>
+ <string key="superclassName">NSResponder</string>
+ <reference key="sourceIdentifier" ref="254852090"/>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSWindow</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSWindowScripting.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSWindowController</string>
+ <string key="superclassName">NSResponder</string>
+ <object class="NSMutableDictionary" key="actions">
+ <string key="NS.key.0">showWindow:</string>
+ <string key="NS.object.0">id</string>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">AppKit.framework/Headers/NSWindowController.h</string>
+ </object>
+ </object>
+ </object>
</object>
<int key="IBDocument.localizationMode">0</int>
+ <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>
</data>
diff --git a/chrome/browser/cocoa/bookmark_bar_controller.mm b/chrome/browser/cocoa/bookmark_bar_controller.mm
index f71b65b..19025d6 100644
--- a/chrome/browser/cocoa/bookmark_bar_controller.mm
+++ b/chrome/browser/cocoa/bookmark_bar_controller.mm
@@ -950,11 +950,6 @@ static BOOL ValueInRangeInclusive(CGFloat low, CGFloat value, CGFloat high) {
return x;
}
-// Return the parent window for all BookmarkBarFolderController windows.
-- (NSWindow*)parentWindow {
- return [[self view] window];
-}
-
- (int)currentTabContentsHeight {
return browser_->GetSelectedTabContents() ?
browser_->GetSelectedTabContents()->view()->GetContainerSize().height() :
diff --git a/chrome/browser/cocoa/bookmark_bar_folder_controller.h b/chrome/browser/cocoa/bookmark_bar_folder_controller.h
index d13d51d..24d81f5 100644
--- a/chrome/browser/cocoa/bookmark_bar_folder_controller.h
+++ b/chrome/browser/cocoa/bookmark_bar_folder_controller.h
@@ -56,9 +56,20 @@
// Our buttons. We do not have buttons for nested folders.
scoped_nsobject<NSMutableArray> buttons_;
+ // The scroll view that contains our main button view (below).
+ IBOutlet NSScrollView* scrollView_;
+
+ // Are we scrollable? If no, the full contents of the folder are
+ // always visible.
+ BOOL scrollable_;
+
// The main view of this window (where the buttons go).
IBOutlet BookmarkBarFolderView* mainView_;
+ // Weak; we keep track to work around a
+ // setShowsBorderOnlyWhileMouseInside bug.
+ BookmarkButton* buttonThatMouseIsIn_;
+
// The context menu for a bookmark button which represents an URL.
IBOutlet NSMenu* buttonMenu_;
@@ -129,5 +140,6 @@
- (BookmarkBarFolderController*)folderController;
- (id)folderTarget;
- (void)configureWindowLevel;
+- (void)performOneScroll:(CGFloat)delta;
@end
diff --git a/chrome/browser/cocoa/bookmark_bar_folder_controller.mm b/chrome/browser/cocoa/bookmark_bar_folder_controller.mm
index ac2be62..9ae9a5b 100644
--- a/chrome/browser/cocoa/bookmark_bar_folder_controller.mm
+++ b/chrome/browser/cocoa/bookmark_bar_folder_controller.mm
@@ -27,11 +27,18 @@ const NSTimeInterval kBookmarkBarFolderScrollInterval = 0.2;
const CGFloat kBookmarkBarFolderScrollAmount =
2 * (bookmarks::kBookmarkButtonHeight +
bookmarks::kBookmarkVerticalPadding);
+
+// When constraining a scrolling bookmark bar folder window to the
+// screen, shrink the "constrain" by this much vertically. Currently
+// this is 0.0 to avoid a problem with tracking areas leaving the
+// window, but should probably be 8.0 or something.
+// TODO(jrg): http://crbug.com/36225
+const CGFloat kScrollWindowVerticalMargin = 0.0;
}
@interface BookmarkBarFolderController(Private)
- (void)configureWindow;
-- (void)addScrollTracking;
+- (void)addOrUpdateScrollTracking;
- (void)removeScrollTracking;
- (void)endScroll;
- (void)addScrollTimerWithDelta:(CGFloat)delta;
@@ -53,7 +60,8 @@ const CGFloat kBookmarkBarFolderScrollAmount =
buttons_.reset([[NSMutableArray alloc] init]);
folderTarget_.reset([[BookmarkFolderTarget alloc] initWithController:self]);
[self configureWindow];
- [self addScrollTracking];
+ if (scrollable_)
+ [self addOrUpdateScrollTracking];
}
return self;
}
@@ -210,19 +218,10 @@ const CGFloat kBookmarkBarFolderScrollAmount =
// Must have at least 1 button (for "empty")
int buttons = std::max(node->GetChildCount() - startingIndex, 1);
+ // Prelim height of the window. We'll trim later as needed.
int height = buttons * bookmarks::kBookmarkButtonHeight;
-
- // Note: this will be replaced once we make buttons; for now, use a
- // reasonable value. Button creation needs a valid (x,y,h) in a
- // frame to position them properly.
- int windowWidth = (bookmarks::kBookmarkMenuButtonMinimumWidth +
- 2 * bookmarks::kBookmarkVerticalPadding);
-
- NSRect windowFrame = NSMakeRect(newWindowTopLeft.x,
- newWindowTopLeft.y - height,
- windowWidth,
- height);
- [[self window] setFrame:windowFrame display:YES];
+ // We'll need this soon...
+ [self window];
// TODO(jrg): combine with frame code in bookmark_bar_controller.mm
// http://crbug.com/35966
@@ -271,23 +270,47 @@ const CGFloat kBookmarkBarFolderScrollAmount =
buttonFrame.size.width = width;
[button setFrame:buttonFrame];
}
+ width += (2 * bookmarks::kBookmarkVerticalPadding);
// Finally, set our window size (make sure it fits on screen).
- width += (2 * bookmarks::kBookmarkVerticalPadding);
- windowFrame.size.width = width;
+ NSRect windowFrame = NSMakeRect(newWindowTopLeft.x,
+ newWindowTopLeft.y - height,
+ width,
+ height);
// Make the window fit on screen, with a distance of at least |padding| from
// the sides.
- if ([[self window] screen]) { // nil in unit tests
- const CGFloat padding = 8;
- NSRect screen = [[[self window] screen] frame];
- if (NSMaxX(windowFrame) + padding > NSMaxX(screen))
- windowFrame.origin.x -= NSMaxX(windowFrame) + padding - NSMaxX(screen);
- else if (NSMinX(windowFrame) - padding < NSMinX(screen))
- windowFrame.origin.x += NSMinX(screen) - NSMinX(windowFrame) + padding;
+ DCHECK([[self window] screen]);
+ NSRect screenFrame = [[[self window] screen] frame];
+ const CGFloat padding = 8;
+ if (NSMaxX(windowFrame) + padding > NSMaxX(screenFrame))
+ windowFrame.origin.x -= NSMaxX(windowFrame) + padding - NSMaxX(screenFrame);
+ // No 'else' to provide preference for the left side of the menu
+ // being visible if neither one fits. Wish I had an "bool isL2R()"
+ // function right here.
+ if (NSMinX(windowFrame) - padding < NSMinX(screenFrame))
+ windowFrame.origin.x += NSMinX(screenFrame) - NSMinX(windowFrame) + padding;
+
+ // Make the scrolled content be the right size (full size).
+ NSRect mainViewFrame = NSMakeRect(0, 0,
+ NSWidth(windowFrame),
+ NSHeight(windowFrame));
+ [mainView_ setFrame:mainViewFrame];
+
+ // Make sure the window fits on the screen. If not, constrain.
+ // We'll scroll to allow the user to see all the content.
+ screenFrame = NSInsetRect(screenFrame, 0, kScrollWindowVerticalMargin);
+ if (!NSContainsRect(screenFrame, windowFrame)) {
+ scrollable_ = YES;
+ windowFrame = NSIntersectionRect(screenFrame, windowFrame);
}
-
[[self window] setFrame:windowFrame display:YES];
+ if (scrollable_) {
+ [mainView_ scrollPoint:NSMakePoint(0, (NSHeight(mainViewFrame) -
+ NSHeight(windowFrame)))];
+ }
+
+ // Finally pop me up.
[self configureWindowLevel];
}
@@ -310,25 +333,73 @@ const CGFloat kBookmarkBarFolderScrollAmount =
}
}
+// Perform a single scroll of the specified amount.
+// Scroll up:
+// Scroll the documentView by the growth amount.
+// If we cannot grow the window, simply scroll the documentView.
+// If we can grow the window up without falling off the screen, do it.
+// Scroll down:
+// Never change the window size; only scroll the documentView.
+- (void)performOneScroll:(CGFloat)delta {
+ NSRect windowFrame = [[self window] frame];
+ NSRect screenFrame = [[[self window] screen] frame];
+
+ // First scroll the "document" area.
+ NSPoint scrollPosition = [scrollView_ documentVisibleRect].origin;
+ scrollPosition.y -= delta;
+ [[scrollView_ documentView] scrollPoint:scrollPosition];
+
+ // On 10.6 event dispatch for an NSButtonCell's
+ // showsBorderOnlyWhileMouseInside seems broken if scrolling the
+ // view that contains the button. It appears that a mouseExited:
+ // gets lost, so the button stays highlit forever. We accomodate
+ // here.
+ if (buttonThatMouseIsIn_) {
+ [[buttonThatMouseIsIn_ cell] setShowsBorderOnlyWhileMouseInside:NO];
+ [[buttonThatMouseIsIn_ cell] setShowsBorderOnlyWhileMouseInside:YES];
+ }
+
+ // We update the window size after shifting the scroll to avoid a race.
+ CGFloat screenHeightMinusMargin = (NSHeight(screenFrame) -
+ (2 * kScrollWindowVerticalMargin));
+ if (delta) {
+ // If we can, grow the window (up).
+ if (NSHeight(windowFrame) < screenHeightMinusMargin) {
+ CGFloat growAmount = delta;
+ // Don't scroll more than enough to "finish".
+ if (scrollPosition.y < 0)
+ growAmount += scrollPosition.y;
+ windowFrame.size.height += growAmount;
+ windowFrame.size.height = std::min(NSHeight(windowFrame),
+ screenHeightMinusMargin);
+ [[self window] setFrame:windowFrame display:YES];
+ [self addOrUpdateScrollTracking];
+ }
+ }
+
+ // If we're at either end, happiness.
+ if ((scrollPosition.y <= 0) ||
+ ((scrollPosition.y + NSHeight(windowFrame) >=
+ NSHeight([mainView_ frame])) &&
+ (windowFrame.size.height == screenHeightMinusMargin))) {
+ [self endScroll];
+
+ // If the entire view is now visible the window is no longer scrollable.
+ if (NSHeight([mainView_ visibleRect]) == NSHeight([mainView_ bounds])) {
+ scrollable_ = NO;
+ [self removeScrollTracking];
+ }
+ }
+}
+
// Perform a scroll of the window on the screen.
// Called by a timer when scrolling.
- (void)performScroll:(NSTimer*)timer {
- NSRect frame = [[self window] frame];
- NSRect newFrame = frame;
- newFrame.origin.y += verticalScrollDelta_;
- [[self window] setFrameOrigin:newFrame.origin];
-
- // If we've just move a border of the window from offscreen to
- // onscreen, stop scrolling.
- NSRect screenRect = [[[self window] screen] frame];
- if ((!NSPointInRect(frame.origin, screenRect) &&
- NSPointInRect(newFrame.origin, screenRect)) ||
- ((NSMaxY(frame) >= NSMaxY(screenRect)) &&
- (NSMaxY(newFrame) < NSMaxY(screenRect)))) {
- [self endScroll];
- }
+ DCHECK(verticalScrollDelta_);
+ [self performOneScroll:verticalScrollDelta_];
}
+
// Add a timer to fire at a regular interveral which scrolls the
// window vertically |delta|.
- (void)addScrollTimerWithDelta:(CGFloat)delta {
@@ -360,6 +431,7 @@ const CGFloat kBookmarkBarFolderScrollAmount =
kBookmarkBarFolderScrollAmount;
CGFloat closeToBottomOfScreen = NSMinY(visibleRect) +
kBookmarkBarFolderScrollAmount;
+
if (eventScreenLocation.y <= closeToBottomOfScreen) {
[self beginScrollWindowUp];
} else if (eventScreenLocation.y > closeToTopOfScreen) {
@@ -369,16 +441,20 @@ const CGFloat kBookmarkBarFolderScrollAmount =
}
}
+- (void)mouseExited:(NSEvent*)theEvent {
+ [self endScroll];
+}
+
// Add a tracking area so we know when the mouse is pinned to the top
// or bottom of the screen. If that happens, and if the mouse
-// position overlaps the window, scroll it. To be clear, "scroll it"
-// means "move the window vertically", not scroll it's contents with
-// an NSScrollView.
-- (void)addScrollTracking {
+// position overlaps the window, scroll it.
+- (void)addOrUpdateScrollTracking {
+ [self removeScrollTracking];
NSView* view = [[self window] contentView];
scrollTrackingArea_.reset([[NSTrackingArea alloc]
initWithRect:[view bounds]
options:(NSTrackingMouseMoved |
+ NSTrackingMouseEnteredAndExited |
NSTrackingActiveAlways)
owner:self
userInfo:nil]);
@@ -712,11 +788,6 @@ static BOOL ValueInRangeInclusive(CGFloat low, CGFloat value, CGFloat high) {
return y;
}
-- (NSWindow*)parentWindow {
- return parentController_ ? [parentController_ parentWindow] :
- [barController_ parentWindow];
-}
-
// Close the old hover-open bookmark folder, and open a new one. We
// do both in one step to allow for a delay in closing the old one.
// See comments above kDragHoverCloseDelay (bookmark_bar_controller.h)
@@ -733,6 +804,8 @@ static BOOL ValueInRangeInclusive(CGFloat low, CGFloat value, CGFloat high) {
// Called from BookmarkButton.
// Unlike bookmark_bar_controller's version, we DO default to being enabled.
- (void)mouseEnteredButton:(id)sender event:(NSEvent*)event {
+ buttonThatMouseIsIn_ = sender;
+
// Cancel a previous hover if needed.
[NSObject cancelPreviousPerformRequestsWithTarget:self];
@@ -748,6 +821,9 @@ static BOOL ValueInRangeInclusive(CGFloat low, CGFloat value, CGFloat high) {
// Called from the BookmarkButton
- (void)mouseExitedButton:(id)sender event:(NSEvent*)event {
+ if (buttonThatMouseIsIn_ == sender)
+ buttonThatMouseIsIn_ = nil;
+
// Stop any timer about opening a new hover-open folder.
// Since a performSelector:withDelay: on self retains self, it is
diff --git a/chrome/browser/cocoa/bookmark_bar_folder_controller_unittest.mm b/chrome/browser/cocoa/bookmark_bar_folder_controller_unittest.mm
index 28e27ad..27b8d24 100644
--- a/chrome/browser/cocoa/bookmark_bar_folder_controller_unittest.mm
+++ b/chrome/browser/cocoa/bookmark_bar_folder_controller_unittest.mm
@@ -27,17 +27,29 @@
// Don't use a high window level when running unit tests -- it'll
// interfere with anything else you are working on.
-@interface BookmarkBarFolderControllerLow : BookmarkBarFolderController
+@interface BookmarkBarFolderControllerLow : BookmarkBarFolderController {
+ BOOL realTopLeft_; // Use the real windowTopLeft call?
+}
+@property BOOL realTopLeft;
@end
+
@implementation BookmarkBarFolderControllerLow
+
+@synthesize realTopLeft = realTopLeft_;
+
- (void)configureWindowLevel {
// Intentionally empty.
}
+
+- (NSPoint)windowTopLeft {
+ return realTopLeft_ ? [super windowTopLeft] : NSMakePoint(200,200);
+}
+
@end
-@interface BookmarkBarFolderControllerPong : BookmarkBarFolderController {
+@interface BookmarkBarFolderControllerPong : BookmarkBarFolderControllerLow {
BOOL childFolderWillShow_;
BOOL childFolderWillClose_;
}
@@ -69,6 +81,7 @@ class BookmarkBarFolderControllerTest : public CocoaTest {
public:
BrowserTestHelper helper_;
scoped_nsobject<BookmarkBarController> parentBarController_;
+ const BookmarkNode* folderA_; // owned by model
const BookmarkNode* longTitleNode_; // owned by model
BookmarkBarFolderControllerTest() {
@@ -77,6 +90,7 @@ class BookmarkBarFolderControllerTest : public CocoaTest {
const BookmarkNode* folderA = model->AddGroup(parent,
parent->GetChildCount(),
L"group");
+ folderA_ = folderA;
model->AddGroup(parent, parent->GetChildCount(),
L"sibbling group");
const BookmarkNode* folderB = model->AddGroup(folderA,
@@ -101,6 +115,7 @@ class BookmarkBarFolderControllerTest : public CocoaTest {
delegate:nil
resizeDelegate:nil]);
[parentBarController_ loaded:model];
+ [[test_window() contentView] addSubview:[parentBarController_ view]];
}
// Remove the bookmark with the long title.
@@ -110,14 +125,27 @@ class BookmarkBarFolderControllerTest : public CocoaTest {
longTitleNode_->GetParent()->IndexOfChild(longTitleNode_));
}
+ // Add LOTS of nodes to our model if needed (e.g. scrolling).
+ void AddLotsOfNodes() {
+ BookmarkModel* model = helper_.profile()->GetBookmarkModel();
+ for (int i = 0; i < 150; i++) {
+ model->AddURL(folderA_, folderA_->GetChildCount(), L"repeated title",
+ GURL("http://www.google.com/repeated/url"));
+ }
+ }
+
+
// Return a simple BookmarkBarFolderController.
BookmarkBarFolderController* SimpleBookmarkBarFolderController() {
BookmarkButton* parentButton = [[parentBarController_ buttons]
objectAtIndex:0];
- return [[BookmarkBarFolderControllerPong alloc]
+ BookmarkBarFolderController* c =
+ [[BookmarkBarFolderControllerPong alloc]
initWithParentButton:parentButton
parentController:nil
barController:parentBarController_];
+ [c window]; // Force nib load.
+ return c;
}
};
@@ -169,22 +197,32 @@ TEST_F(BookmarkBarFolderControllerTest, Position) {
EXPECT_TRUE(parentButton);
// If parent is a BookmarkBarController, grow down.
- scoped_nsobject<BookmarkBarFolderController> bbfc;
+ scoped_nsobject<BookmarkBarFolderControllerLow> bbfc;
bbfc.reset([[BookmarkBarFolderControllerLow alloc]
initWithParentButton:parentButton
parentController:nil
barController:parentBarController_]);
- NSPoint pt = [bbfc windowTopLeft];
- EXPECT_EQ(pt.y, NSMinY([[parentBarController_ view] frame]));
+ [bbfc window];
+ [bbfc setRealTopLeft:YES];
+ NSPoint pt = [bbfc windowTopLeft]; // screen coords
+ NSPoint buttonOriginInScreen =
+ [[parentButton window]
+ convertBaseToScreen:[parentButton
+ convertRectToBase:[parentButton frame]].origin];
+ // Within margin
+ EXPECT_LE(abs(pt.x - buttonOriginInScreen.x), 2);
+ EXPECT_LE(abs(pt.y - buttonOriginInScreen.y), 2);
// If parent is a BookmarkBarFolderController, grow right.
- scoped_nsobject<BookmarkBarFolderController> bbfc2;
+ scoped_nsobject<BookmarkBarFolderControllerLow> bbfc2;
bbfc2.reset([[BookmarkBarFolderControllerLow alloc]
initWithParentButton:[[bbfc buttons] objectAtIndex:0]
parentController:bbfc.get()
barController:parentBarController_]);
+ [bbfc2 window];
+ [bbfc2 setRealTopLeft:YES];
pt = [bbfc2 windowTopLeft];
- EXPECT_EQ(pt.x, NSMaxX([[[bbfc.get() window] contentView] frame]));
+ EXPECT_EQ(pt.x, NSMaxX([[bbfc.get() window] frame]));
}
TEST_F(BookmarkBarFolderControllerTest, DropDestination) {
@@ -202,7 +240,8 @@ TEST_F(BookmarkBarFolderControllerTest, DropDestination) {
// Confirm "right in the center" (give or take a pixel) is a match,
// and confirm "just barely in the button" is not. Anything more
- // specific seems likely to be tweaked.
+ // specific seems likely to be tweaked. We don't loop over all
+ // buttons because the scroll view makes them not visible.
for (BookmarkButton* button in [bbfc buttons]) {
CGFloat x = NSMidX([button frame]);
CGFloat y = NSMidY([button frame]);
@@ -219,26 +258,6 @@ TEST_F(BookmarkBarFolderControllerTest, DropDestination) {
EXPECT_FALSE([bbfc buttonForDroppingOnAtPoint:NSMakePoint(x+1, y-1)]);
EXPECT_TRUE([bbfc shouldShowIndicatorShownForPoint:NSMakePoint(x, y)]);;
}
-
-
- // On some corners: NOT a match. Confirm that the indicator
- // position for these two points is NOT the same.
- BookmarkButton* dragButton = [[bbfc buttons] lastObject];
- x = NSMinX([button frame]);
- y = NSMinY([button frame]);
- CGFloat pos1 = [bbfc indicatorPosForDragOfButton:dragButton
- toPoint:NSMakePoint(x, y)];
- EXPECT_NE(button,
- [bbfc buttonForDroppingOnAtPoint:NSMakePoint(x, y)]);
- x = NSMaxX([button frame]);
- y = NSMaxY([button frame]);
- CGFloat pos2 = [bbfc indicatorPosForDragOfButton:dragButton
- toPoint:NSMakePoint(x, y)];
- EXPECT_NE(button,
- [bbfc buttonForDroppingOnAtPoint:NSMakePoint(x, y)]);
- if (dragButton != button) {
- EXPECT_NE(pos1, pos2);
- }
}
}
@@ -288,6 +307,7 @@ TEST_F(BookmarkBarFolderControllerTest, ChildFolderWidth) {
bbfc.reset(SimpleBookmarkBarFolderController());
EXPECT_TRUE(bbfc.get());
+ [bbfc showWindow:bbfc.get()];
CGFloat wideWidth = NSWidth([[bbfc window] frame]);
RemoveLongTitleNode();
@@ -300,6 +320,53 @@ TEST_F(BookmarkBarFolderControllerTest, ChildFolderWidth) {
}
+// Simple scrolling tests.
+TEST_F(BookmarkBarFolderControllerTest, SimpleScroll) {
+ scoped_nsobject<BookmarkBarFolderController> bbfc;
+
+ AddLotsOfNodes();
+ bbfc.reset(SimpleBookmarkBarFolderController());
+ EXPECT_TRUE(bbfc.get());
+ [bbfc showWindow:bbfc.get()];
+
+ // Make sure the window fits on the screen.
+ EXPECT_LT(NSHeight([[bbfc window] frame]),
+ NSHeight([[NSScreen mainScreen] frame]));
+
+ // Scroll it up. Make sure the window has gotten bigger each time.
+ // Also, for each scroll, make sure our hit test finds a new button
+ // (to confirm the content area changed).
+ NSView* savedHit = nil;
+ for (int i=0; i<3; i++) {
+ CGFloat height = NSHeight([[bbfc window] frame]);
+ [bbfc performOneScroll:60];
+ EXPECT_GT(NSHeight([[bbfc window] frame]), height);
+ NSView* hit = [[[bbfc window] contentView] hitTest:NSMakePoint(10, 10)];
+ EXPECT_NE(hit, savedHit);
+ savedHit = hit;
+ }
+
+ // Keep scrolling up; make sure we never get bigger than the screen.
+ // Also confirm we never scroll the window off the screen.
+ NSRect screenFrame = [[NSScreen mainScreen] frame];
+ for (int i=0; i<100; i++) {
+ [bbfc performOneScroll:60];
+ EXPECT_TRUE(NSContainsRect(screenFrame,
+ [[bbfc window] frame]));
+ }
+
+ // Now scroll down and make sure the window size does not change.
+ // Also confirm we never scroll the window off the screen the other
+ // way.
+ for (int i=0; i<200; i++) {
+ CGFloat height = NSHeight([[bbfc window] frame]);
+ [bbfc performOneScroll:-60];
+ EXPECT_EQ(height, NSHeight([[bbfc window] frame]));
+ EXPECT_TRUE(NSContainsRect(screenFrame,
+ [[bbfc window] frame]));
+ }
+}
+
// TODO(jrg): draggingEntered: and draggingExited: trigger timers so
// they are hard to test. Factor out "fire timers" into routines
diff --git a/chrome/browser/cocoa/bookmark_bar_folder_view.mm b/chrome/browser/cocoa/bookmark_bar_folder_view.mm
index cbbd5a2..d712944 100644
--- a/chrome/browser/cocoa/bookmark_bar_folder_view.mm
+++ b/chrome/browser/cocoa/bookmark_bar_folder_view.mm
@@ -3,7 +3,6 @@
// found in the LICENSE file.
#import "chrome/browser/cocoa/bookmark_bar_folder_view.h"
-
#import "chrome/browser/cocoa/bookmark_bar_controller.h"
@implementation BookmarkBarFolderView
@@ -23,6 +22,7 @@
}
- (void)drawRect:(NSRect)rect {
+
// TODO(jrg): copied from bookmark_bar_view but orientation changed.
// Code dup sucks but I'm not sure I can take 16 lines and make it
// generic for horiz vs vertical while keeping things simple.
diff --git a/chrome/browser/cocoa/bookmark_bar_folder_window.h b/chrome/browser/cocoa/bookmark_bar_folder_window.h
index 41019b7..8f96d27 100644
--- a/chrome/browser/cocoa/bookmark_bar_folder_window.h
+++ b/chrome/browser/cocoa/bookmark_bar_folder_window.h
@@ -13,4 +13,10 @@
@interface BookmarkBarFolderWindow : NSWindow
@end
+
+// Content view for the above window. "Stock" other than the drawing
+// of rounded corners. Only used in the nib.
+@interface BookmarkBarFolderWindowContentView : NSView
+@end
+
#endif // CHROME_BROWSER_COCOA_BOOKMARK_BAR_FOLDER_WINDOW_H_
diff --git a/chrome/browser/cocoa/bookmark_bar_folder_window.mm b/chrome/browser/cocoa/bookmark_bar_folder_window.mm
index f911777..6cae7c5 100644
--- a/chrome/browser/cocoa/bookmark_bar_folder_window.mm
+++ b/chrome/browser/cocoa/bookmark_bar_folder_window.mm
@@ -4,16 +4,71 @@
#import "chrome/browser/cocoa/bookmark_bar_folder_window.h"
+#import "base/scoped_nsobject.h"
+#import "third_party/GTM/AppKit/GTMNSColor+Luminance.h"
+#import "third_party/GTM/AppKit/GTMNSBezierPath+RoundRect.h"
+
+
@implementation BookmarkBarFolderWindow
- (id)initWithContentRect:(NSRect)contentRect
styleMask:(NSUInteger)windowStyle
backing:(NSBackingStoreType)bufferingType
defer:(BOOL)deferCreation {
- return [super initWithContentRect:contentRect
- styleMask:NSBorderlessWindowMask // override
- backing:bufferingType
- defer:deferCreation];
+ if ((self = [super initWithContentRect:contentRect
+ styleMask:NSBorderlessWindowMask // override
+ backing:bufferingType
+ defer:deferCreation])) {
+ [self setBackgroundColor:[NSColor clearColor]];
+ [self setOpaque:NO];
+ }
+ return self;
+}
+
+@end
+
+
+namespace {
+// Corner radius for our bookmark bar folder window.
+// Copied from bubble_view.mm.
+const CGFloat kViewCornerRadius = 4.0;
+}
+
+@implementation BookmarkBarFolderWindowContentView
+
+- (void)drawRect:(NSRect)rect {
+ NSRect bounds = [self bounds];
+ // Like NSMenus, only the bottom corners are rounded.
+ NSBezierPath* bezier =
+ [NSBezierPath gtm_bezierPathWithRoundRect:bounds
+ topLeftCornerRadius:0
+ topRightCornerRadius:0
+ bottomLeftCornerRadius:kViewCornerRadius
+ bottomRightCornerRadius:kViewCornerRadius];
+ [bezier closePath];
+
+ // TODO(jrg): share code with info_bubble_view.mm? Or bubble_view.mm?
+ NSColor* base_color = [NSColor colorWithCalibratedWhite:0.5 alpha:1.0];
+ NSColor* startColor =
+ [base_color gtm_colorAdjustedFor:GTMColorationLightHighlight
+ faded:YES];
+ NSColor* midColor =
+ [base_color gtm_colorAdjustedFor:GTMColorationLightMidtone
+ faded:YES];
+ NSColor* endColor =
+ [base_color gtm_colorAdjustedFor:GTMColorationLightShadow
+ faded:YES];
+ NSColor* glowColor =
+ [base_color gtm_colorAdjustedFor:GTMColorationLightPenumbra
+ faded:YES];
+
+ scoped_nsobject<NSGradient> gradient(
+ [[NSGradient alloc] initWithColorsAndLocations:startColor, 0.0,
+ midColor, 0.25,
+ endColor, 0.5,
+ glowColor, 0.75,
+ nil]);
+ [gradient drawInBezierPath:bezier angle:0.0];
}
@end
diff --git a/chrome/browser/cocoa/bookmark_bar_folder_window_unittest.mm b/chrome/browser/cocoa/bookmark_bar_folder_window_unittest.mm
index f86d6d4..586417e 100644
--- a/chrome/browser/cocoa/bookmark_bar_folder_window_unittest.mm
+++ b/chrome/browser/cocoa/bookmark_bar_folder_window_unittest.mm
@@ -20,3 +20,15 @@ TEST_F(BookmarkBarFolderWindowTest, Borderless) {
defer:NO]);
EXPECT_EQ(NSBorderlessWindowMask, [window_ styleMask]);
}
+
+class BookmarkBarFolderWindowContentViewTest : public CocoaTest {
+ public:
+ BookmarkBarFolderWindowContentViewTest() {
+ view_.reset([[BookmarkBarFolderWindowContentView alloc]
+ initWithFrame:NSMakeRect(0, 0, 100, 100)]);
+ [[test_window() contentView] addSubview:view_.get()];
+ }
+ scoped_nsobject<BookmarkBarFolderWindowContentView> view_;
+};
+
+TEST_VIEW(BookmarkBarFolderWindowContentViewTest, view_);
diff --git a/chrome/browser/cocoa/bookmark_button.h b/chrome/browser/cocoa/bookmark_button.h
index 39970ff..cb62053 100644
--- a/chrome/browser/cocoa/bookmark_button.h
+++ b/chrome/browser/cocoa/bookmark_button.h
@@ -96,9 +96,6 @@ class ThemeProvider;
- (CGFloat)indicatorPosForDragOfButton:(BookmarkButton*)sourceButton
toPoint:(NSPoint)point;
-// Return the parent window for all BookmarkBarFolderController windows.
-- (NSWindow*)parentWindow;
-
// Return the theme provider associated with this browser window.
- (ThemeProvider*)themeProvider;