summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrohitrao@chromium.org <rohitrao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-17 20:37:15 +0000
committerrohitrao@chromium.org <rohitrao@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-17 20:37:15 +0000
commit37e1a5735690ed7e4daa1b8c65d6d66185097ac3 (patch)
treec4bd6807aece8219d22354b324fb3e2bb024f174
parent48a98b382c7dd08e15aa794dad2eb28dcc75a8d8 (diff)
downloadchromium_src-37e1a5735690ed7e4daa1b8c65d6d66185097ac3.zip
chromium_src-37e1a5735690ed7e4daa1b8c65d6d66185097ac3.tar.gz
chromium_src-37e1a5735690ed7e4daa1b8c65d6d66185097ac3.tar.bz2
[Mac] Refactor the DevToolsController and SidebarController to create their views directly. Remove references to the devtools and sidebar NSSplitViews from TabWindowController.
This also fixes the issue where the findbar and resize widget would disappear. For some reason, the NSSplitViews were indicating that they were opaque when instantiated in the xib files, but this does not happen when they are created programmatically. Xib changes: - BrowserWindow.xib no longer contains the two NSSplitViews. BUG=55228,55441 TEST=All unittest should pass. TEST=Findbar and resize widget should not disappear when scrolling. Review URL: http://codereview.chromium.org/3436009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@59841 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/app/nibs/BrowserWindow.xib56
-rw-r--r--chrome/browser/cocoa/browser_window_controller.h6
-rw-r--r--chrome/browser/cocoa/browser_window_controller.mm76
-rw-r--r--chrome/browser/cocoa/browser_window_controller_private.mm4
-rw-r--r--chrome/browser/cocoa/browser_window_controller_unittest.mm22
-rw-r--r--chrome/browser/cocoa/dev_tools_controller.h23
-rw-r--r--chrome/browser/cocoa/dev_tools_controller.mm54
-rw-r--r--chrome/browser/cocoa/sidebar_controller.h24
-rw-r--r--chrome/browser/cocoa/sidebar_controller.mm60
-rw-r--r--chrome/browser/cocoa/tab_window_controller.h4
-rw-r--r--chrome/browser/cocoa/tab_window_controller.mm2
11 files changed, 152 insertions, 179 deletions
diff --git a/chrome/app/nibs/BrowserWindow.xib b/chrome/app/nibs/BrowserWindow.xib
index 022c2b2..2e3a414 100644
--- a/chrome/app/nibs/BrowserWindow.xib
+++ b/chrome/app/nibs/BrowserWindow.xib
@@ -56,27 +56,6 @@
<object class="NSCustomView" id="1858870">
<reference key="NSNextResponder" ref="1006"/>
<int key="NSvFlags">274</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSSplitView" id="321204824">
- <reference key="NSNextResponder" ref="1858870"/>
- <int key="NSvFlags">274</int>
- <object class="NSMutableArray" key="NSSubviews">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <object class="NSSplitView" id="267972061">
- <reference key="NSNextResponder" ref="321204824"/>
- <int key="NSvFlags">268</int>
- <string key="NSFrameSize">{750, 600}</string>
- <reference key="NSSuperview" ref="321204824"/>
- <bool key="NSIsVertical">YES</bool>
- <int key="NSDividerStyle">2</int>
- </object>
- </object>
- <string key="NSFrameSize">{750, 600}</string>
- <reference key="NSSuperview" ref="1858870"/>
- <int key="NSDividerStyle">2</int>
- </object>
- </object>
<string key="NSFrameSize">{750, 600}</string>
<reference key="NSSuperview" ref="1006"/>
<string key="NSClassName">FastResizeView</string>
@@ -180,22 +159,6 @@
</object>
<int key="connectionID">90</int>
</object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">devToolsContainer_</string>
- <reference key="source" ref="1001"/>
- <reference key="destination" ref="321204824"/>
- </object>
- <int key="connectionID">94</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBOutletConnection" key="connection">
- <string key="label">contentsContainer_</string>
- <reference key="source" ref="1001"/>
- <reference key="destination" ref="267972061"/>
- </object>
- <int key="connectionID">98</int>
- </object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@@ -277,24 +240,9 @@
<reference key="object" ref="1858870"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="321204824"/>
</object>
<reference key="parent" ref="1006"/>
</object>
- <object class="IBObjectRecord">
- <int key="objectID">91</int>
- <reference key="object" ref="321204824"/>
- <object class="NSMutableArray" key="children">
- <bool key="EncodedWithXMLCoder">YES</bool>
- <reference ref="267972061"/>
- </object>
- <reference key="parent" ref="1858870"/>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">95</int>
- <reference key="object" ref="267972061"/>
- <reference key="parent" ref="321204824"/>
- </object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@@ -325,8 +273,6 @@
<string>84.IBPluginDependency</string>
<string>89.IBEditorWindowLastContentRect</string>
<string>89.IBPluginDependency</string>
- <string>91.IBPluginDependency</string>
- <string>95.IBPluginDependency</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -357,8 +303,6 @@
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>{{89, 611}, {236, 393}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
- <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
</object>
</object>
<object class="NSMutableDictionary" key="unlocalizedProperties">
diff --git a/chrome/browser/cocoa/browser_window_controller.h b/chrome/browser/cocoa/browser_window_controller.h
index c90de7a..6869397 100644
--- a/chrome/browser/cocoa/browser_window_controller.h
+++ b/chrome/browser/cocoa/browser_window_controller.h
@@ -17,9 +17,7 @@
#include "base/scoped_ptr.h"
#import "chrome/browser/cocoa/bookmark_bar_controller.h"
#import "chrome/browser/cocoa/bookmark_bubble_controller.h"
-#import "chrome/browser/cocoa/dev_tools_controller.h"
#import "chrome/browser/cocoa/browser_command_executor.h"
-#import "chrome/browser/cocoa/sidebar_controller.h"
#import "chrome/browser/cocoa/tab_strip_controller.h"
#import "chrome/browser/cocoa/tab_window_controller.h"
#import "chrome/browser/cocoa/themed_window.h"
@@ -32,6 +30,7 @@ class Browser;
class BrowserWindow;
class BrowserWindowCocoa;
class ConstrainedWindowMac;
+@class DevToolsController;
@class DownloadShelfController;
@class FindBarCocoaController;
@class FullscreenController;
@@ -39,6 +38,7 @@ class ConstrainedWindowMac;
@class IncognitoImageView;
@class InfoBarContainerController;
class LocationBarViewMac;
+@class SidebarController;
class StatusBubbleMac;
class TabContents;
@class TabStripController;
@@ -51,8 +51,6 @@ class TabContents;
BookmarkBarControllerDelegate,
BrowserCommandExecutor,
ViewResizer,
- DevToolsControllerDelegate,
- SidebarControllerDelegate,
TabStripControllerDelegate> {
@private
// The ordering of these members is important as it determines the order in
diff --git a/chrome/browser/cocoa/browser_window_controller.mm b/chrome/browser/cocoa/browser_window_controller.mm
index e2743c8..899eecd 100644
--- a/chrome/browser/cocoa/browser_window_controller.mm
+++ b/chrome/browser/cocoa/browser_window_controller.mm
@@ -22,6 +22,7 @@
#import "chrome/browser/cocoa/bookmark_editor_controller.h"
#import "chrome/browser/cocoa/browser_window_cocoa.h"
#import "chrome/browser/cocoa/browser_window_controller_private.h"
+#import "chrome/browser/cocoa/dev_tools_controller.h"
#import "chrome/browser/cocoa/download_shelf_controller.h"
#import "chrome/browser/cocoa/event_utils.h"
#import "chrome/browser/cocoa/fast_resize_view.h"
@@ -33,6 +34,7 @@
#import "chrome/browser/cocoa/infobar_container_controller.h"
#import "chrome/browser/cocoa/location_bar/autocomplete_text_field_editor.h"
#import "chrome/browser/cocoa/sad_tab_controller.h"
+#import "chrome/browser/cocoa/sidebar_controller.h"
#import "chrome/browser/cocoa/status_bubble_mac.h"
#import "chrome/browser/cocoa/tab_contents_controller.h"
#import "chrome/browser/cocoa/tab_strip_controller.h"
@@ -231,6 +233,20 @@
// Puts the incognito badge on the window frame, if necessary.
[self installIncognitoBadge];
+ // Create a sub-controller for the docked devTools and add its view to the
+ // hierarchy. This must happen before the sidebar controller is
+ // instantiated.
+ devToolsController_.reset([[DevToolsController alloc] init]);
+ [[devToolsController_ view] setFrame:[[self tabContentArea] bounds]];
+ [[self tabContentArea] addSubview:[devToolsController_ view]];
+
+ // Create a sub-controller for the docked sidebar and add its view to the
+ // hierarchy. This must happen before the tabstrip controller is
+ // instantiated.
+ sidebarController_.reset([[SidebarController alloc] init]);
+ [[sidebarController_ view] setFrame:[[devToolsController_ view] bounds]];
+ [[devToolsController_ view] addSubview:[sidebarController_ view]];
+
// Create a controller for the tab strip, giving it the model object for
// this window's Browser and the tab strip view. The controller will handle
// registering for the appropriate tab notifications from the back-end and
@@ -274,16 +290,6 @@
relativeTo:[toolbarController_ view]];
[bookmarkBarController_ setBookmarkBarEnabled:[self supportsBookmarkBar]];
- // Create a sub-controller for the docked devTools.
- devToolsController_.reset(
- [[DevToolsController alloc] initWithView:[self devToolsContainer]
- delegate:self]);
-
- // Create a sub-controller for the docked devTools.
- sidebarController_.reset(
- [[SidebarController alloc] initWithView:[self contentsContainer]
- delegate:self]);
-
// We don't want to try and show the bar before it gets placed in its parent
// view, so this step shoudn't be inside the bookmark bar controller's
// |-awakeFromNib|.
@@ -1011,10 +1017,10 @@
// TODO(alekseys): status bubble should respect web view bounds, not just its
// vertical size. Now it can overlap sidebar contents. http://crbug.com/54882
- (CGFloat)verticalOffsetForStatusBubble {
- NSRect contents_bounds = [[self contentsContainer] bounds];
+ NSRect contents_bounds = [[sidebarController_ view] bounds];
NSView* baseView = [[self window] contentView];
return NSMinY([baseView convertRect:contents_bounds
- fromView:[self contentsContainer]]);
+ fromView:[sidebarController_ view]]);
}
- (GTMWindowSheetController*)sheetController {
@@ -1338,52 +1344,6 @@
return [self supportsWindowFeature:Browser::FEATURE_TABSTRIP];
}
-// DevToolsController protocol.
-- (void)resizeDevToolsToNewHeight:(CGFloat)height {
- NSSplitView* container = [self devToolsContainer];
- NSArray* subviews = [container subviews];
-
- // It seems as if |-setPosition:ofDividerAtIndex:| should do what's needed,
- // but I can't figure out how to use it. Manually resize web and devtools.
- // TODO(alekseys): either make setPosition:ofDividerAtIndex: work or to add a
- // category on NSSplitView to handle manual resizing.
- NSView* devToolsView = [subviews objectAtIndex:1];
- NSRect devToolsFrame = [devToolsView frame];
- devToolsFrame.size.height = height;
- [devToolsView setFrame:devToolsFrame];
-
- NSView* webView = [subviews objectAtIndex:0];
- NSRect webFrame = [webView frame];
- webFrame.size.height =
- NSHeight([container frame]) - ([container dividerThickness] + height);
- [webView setFrame:webFrame];
-
- [container adjustSubviews];
-}
-
-// SidebarController protocol.
-- (void)resizeSidebarToNewWidth:(CGFloat)width {
- NSSplitView* container = [self contentsContainer];
- NSArray* subviews = [container subviews];
-
- // It seems as if |-setPosition:ofDividerAtIndex:| should do what's needed,
- // but I can't figure out how to use it. Manually resize web and sidebar.
- // TODO(alekseys): either make setPosition:ofDividerAtIndex: work or to add a
- // category on NSSplitView to handle manual resizing.
- NSView* sidebarView = [subviews objectAtIndex:1];
- NSRect sidebarFrame = [sidebarView frame];
- sidebarFrame.size.width = width;
- [sidebarView setFrame:sidebarFrame];
-
- NSView* webView = [subviews objectAtIndex:0];
- NSRect webFrame = [webView frame];
- webFrame.size.width =
- NSWidth([container frame]) - ([container dividerThickness] + width);
- [webView setFrame:webFrame];
-
- [container adjustSubviews];
-}
-
// TabStripControllerDelegate protocol.
- (void)onSelectTabWithContents:(TabContents*)contents {
// Update various elements that are interested in knowing the current
diff --git a/chrome/browser/cocoa/browser_window_controller_private.mm b/chrome/browser/cocoa/browser_window_controller_private.mm
index 1fbd31e..cc3e726 100644
--- a/chrome/browser/cocoa/browser_window_controller_private.mm
+++ b/chrome/browser/cocoa/browser_window_controller_private.mm
@@ -50,9 +50,11 @@ const CGFloat kLocBarBottomInset = 1;
if ([self useVerticalTabs])
factory = [SideTabStripController class];
+ DCHECK([sidebarController_ view]);
+ DCHECK([[sidebarController_ view] window]);
tabStripController_.reset([[factory alloc]
initWithView:[self tabStripView]
- switchView:[self contentsContainer]
+ switchView:[sidebarController_ view]
browser:browser_.get()
delegate:self]);
}
diff --git a/chrome/browser/cocoa/browser_window_controller_unittest.mm b/chrome/browser/cocoa/browser_window_controller_unittest.mm
index 1597e69..2550f44 100644
--- a/chrome/browser/cocoa/browser_window_controller_unittest.mm
+++ b/chrome/browser/cocoa/browser_window_controller_unittest.mm
@@ -50,6 +50,14 @@
return [findBarCocoaController_ view];
}
+- (NSView*)devToolsView {
+ return [devToolsController_ view];
+}
+
+- (NSView*)sidebarView {
+ return [sidebarController_ view];
+}
+
- (BOOL)bookmarkBarVisible {
return [bookmarkBarController_ isVisible];
}
@@ -548,6 +556,20 @@ TEST_F(BrowserWindowControllerTest, TestFindBarOnTop) {
EXPECT_GT(findBar_index, bookmark_index);
}
+// Tests that the sidebar view and devtools view are both non-opaque.
+TEST_F(BrowserWindowControllerTest, TestSplitViewsAreNotOpaque) {
+ // Add a subview to the sidebar view to mimic what happens when a tab is added
+ // to the window. NSSplitView only marks itself as non-opaque when one of its
+ // subviews is non-opaque, so the test will not pass without this subview.
+ scoped_nsobject<NSView> view(
+ [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 10, 10)]);
+ [[controller_ sidebarView] addSubview:view];
+
+ EXPECT_FALSE([[controller_ tabContentArea] isOpaque]);
+ EXPECT_FALSE([[controller_ devToolsView] isOpaque]);
+ EXPECT_FALSE([[controller_ sidebarView] isOpaque]);
+}
+
@interface BrowserWindowControllerFakeFullscreen : BrowserWindowController {
@private
// We release the window ourselves, so we don't have to rely on the unittest
diff --git a/chrome/browser/cocoa/dev_tools_controller.h b/chrome/browser/cocoa/dev_tools_controller.h
index 1d6254e5..774d799 100644
--- a/chrome/browser/cocoa/dev_tools_controller.h
+++ b/chrome/browser/cocoa/dev_tools_controller.h
@@ -15,28 +15,23 @@
class TabContents;
-// DevTools controller's delegate interface. Delegate is responsible
-// for the actual subviews resize and layout.
-@protocol DevToolsControllerDelegate
-
-// Resizes the devTools view to the new |height| and adjusts window layout
-// accordingly.
-- (void)resizeDevToolsToNewHeight:(CGFloat)height;
-
-@end
-
// A class that handles updates of the devTools view within a browser window.
// It swaps in the relevant devTools contents for a given TabContents or removes
// the vew, if there's no devTools contents to show.
@interface DevToolsController : NSObject {
@private
// A view hosting docked devTools contents.
- scoped_nsobject<NSSplitView> devToolsView_;
- id<DevToolsControllerDelegate> delegate_; // weak
+ scoped_nsobject<NSSplitView> splitView_;
}
-- (id)initWithView:(NSSplitView*)devToolsView
- delegate:(id<DevToolsControllerDelegate>)delegate;
+- (id)init;
+
+// This controller's view.
+- (NSView*)view;
+
+// The compiler seems to have trouble handling a function named "view" that
+// returns an NSSplitView, so provide a differently-named method.
+- (NSSplitView*)splitView;
// Depending on |contents|'s state, decides whether the docked web inspector
// should be shown or hidden and adjusts its height (|delegate_| handles
diff --git a/chrome/browser/cocoa/dev_tools_controller.mm b/chrome/browser/cocoa/dev_tools_controller.mm
index 1a7e3b6..3dee715 100644
--- a/chrome/browser/cocoa/dev_tools_controller.mm
+++ b/chrome/browser/cocoa/dev_tools_controller.mm
@@ -30,21 +30,30 @@ const int kMinWebHeight = 50;
@interface DevToolsController (Private)
- (void)showDevToolsContents:(TabContents*)devToolsContents;
+- (void)resizeDevToolsToNewHeight:(CGFloat)height;
@end
@implementation DevToolsController
-- (id)initWithView:(NSSplitView*)devToolsView
- delegate:(id<DevToolsControllerDelegate>)delegate {
- DCHECK(delegate);
+- (id)init {
if ((self = [super init])) {
- devToolsView_.reset([devToolsView retain]);
- delegate_ = delegate;
+ splitView_.reset([[NSSplitView alloc] initWithFrame:NSZeroRect]);
+ [splitView_ setDividerStyle:NSSplitViewDividerStyleThin];
+ [splitView_ setVertical:NO];
+ [splitView_ setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
}
return self;
}
+- (NSView*)view {
+ return splitView_.get();
+}
+
+- (NSSplitView*)splitView {
+ return splitView_.get();
+}
+
- (void)updateDevToolsForTabContents:(TabContents*)contents {
// Get current devtools content.
TabContents* devToolsContents = contents ?
@@ -54,7 +63,7 @@ const int kMinWebHeight = 50;
}
- (void)showDevToolsContents:(TabContents*)devToolsContents {
- NSArray* subviews = [devToolsView_ subviews];
+ NSArray* subviews = [splitView_ subviews];
if (devToolsContents) {
DCHECK_GE([subviews count], 1u);
@@ -73,23 +82,23 @@ const int kMinWebHeight = 50;
// Initial load, set to default value.
splitOffset = kDefaultContentsSplitOffset;
}
- [devToolsView_ addSubview:devToolsView];
+ [splitView_ addSubview:devToolsView];
} else {
DCHECK_EQ([subviews count], 2u);
// If devtools are already visible, keep the current size.
splitOffset = NSHeight([devToolsView frame]);
- [devToolsView_ replaceSubview:[subviews objectAtIndex:1]
- with:devToolsView];
+ [splitView_ replaceSubview:[subviews objectAtIndex:1]
+ with:devToolsView];
}
// Make sure |splitOffset| isn't too large or too small.
splitOffset =
- std::min(splitOffset, NSHeight([devToolsView_ frame]) - kMinWebHeight);
+ std::min(splitOffset, NSHeight([splitView_ frame]) - kMinWebHeight);
DCHECK_GE(splitOffset, 0) << "kMinWebHeight needs to be smaller than "
<< "smallest available tab contents space.";
splitOffset = std::max(static_cast<CGFloat>(0), splitOffset);
- [delegate_ resizeDevToolsToNewHeight:splitOffset];
+ [self resizeDevToolsToNewHeight:splitOffset];
} else {
if ([subviews count] > 1) {
NSView* oldDevToolsContentsView = [subviews objectAtIndex:1];
@@ -102,4 +111,27 @@ const int kMinWebHeight = 50;
}
}
+- (void)resizeDevToolsToNewHeight:(CGFloat)height {
+ NSArray* subviews = [splitView_ subviews];
+
+ // It seems as if |-setPosition:ofDividerAtIndex:| should do what's needed,
+ // but I can't figure out how to use it. Manually resize web and devtools.
+ // TODO(alekseys): either make setPosition:ofDividerAtIndex: work or to add a
+ // category on NSSplitView to handle manual resizing.
+ NSView* devToolsView = [subviews objectAtIndex:1];
+ NSRect devToolsFrame = [devToolsView frame];
+ devToolsFrame.size.height = height;
+ [devToolsView setFrame:devToolsFrame];
+
+ NSView* webView = [subviews objectAtIndex:0];
+ NSRect webFrame = [webView frame];
+ webFrame.size.height =
+ NSHeight([splitView_ frame]) - ([splitView_ dividerThickness] + height);
+ [webView setFrame:webFrame];
+
+ [splitView_ adjustSubviews];
+}
+
+
+
@end
diff --git a/chrome/browser/cocoa/sidebar_controller.h b/chrome/browser/cocoa/sidebar_controller.h
index c6bdfc6..f3c4a30 100644
--- a/chrome/browser/cocoa/sidebar_controller.h
+++ b/chrome/browser/cocoa/sidebar_controller.h
@@ -15,30 +15,26 @@
class TabContents;
-// Sidebar controller's delegate interface. Delegate is responsible
-// for the actual subviews resize and layout.
-@protocol SidebarControllerDelegate
-
-// Resizes the sidebar view to the new |width| and adjusts window layout
-// accordingly.
-- (void)resizeSidebarToNewWidth:(CGFloat)width;
-
-@end
-
// A class that handles updates of the sidebar view within a browser window.
// It swaps in the relevant sidebar contents for a given TabContents or removes
// the vew, if there's no sidebar contents to show.
@interface SidebarController : NSObject {
@private
// A view hosting sidebar contents.
- scoped_nsobject<NSSplitView> sidebarView_;
- id<SidebarControllerDelegate> delegate_; // weak
+ scoped_nsobject<NSSplitView> splitView_;
+
// Currently displayed sidebar contents.
TabContents* sidebarContents_; // weak.
}
-- (id)initWithView:(NSSplitView*)sidebarView
- delegate:(id<SidebarControllerDelegate>)delegate;
+- (id)init;
+
+// This controller's view.
+- (NSSplitView*)view;
+
+// The compiler seems to have trouble handling a function named "view" that
+// returns an NSSplitView, so provide a differently-named method.
+- (NSSplitView*)splitView;
// Depending on |contents|'s state, decides whether the sidebar
// should be shown or hidden and adjusts its width (|delegate_| handles
diff --git a/chrome/browser/cocoa/sidebar_controller.mm b/chrome/browser/cocoa/sidebar_controller.mm
index 9b879d6..c5a0081 100644
--- a/chrome/browser/cocoa/sidebar_controller.mm
+++ b/chrome/browser/cocoa/sidebar_controller.mm
@@ -30,28 +30,37 @@ const int kMinWebWidth = 50;
@interface SidebarController (Private)
- (void)showSidebarContents:(TabContents*)sidebarContents;
+- (void)resizeSidebarToNewWidth:(CGFloat)width;
@end
@implementation SidebarController
-- (id)initWithView:(NSSplitView*)sidebarView
- delegate:(id<SidebarControllerDelegate>)delegate {
- DCHECK(delegate);
+- (id)init {
if ((self = [super init])) {
- sidebarView_.reset([sidebarView retain]);
- [sidebarView_ setDelegate:self];
- delegate_ = delegate;
+ splitView_.reset([[NSSplitView alloc] initWithFrame:NSZeroRect]);
+ [splitView_ setDividerStyle:NSSplitViewDividerStyleThin];
+ [splitView_ setVertical:YES];
+ [splitView_ setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
+ [splitView_ setDelegate:self];
sidebarContents_ = NULL;
}
return self;
}
- (void)dealloc {
- [sidebarView_ setDelegate:nil];
+ [splitView_ setDelegate:nil];
[super dealloc];
}
+- (NSView*)view {
+ return splitView_.get();
+}
+
+- (NSSplitView*)splitView {
+ return splitView_.get();
+}
+
- (void)updateSidebarForTabContents:(TabContents*)contents {
// Get the active sidebar content.
if (SidebarManager::GetInstance() == NULL) // Happens in tests.
@@ -79,7 +88,7 @@ const int kMinWebWidth = 50;
}
- (void)showSidebarContents:(TabContents*)sidebarContents {
- NSArray* subviews = [sidebarView_ subviews];
+ NSArray* subviews = [splitView_ subviews];
if (sidebarContents) {
DCHECK_GE([subviews count], 1u);
@@ -97,24 +106,24 @@ const int kMinWebWidth = 50;
if (sidebarWidth < 0) {
// Initial load, set to default value.
sidebarWidth =
- NSWidth([sidebarView_ frame]) * kDefaultSidebarWidthRatio;
+ NSWidth([splitView_ frame]) * kDefaultSidebarWidthRatio;
}
- [sidebarView_ addSubview:sidebarView];
+ [splitView_ addSubview:sidebarView];
} else {
DCHECK_EQ([subviews count], 2u);
sidebarWidth = NSWidth([[subviews objectAtIndex:1] frame]);
- [sidebarView_ replaceSubview:[subviews objectAtIndex:1]
- with:sidebarView];
+ [splitView_ replaceSubview:[subviews objectAtIndex:1]
+ with:sidebarView];
}
// Make sure |sidebarWidth| isn't too large or too small.
sidebarWidth = std::min(sidebarWidth,
- NSWidth([sidebarView_ frame]) - kMinWebWidth);
+ NSWidth([splitView_ frame]) - kMinWebWidth);
DCHECK_GE(sidebarWidth, 0) << "kMinWebWidth needs to be smaller than "
<< "smallest available tab contents space.";
sidebarWidth = std::max(static_cast<CGFloat>(0), sidebarWidth);
- [delegate_ resizeSidebarToNewWidth:sidebarWidth];
+ [self resizeSidebarToNewWidth:sidebarWidth];
} else {
if ([subviews count] > 1) {
NSView* oldSidebarContentsView = [subviews objectAtIndex:1];
@@ -127,12 +136,33 @@ const int kMinWebWidth = 50;
}
}
+- (void)resizeSidebarToNewWidth:(CGFloat)width {
+ NSArray* subviews = [splitView_ subviews];
+
+ // It seems as if |-setPosition:ofDividerAtIndex:| should do what's needed,
+ // but I can't figure out how to use it. Manually resize web and sidebar.
+ // TODO(alekseys): either make setPosition:ofDividerAtIndex: work or to add a
+ // category on NSSplitView to handle manual resizing.
+ NSView* sidebarView = [subviews objectAtIndex:1];
+ NSRect sidebarFrame = [sidebarView frame];
+ sidebarFrame.size.width = width;
+ [sidebarView setFrame:sidebarFrame];
+
+ NSView* webView = [subviews objectAtIndex:0];
+ NSRect webFrame = [webView frame];
+ webFrame.size.width =
+ NSWidth([splitView_ frame]) - ([splitView_ dividerThickness] + width);
+ [webView setFrame:webFrame];
+
+ [splitView_ adjustSubviews];
+}
+
// NSSplitViewDelegate protocol.
- (BOOL)splitView:(NSSplitView *)splitView
shouldAdjustSizeOfSubview:(NSView *)subview {
// Return NO for the sidebar view to indicate that it should not be resized
// automatically. The sidebar keeps the width set by the user.
- if ([[sidebarView_ subviews] indexOfObject:subview] == 1)
+ if ([[splitView_ subviews] indexOfObject:subview] == 1)
return NO;
return YES;
}
diff --git a/chrome/browser/cocoa/tab_window_controller.h b/chrome/browser/cocoa/tab_window_controller.h
index 9d97fe1..ad0d5b7 100644
--- a/chrome/browser/cocoa/tab_window_controller.h
+++ b/chrome/browser/cocoa/tab_window_controller.h
@@ -39,8 +39,6 @@
@interface TabWindowController : NSWindowController<NSWindowDelegate> {
@private
IBOutlet FastResizeView* tabContentArea_;
- IBOutlet NSSplitView* contentsContainer_;
- IBOutlet NSSplitView* devToolsContainer_;
// TODO(pinkerton): Figure out a better way to initialize one or the other
// w/out needing both to be in the nib.
IBOutlet TabStripView* topTabStripView_;
@@ -59,8 +57,6 @@
}
@property(readonly, nonatomic) TabStripView* tabStripView;
@property(readonly, nonatomic) FastResizeView* tabContentArea;
-@property(readonly, nonatomic) NSSplitView* contentsContainer;
-@property(readonly, nonatomic) NSSplitView* devToolsContainer;
// Used during tab dragging to turn on/off the overlay window when a tab
// is torn off. If -deferPerformClose (below) is used, -removeOverlay will
diff --git a/chrome/browser/cocoa/tab_window_controller.mm b/chrome/browser/cocoa/tab_window_controller.mm
index f9e390b..4e886eb 100644
--- a/chrome/browser/cocoa/tab_window_controller.mm
+++ b/chrome/browser/cocoa/tab_window_controller.mm
@@ -41,8 +41,6 @@
@implementation TabWindowController
@synthesize tabContentArea = tabContentArea_;
-@synthesize contentsContainer = contentsContainer_;
-@synthesize devToolsContainer = devToolsContainer_;
- (id)initWithWindow:(NSWindow*)window {
if ((self = [super initWithWindow:window]) != nil) {