summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsnej@chromium.org <snej@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-08 21:38:24 +0000
committersnej@chromium.org <snej@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-08 21:38:24 +0000
commit09d8e8d350fa13b4fdefb5afeaca006539c3c48c (patch)
treebc988f73992652a6d7446acfc3c116e7cad48fe7
parent74ba5a8c95518465ee8b054044f6efc219f1727e (diff)
downloadchromium_src-09d8e8d350fa13b4fdefb5afeaca006539c3c48c.zip
chromium_src-09d8e8d350fa13b4fdefb5afeaca006539c3c48c.tar.gz
chromium_src-09d8e8d350fa13b4fdefb5afeaca006539c3c48c.tar.bz2
Bookmark Manager key-equivalent improvements
The changes to the xib are: 1. Autosave splitter position 2. Disable empty-selection in left table view, so it comes up with the first row (bookmarks bar) selected 3. Wire up each table view as the other's nextKeyView. 4. Wire up right outline view as window's initialFirstResponder. BUG=31844 TEST=none Review URL: http://codereview.chromium.org/518089 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@35826 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/app/nibs/BookmarkManager.xib101
-rw-r--r--chrome/browser/cocoa/bookmark_groups_controller.mm60
-rw-r--r--chrome/browser/cocoa/bookmark_groups_controller_unittest.mm39
-rw-r--r--chrome/browser/cocoa/bookmark_tree_controller.mm34
4 files changed, 209 insertions, 25 deletions
diff --git a/chrome/app/nibs/BookmarkManager.xib b/chrome/app/nibs/BookmarkManager.xib
index 63f72bd..7a77cf3 100644
--- a/chrome/app/nibs/BookmarkManager.xib
+++ b/chrome/app/nibs/BookmarkManager.xib
@@ -8,8 +8,8 @@
<string key="IBDocument.HIToolboxVersion">353.00</string>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
- <integer value="1" id="9"/>
<integer value="7"/>
+ <integer value="11"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -262,6 +262,73 @@ cHlyaWdodCBBcHBsZSwgSW5jLiwgMjAxMAA</bytes>
</object>
</object>
</object>
+ <object class="NSArray">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="8"/>
+ <object class="NSBitmapImageRep">
+ <object class="NSData" key="NSTIFFRepresentation">
+ <bytes key="NS.bytes">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
+cHlyaWdodCBBcHBsZSwgSW5jLiwgMjAxMAA</bytes>
+ </object>
+ </object>
+ </object>
</object>
<object class="NSColor" key="NSColor">
<int key="NSColorSpace">3</int>
@@ -473,6 +540,7 @@ cHlyaWdodCBBcHBsZSwgSW5jLiwgMjAxMAA</bytes>
</object>
<int key="NSResizingMask">1</int>
<bool key="NSIsResizeable">YES</bool>
+ <bool key="NSIsEditable">YES</bool>
<reference key="NSTableView" ref="580246752"/>
</object>
</object>
@@ -497,7 +565,7 @@ cHlyaWdodCBBcHBsZSwgSW5jLiwgMjAxMAA</bytes>
</object>
</object>
<double key="NSRowHeight">1.600000e+01</double>
- <int key="NSTvFlags">-767557632</int>
+ <int key="NSTvFlags">37748736</int>
<int key="NSColumnAutoresizingStyle">4</int>
<int key="NSDraggingSourceMaskForLocal">15</int>
<int key="NSDraggingSourceMaskForNonLocal">0</int>
@@ -705,6 +773,7 @@ cHlyaWdodCBBcHBsZSwgSW5jLiwgMjAxMAA</bytes>
<reference key="NSSuperview" ref="775220953"/>
<bool key="NSIsVertical">YES</bool>
<int key="NSDividerStyle">2</int>
+ <string key="NSAutosaveName">BookmarkManager</string>
</object>
</object>
<string key="NSFrameSize">{689, 592}</string>
@@ -781,7 +850,7 @@ cHlyaWdodCBBcHBsZSwgSW5jLiwgMjAxMAA</bytes>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>cancel</string>
- <reference ref="9"/>
+ <integer value="1"/>
</object>
</object>
</object>
@@ -954,6 +1023,30 @@ cHlyaWdodCBBcHBsZSwgSW5jLiwgMjAxMAA</bytes>
</object>
<int key="connectionID">62</int>
</object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">nextKeyView</string>
+ <reference key="source" ref="580246752"/>
+ <reference key="destination" ref="105944579"/>
+ </object>
+ <int key="connectionID">63</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">nextKeyView</string>
+ <reference key="source" ref="105944579"/>
+ <reference key="destination" ref="580246752"/>
+ </object>
+ <int key="connectionID">64</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">initialFirstResponder</string>
+ <reference key="source" ref="801612057"/>
+ <reference key="destination" ref="105944579"/>
+ </object>
+ <int key="connectionID">65</int>
+ </object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@@ -1323,7 +1416,7 @@ cHlyaWdodCBBcHBsZSwgSW5jLiwgMjAxMAA</bytes>
</object>
</object>
<nil key="sourceID"/>
- <int key="maxID">62</int>
+ <int key="maxID">65</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
diff --git a/chrome/browser/cocoa/bookmark_groups_controller.mm b/chrome/browser/cocoa/bookmark_groups_controller.mm
index e6b14f3..1d3fb4a 100644
--- a/chrome/browser/cocoa/bookmark_groups_controller.mm
+++ b/chrome/browser/cocoa/bookmark_groups_controller.mm
@@ -119,6 +119,24 @@
[manager_ bookmarkModel]->Remove(parent, parent->IndexOfChild(sel));
}
+- (IBAction)editTitle:(id)sender {
+ if ([groupsTable_ numberOfSelectedRows] != 1) {
+ NSBeep();
+ return;
+ }
+ int row = [groupsTable_ selectedRow];
+ if (![self tableView:groupsTable_
+ shouldEditTableColumn:[[groupsTable_ tableColumns] objectAtIndex:0]
+ row:row]) {
+ NSBeep();
+ return;
+ }
+ [groupsTable_ editColumn:0
+ row:row
+ withEvent:[NSApp currentEvent]
+ select:YES];
+}
+
#pragma mark -
#pragma mark LIST VIEW:
@@ -137,6 +155,25 @@
return base::SysWideToNSString([manager_ nodeFromItem:item]->GetTitle());
}
+- (void)tableView:(NSTableView*)tableView
+ setObjectValue:(id)value
+ forTableColumn:(NSTableColumn*)tableColumn
+ row:(NSInteger)row {
+
+ id item = [groups_ objectAtIndex:row];
+ const BookmarkNode* node = [manager_ nodeFromItem:item];
+ [manager_ bookmarkModel]->SetTitle(node, base::SysNSStringToWide(value));
+}
+
+- (BOOL) tableView:(NSTableView*)tableView
+ shouldEditTableColumn:(NSTableColumn*)tableColumn
+ row:(NSInteger)row {
+ id item = [groups_ objectAtIndex:row];
+ const BookmarkNode* node = [manager_ nodeFromItem:item];
+ // Prevent rename of top-level nodes like 'bookmarks bar'.
+ return node->GetParent() && node->GetParent()->GetParent();
+}
+
// Sets a table cell's icon before it's drawn (NSTableView delegate).
- (void)tableView:(NSTableView*)tableView
willDisplayCell:(id)cell
@@ -156,10 +193,25 @@
}
- (void)keyDown:(NSEvent*)event {
- if ([event keyCode] == 51) // Delete key
- [self delete:self];
- else
- [super keyDown:event];
+ NSString* chars = [event charactersIgnoringModifiers];
+ if ([chars length] == 1) {
+ switch ([chars characterAtIndex:0]) {
+ case NSDeleteCharacter:
+ case NSDeleteFunctionKey:
+ [self delete:self];
+ return;
+ case NSCarriageReturnCharacter:
+ case NSEnterCharacter:
+ [(BookmarkGroupsController*)[self delegate] editTitle:self];
+ return;
+ case NSTabCharacter:
+ // For some reason NSTableView responds to the tab key by editing
+ // the selected row. Override this with the normal behavior.
+ [[self window] selectNextKeyView:self];
+ return;
+ }
+ }
+ [super keyDown:event];
}
@end
diff --git a/chrome/browser/cocoa/bookmark_groups_controller_unittest.mm b/chrome/browser/cocoa/bookmark_groups_controller_unittest.mm
index 60427ee..03e27a5 100644
--- a/chrome/browser/cocoa/bookmark_groups_controller_unittest.mm
+++ b/chrome/browser/cocoa/bookmark_groups_controller_unittest.mm
@@ -18,6 +18,8 @@ class BookmarkGroupsControllerTest : public CocoaTest {
CocoaTest::SetUp();
manager_ = [BookmarkManagerController showBookmarkManager:
browser_test_helper_.profile()];
+ model_ = [manager_ bookmarkModel];
+ ASSERT_TRUE(model_);
ASSERT_TRUE(manager_);
controller_ = [manager_ groupsController];
ASSERT_TRUE(controller_);
@@ -31,21 +33,21 @@ class BookmarkGroupsControllerTest : public CocoaTest {
BrowserTestHelper browser_test_helper_;
BookmarkManagerController* manager_;
BookmarkGroupsController* controller_;
+ BookmarkModel* model_;
};
TEST_F(BookmarkGroupsControllerTest, Model) {
- NSArray *groups = [controller_ groups];
+ NSArray* groups = [controller_ groups];
ASSERT_TRUE(groups);
// TODO(snej): Update this next assertion after I add Search and Recents.
ASSERT_EQ(1U, [groups count]);
id barItem = [groups objectAtIndex:0];
- BookmarkModel* model = [manager_ bookmarkModel];
- const BookmarkNode* barNode = model->GetBookmarkBarNode();
+ const BookmarkNode* barNode = model_->GetBookmarkBarNode();
EXPECT_EQ(barNode, [manager_ nodeFromItem:barItem]);
// Now add an item to Others:
- const BookmarkNode* otherNode = model->other_node();
- const BookmarkNode* wowbagger = model->AddGroup(otherNode, 0, L"Wowbagger");
+ const BookmarkNode* otherNode = model_->other_node();
+ const BookmarkNode* wowbagger = model_->AddGroup(otherNode, 0, L"Wowbagger");
groups = [controller_ groups];
ASSERT_TRUE(groups);
@@ -54,7 +56,7 @@ TEST_F(BookmarkGroupsControllerTest, Model) {
EXPECT_EQ(wowbagger, [manager_ nodeFromItem:wowbaggerItem]);
// Now remove it:
- model->Remove(otherNode, 0);
+ model_->Remove(otherNode, 0);
groups = [controller_ groups];
ASSERT_TRUE(groups);
@@ -63,16 +65,27 @@ TEST_F(BookmarkGroupsControllerTest, Model) {
}
TEST_F(BookmarkGroupsControllerTest, Selection) {
- // Select nothing:
+ // Check bookmarks bar is selected by default:
+ id bookmarksBar = [[controller_ groups] objectAtIndex:0];
ASSERT_TRUE([controller_ groupsTable]);
- [controller_ setSelectedGroup:nil];
- EXPECT_EQ(nil, [controller_ selectedGroup]);
- EXPECT_EQ(-1, [[controller_ groupsTable] selectedRow]);
+ EXPECT_EQ(0, [[controller_ groupsTable] selectedRow]);
+ EXPECT_EQ(bookmarksBar, [controller_ selectedGroup]);
+
+ // Now add an item to Others:
+ const BookmarkNode* otherNode = model_->other_node();
+ const BookmarkNode* wowbagger = model_->AddGroup(otherNode, 0, L"Wowbagger");
+ ASSERT_TRUE(wowbagger);
+ id wowbaggerItem = [manager_ itemFromNode:wowbagger];
+ ASSERT_TRUE(wowbaggerItem);
+
+ // Select it:
+ [controller_ setSelectedGroup:wowbaggerItem];
+ EXPECT_EQ(wowbaggerItem, [controller_ selectedGroup]);
+ EXPECT_EQ(1, [[controller_ groupsTable] selectedRow]);
// Select bookmarks bar:
- id sel = [[controller_ groups] objectAtIndex:0];
- [controller_ setSelectedGroup:sel];
- EXPECT_EQ(sel, [controller_ selectedGroup]);
+ [controller_ setSelectedGroup:bookmarksBar];
+ EXPECT_EQ(bookmarksBar, [controller_ selectedGroup]);
EXPECT_EQ(0, [[controller_ groupsTable] selectedRow]);
}
diff --git a/chrome/browser/cocoa/bookmark_tree_controller.mm b/chrome/browser/cocoa/bookmark_tree_controller.mm
index 3de9d51..a5b8b3c 100644
--- a/chrome/browser/cocoa/bookmark_tree_controller.mm
+++ b/chrome/browser/cocoa/bookmark_tree_controller.mm
@@ -112,6 +112,17 @@
[outline_ deselectAll:self];
}
+- (IBAction)editTitle:(id)sender {
+ if ([outline_ numberOfSelectedRows] != 1) {
+ NSBeep();
+ return;
+ }
+ [outline_ editColumn:[outline_ columnWithIdentifier:@"title"]
+ row:[outline_ selectedRow]
+ withEvent:[NSApp currentEvent]
+ select:YES];
+}
+
#pragma mark -
#pragma mark DATA SOURCE:
@@ -244,10 +255,25 @@
}
- (void)keyDown:(NSEvent*)event {
- if ([event keyCode] == 51) // Delete key
- [self delete:self];
- else
- [super keyDown:event];
+ NSString* chars = [event charactersIgnoringModifiers];
+ if ([chars length] == 1) {
+ switch ([chars characterAtIndex:0]) {
+ case NSDeleteCharacter:
+ case NSDeleteFunctionKey:
+ [self delete:self];
+ return;
+ case NSCarriageReturnCharacter:
+ case NSEnterCharacter:
+ [(BookmarkTreeController*)[self delegate] editTitle:self];
+ return;
+ case NSTabCharacter:
+ // For some reason NSTableView responds to the tab key by editing
+ // the selected row. Override this with the normal behavior.
+ [[self window] selectNextKeyView:self];
+ return;
+ }
+ }
+ [super keyDown:event];
}
@end