summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-04 18:35:35 +0000
committerthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-04 18:35:35 +0000
commit88e8e752268e85da7196e5dbd8c622a7b0565e19 (patch)
tree2c2e58276f73624e037442c322245bdf01797aaf /chrome/browser
parent22a4e5fc5a599598c90b32341edaeb417c7ba3cc (diff)
downloadchromium_src-88e8e752268e85da7196e5dbd8c622a7b0565e19.zip
chromium_src-88e8e752268e85da7196e5dbd8c622a7b0565e19.tar.gz
chromium_src-88e8e752268e85da7196e5dbd8c622a7b0565e19.tar.bz2
Mac: Change content settings from showing tabs on top to showing a list on the side.
xib changes: * Set NSTabView's style to "Tabless" (but kept panes in an NSTabView, since it's a convenient method to handle multiple overlapping views in IB) * Put NSTabView into a split view, put a table view in the other split pane of the split view, gave it class TabViewSwitcherTable * changed autosize flags of all child views of the tab view items * Made the NSTabView the tabView_ of the table view BUG=45546 TEST=Content settings window should still work. If it's opened through an omnibox bubble, the right section should still be autoselected. Review URL: http://codereview.chromium.org/2534001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@48956 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/cocoa/content_settings_dialog_controller.mm9
-rw-r--r--chrome/browser/cocoa/tab_view_picker_table.h20
-rw-r--r--chrome/browser/cocoa/tab_view_picker_table.mm98
-rw-r--r--chrome/browser/cocoa/tab_view_picker_table_unittest.mm115
4 files changed, 241 insertions, 1 deletions
diff --git a/chrome/browser/cocoa/content_settings_dialog_controller.mm b/chrome/browser/cocoa/content_settings_dialog_controller.mm
index fcca282..3f792e3c 100644
--- a/chrome/browser/cocoa/content_settings_dialog_controller.mm
+++ b/chrome/browser/cocoa/content_settings_dialog_controller.mm
@@ -44,13 +44,20 @@ const NSInteger kGeolocationAskIndex = 1;
const NSInteger kGeolocationDisabledIndex = 2;
// Walks views in top-down order, wraps each to their current width, and moves
-// the latter ones down to prevernt overlaps.
+// the latter ones down to prevent overlaps.
CGFloat VerticallyReflowGroup(NSArray* views) {
views = [views sortedArrayUsingFunction:cocoa_l10n_util::CompareFrameY
context:NULL];
CGFloat localVerticalShift = 0;
for (NSInteger index = [views count] - 1; index >= 0; --index) {
NSView* view = [views objectAtIndex:index];
+
+ // Since the tab pane is in a horizontal resizer in IB, it's convenient
+ // to give all the subviews flexible width so that their sizes are
+ // autoupdated in IB. However, in chrome, the subviews shouldn't have
+ // flexible widths as this looks weird.
+ [view setAutoresizingMask:NSViewMaxXMargin | NSViewMinYMargin];
+
NSSize delta = cocoa_l10n_util::WrapOrSizeToFit(view);
localVerticalShift += delta.height;
if (localVerticalShift) {
diff --git a/chrome/browser/cocoa/tab_view_picker_table.h b/chrome/browser/cocoa/tab_view_picker_table.h
new file mode 100644
index 0000000..4255fec4
--- /dev/null
+++ b/chrome/browser/cocoa/tab_view_picker_table.h
@@ -0,0 +1,20 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <Cocoa/Cocoa.h>
+
+// TabViewPickerTable is an NSTableView that can be used to switch between the
+// NSTabViewItems of an NSTabView. To use this, just create a
+// TabViewPickerTable in Interface Builder and connect the |tabView_| outlet
+// to an NSTabView. Now the table is automatically populated with the tab labels
+// of the tab view, clicking the table updates the tab view, and switching
+// tab view items updates the selection of the table.
+@interface TabViewPickerTable : NSTableView {
+ @public
+ IBOutlet NSTabView* tabView_; // Visible for testing.
+
+ @private
+ id oldTabViewDelegate_;
+}
+@end
diff --git a/chrome/browser/cocoa/tab_view_picker_table.mm b/chrome/browser/cocoa/tab_view_picker_table.mm
new file mode 100644
index 0000000..e982d92
--- /dev/null
+++ b/chrome/browser/cocoa/tab_view_picker_table.mm
@@ -0,0 +1,98 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "tab_view_picker_table.h"
+
+#include "base/logging.h"
+
+@implementation TabViewPickerTable
+
+- (id)initWithFrame:(NSRect)frame {
+ if ((self = [super initWithFrame:frame])) {
+ [self setDelegate:self];
+ [self setDataSource:self];
+ }
+ return self;
+}
+
+- (id)initWithCoder:(NSCoder*)coder {
+ if ((self = [super initWithCoder:coder])) {
+ [self setDelegate:self];
+ [self setDataSource:self];
+ }
+ return self;
+}
+
+- (void)awakeFromNib {
+ DCHECK(tabView_);
+ DCHECK_EQ([self delegate], self);
+ DCHECK_EQ([self dataSource], self);
+ DCHECK(![self allowsEmptySelection]);
+ DCHECK(![self allowsMultipleSelection]);
+
+ // Suppress the "Selection changed" message that's sent while the table is
+ // being built for the first time (this causes a selection change to index 0
+ // and back to the prior index).
+ id oldTabViewDelegate = [tabView_ delegate];
+ [tabView_ setDelegate:nil];
+
+ NSInteger index =
+ [tabView_ indexOfTabViewItem:[tabView_ selectedTabViewItem]];
+ [self reloadData];
+ [self selectRowIndexes:[NSIndexSet indexSetWithIndex:index]
+ byExtendingSelection:NO];
+
+ oldTabViewDelegate_ = oldTabViewDelegate;
+ [tabView_ setDelegate:self];
+}
+
+// Table view delegate method.
+- (void)tableViewSelectionDidChange:(NSNotification*)aNotification {
+ [tabView_ selectTabViewItemAtIndex:[self selectedRow]];
+}
+
+// Table view data source methods.
+- (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView {
+ return [tabView_ numberOfTabViewItems];
+}
+
+- (id) tableView:(NSTableView*)tableView
+ objectValueForTableColumn:(NSTableColumn*)tableColumn
+ row:(NSInteger)rowIndex {
+ return [[tabView_ tabViewItemAtIndex:rowIndex] label];
+}
+
+// NSTabViewDelegate methods.
+- (void) tabView:(NSTabView*)tabView
+ didSelectTabViewItem:(NSTabViewItem*)tabViewItem {
+ DCHECK_EQ(tabView_, tabView);
+ NSInteger index =
+ [tabView_ indexOfTabViewItem:[tabView_ selectedTabViewItem]];
+ [self selectRowIndexes:[NSIndexSet indexSetWithIndex:index]
+ byExtendingSelection:NO];
+ if ([oldTabViewDelegate_
+ respondsToSelector:@selector(tabView:didSelectTabViewItem:)]) {
+ [oldTabViewDelegate_ tabView:tabView didSelectTabViewItem:tabViewItem];
+ }
+}
+
+- (BOOL) tabView:(NSTabView*)tabView
+ shouldSelectTabViewItem:(NSTabViewItem*)tabViewItem {
+ if ([oldTabViewDelegate_
+ respondsToSelector:@selector(tabView:shouldSelectTabViewItem:)]) {
+ return [oldTabViewDelegate_ tabView:tabView
+ shouldSelectTabViewItem:tabViewItem];
+ }
+ return YES;
+}
+
+- (void) tabView:(NSTabView*)tabView
+ willSelectTabViewItem:(NSTabViewItem*)tabViewItem {
+ if ([oldTabViewDelegate_
+ respondsToSelector:@selector(tabView:willSelectTabViewItem:)]) {
+ [oldTabViewDelegate_ tabView:tabView willSelectTabViewItem:tabViewItem];
+ }
+}
+
+@end
diff --git a/chrome/browser/cocoa/tab_view_picker_table_unittest.mm b/chrome/browser/cocoa/tab_view_picker_table_unittest.mm
new file mode 100644
index 0000000..25d249f
--- /dev/null
+++ b/chrome/browser/cocoa/tab_view_picker_table_unittest.mm
@@ -0,0 +1,115 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <Cocoa/Cocoa.h>
+
+#import "chrome/browser/cocoa/tab_view_picker_table.h"
+
+#include "base/scoped_nsobject.h"
+#import "chrome/browser/cocoa/cocoa_test_helper.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/platform_test.h"
+
+@interface TabViewPickerTableTestPing : NSObject {
+ @public
+ BOOL didSelectItemCalled_;
+}
+@end
+
+@implementation TabViewPickerTableTestPing
+- (void) tabView:(NSTabView*)tabView
+ didSelectTabViewItem:(NSTabViewItem*)tabViewItem {
+ didSelectItemCalled_ = YES;
+}
+@end
+
+namespace {
+
+class TabViewPickerTableTest : public CocoaTest {
+ public:
+ TabViewPickerTableTest() {
+ // Initialize picker table.
+ NSRect frame = NSMakeRect(0, 0, 30, 50);
+ scoped_nsobject<TabViewPickerTable> view(
+ [[TabViewPickerTable alloc] initWithFrame:frame]);
+ view_ = view.get();
+ [view_ setAllowsEmptySelection:NO];
+ [view_ setAllowsMultipleSelection:NO];
+ [view_ addTableColumn:[[NSTableColumn alloc] initWithIdentifier:nil]];
+ [[test_window() contentView] addSubview:view_];
+
+ // Initialize source tab view, with delegate.
+ frame = NSMakeRect(30, 0, 50, 50);
+ scoped_nsobject<NSTabView> tabView(
+ [[NSTabView alloc] initWithFrame:frame]);
+ tabView_ = tabView.get();
+
+ scoped_nsobject<NSTabViewItem> item1(
+ [[NSTabViewItem alloc] initWithIdentifier:nil]);
+ [item1 setLabel:@"label 1"];
+ [tabView_ addTabViewItem:item1];
+
+ scoped_nsobject<NSTabViewItem> item2(
+ [[NSTabViewItem alloc] initWithIdentifier:nil]);
+ [item2 setLabel:@"label 2"];
+ [tabView_ addTabViewItem:item2];
+
+ [tabView_ selectTabViewItemAtIndex:1];
+ [[test_window() contentView] addSubview:tabView_];
+
+ ping_.reset([TabViewPickerTableTestPing new]);
+ [tabView_ setDelegate:ping_.get()];
+
+ // Simulate nib loading.
+ view_->tabView_ = tabView_;
+ [view_ awakeFromNib];
+ }
+
+ TabViewPickerTable* view_;
+ NSTabView* tabView_;
+ scoped_nsobject<TabViewPickerTableTestPing> ping_;
+};
+
+TEST_VIEW(TabViewPickerTableTest, view_)
+
+TEST_F(TabViewPickerTableTest, TestInitialSelectionCorrect) {
+ EXPECT_EQ(1, [view_ selectedRow]);
+}
+
+TEST_F(TabViewPickerTableTest, TestSelectionUpdates) {
+ [tabView_ selectTabViewItemAtIndex:0];
+ EXPECT_EQ(0, [view_ selectedRow]);
+
+ [tabView_ selectTabViewItemAtIndex:1];
+ EXPECT_EQ(1, [view_ selectedRow]);
+}
+
+TEST_F(TabViewPickerTableTest, TestDelegateStillWorks) {
+ EXPECT_FALSE(ping_.get()->didSelectItemCalled_);
+ [tabView_ selectTabViewItemAtIndex:0];
+ EXPECT_TRUE(ping_.get()->didSelectItemCalled_);
+}
+
+TEST_F(TabViewPickerTableTest, RowsCorrect) {
+ EXPECT_EQ(2, [view_ numberOfRows]);
+ EXPECT_EQ(2, [[view_ dataSource] numberOfRowsInTableView:view_]);
+
+ EXPECT_TRUE([@"label 1" isEqualToString:[[view_ dataSource]
+ tableView:view_
+ objectValueForTableColumn:nil // ignored
+ row:0]]);
+ EXPECT_TRUE([@"label 2" isEqualToString:[[view_ dataSource]
+ tableView:view_
+ objectValueForTableColumn:nil // ignored
+ row:1]]);
+}
+
+TEST_F(TabViewPickerTableTest, TestListUpdatesTabView) {
+ [view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:0]
+ byExtendingSelection:NO];
+ EXPECT_EQ(0, [view_ selectedRow]); // sanity
+ EXPECT_EQ(0, [tabView_ indexOfTabViewItem:[tabView_ selectedTabViewItem]]);
+}
+
+} // namespace