diff options
author | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-04 18:35:35 +0000 |
---|---|---|
committer | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-04 18:35:35 +0000 |
commit | 88e8e752268e85da7196e5dbd8c622a7b0565e19 (patch) | |
tree | 2c2e58276f73624e037442c322245bdf01797aaf /chrome/browser | |
parent | 22a4e5fc5a599598c90b32341edaeb417c7ba3cc (diff) | |
download | chromium_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.mm | 9 | ||||
-rw-r--r-- | chrome/browser/cocoa/tab_view_picker_table.h | 20 | ||||
-rw-r--r-- | chrome/browser/cocoa/tab_view_picker_table.mm | 98 | ||||
-rw-r--r-- | chrome/browser/cocoa/tab_view_picker_table_unittest.mm | 115 |
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 |