summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa
diff options
context:
space:
mode:
authorviettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-23 17:46:40 +0000
committerviettrungluu@chromium.org <viettrungluu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-23 17:46:40 +0000
commit47e532b88cbf3acdeacd49f5cdcd69dbabd7ae68 (patch)
tree885bb92e7265623f904443620b3dd779a0060199 /chrome/browser/cocoa
parentd4b3a6f00112079f966830cf0f2f3c34a156c10e (diff)
downloadchromium_src-47e532b88cbf3acdeacd49f5cdcd69dbabd7ae68.zip
chromium_src-47e532b88cbf3acdeacd49f5cdcd69dbabd7ae68.tar.gz
chromium_src-47e532b88cbf3acdeacd49f5cdcd69dbabd7ae68.tar.bz2
Delete native Mac bookmark manager. Remove --disable-tabbed-bookmark-manager (everywhere).
Still to do: delete native bookmark managers on other platforms. BUG=38908 TEST=Everything else still works. Review URL: http://codereview.chromium.org/1751011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@45462 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa')
-rw-r--r--chrome/browser/cocoa/bookmark_item.h104
-rw-r--r--chrome/browser/cocoa/bookmark_item.mm362
-rw-r--r--chrome/browser/cocoa/bookmark_item_unittest.mm250
-rw-r--r--chrome/browser/cocoa/bookmark_manager_controller.h78
-rw-r--r--chrome/browser/cocoa/bookmark_manager_controller.mm577
-rw-r--r--chrome/browser/cocoa/bookmark_manager_controller_unittest.mm161
-rw-r--r--chrome/browser/cocoa/bookmark_tree_controller.h109
-rw-r--r--chrome/browser/cocoa/bookmark_tree_controller.mm536
-rw-r--r--chrome/browser/cocoa/bookmark_tree_controller_pasteboard.mm426
-rw-r--r--chrome/browser/cocoa/bookmark_tree_controller_unittest.mm360
-rw-r--r--chrome/browser/cocoa/browser_window_cocoa.mm4
11 files changed, 2 insertions, 2965 deletions
diff --git a/chrome/browser/cocoa/bookmark_item.h b/chrome/browser/cocoa/bookmark_item.h
deleted file mode 100644
index 63e9097..0000000
--- a/chrome/browser/cocoa/bookmark_item.h
+++ /dev/null
@@ -1,104 +0,0 @@
-// 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>
-#include "base/scoped_nsobject.h"
-
-@class BookmarkManagerController;
-class BookmarkNode;
-
-// Cocoa object that stands in for a C++ BookmarkNode.
-@interface BookmarkItem : NSObject {
- @private
- const BookmarkNode* node_; // weak
- BookmarkManagerController* manager_; // weak
- @protected
- scoped_nsobject<NSImage> icon_;
-}
-
-- (id)initWithBookmarkNode:(const BookmarkNode*)node
- manager:(BookmarkManagerController*)manager;
-
-// The item's underlying C++ node (nil for fake items).
-@property (readonly) const BookmarkNode* node;
-// The item's title.
-@property (copy) NSString* title;
-// The item's URL as a plain string (nil for folders).
-@property (copy) NSString* URLString;
-// The item's parent in the real bookmark tree.
-@property (readonly) BookmarkItem* parent;
-// The user-visible path to the item (slash-delimited).
-@property (readonly) NSString* folderPath;
-// Is this a FakeBookmarkItem?
-@property (readonly) BOOL isFake;
-// Fixed items (Bookmarks Bar, Other, fake) cannot be renamed, moved or deleted.
-@property (readonly) BOOL isFixed;
-// The bookmark's favicon (a folder icon for folders.)
-@property (readonly) NSImage* icon;
-
-// The bookmark node's persistent ID.
-@property (readonly) id persistentID;
-// Finds a descendant with the given persistent ID.
-- (BookmarkItem*)itemWithPersistentID:(id)persistentID;
-
-// Is this item a folder/group?
-@property (readonly) BOOL isFolder;
-// The number of direct children of a folder.
-@property (readonly) NSUInteger numberOfChildren;
-// The child at a given zero-based index.
-- (BookmarkItem*)childAtIndex:(NSUInteger)index;
-// The index of a direct child, or NSNotFound.
-- (NSUInteger)indexOfChild:(BookmarkItem*)child;
-// Is the item an indirect descendant of the receiver?
-- (BOOL)hasDescendant:(BookmarkItem*)item;
-
-// The number of direct children that are themselves folders.
-@property (readonly) NSUInteger numberOfChildFolders;
-// The index'th child folder.
-- (BookmarkItem*)childFolderAtIndex:(NSUInteger)index;
-// The index, by counting child folders, of the given folder.
-- (NSUInteger)indexOfChildFolder:(BookmarkItem*)child;
-
-// Moves an existing item into this folder at the given index.
-- (void)moveItem:(BookmarkItem*)item toIndex:(int)index;
-
-// Adds a child bookmark. Receiver must be a folder.
-- (BookmarkItem*) addBookmarkWithTitle:(NSString*)title
- URL:(NSString*)urlString
- atIndex:(int)index;
-// Adds a child folder. Receiver must be a folder.
-- (BookmarkItem*) addFolderWithTitle:(NSString*)title
- atIndex:(int)index;
-// Removes a child bookmark; returns YES on success, NO on failure.
-- (BOOL) removeChild:(BookmarkItem*)child;
-
-// Open a bookmark in a tab.
-- (BOOL)open;
-
-// Called to tell the object that its underlying BookmarkNode has changed.
-- (void)nodeChanged;
-
-// The default bookmark favicon.
-+ (NSImage*)defaultIcon;
-// The default folder favicon.
-+ (NSImage*)folderIcon;
-@end
-
-
-// A subclass of BookmarkItem for folders that don't actually exist in the tree.
-@interface FakeBookmarkItem : BookmarkItem {
- NSString* title_;
- BookmarkItem* parent_;
- NSArray* children_;
-}
-
-- (id)initWithTitle:(NSString*)title
- icon:(NSImage*)icon
- manager:(BookmarkManagerController*)manager;
-
-// Parent is settable.
-@property (readwrite, assign) BookmarkItem* parent;
-// Children are settable.
-@property (readwrite, copy) NSArray* children;
-@end
diff --git a/chrome/browser/cocoa/bookmark_item.mm b/chrome/browser/cocoa/bookmark_item.mm
deleted file mode 100644
index a31e00f..0000000
--- a/chrome/browser/cocoa/bookmark_item.mm
+++ /dev/null
@@ -1,362 +0,0 @@
-// 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 "bookmark_item.h"
-
-#include "app/resource_bundle.h"
-#include "base/mac_util.h"
-#include "base/sys_string_conversions.h"
-#include "chrome/browser/bookmarks/bookmark_model.h"
-#include "chrome/browser/browser.h"
-#include "chrome/browser/browser_list.h"
-#include "chrome/browser/browser_window.h"
-#import "chrome/browser/cocoa/bookmark_manager_controller.h"
-#include "grit/app_resources.h"
-#include "grit/theme_resources.h"
-#include "skia/ext/skia_utils_mac.h"
-
-
-static GURL ConvertToGURL(NSString* urlStr) {
- DCHECK(urlStr);
- GURL url(base::SysNSStringToUTF8(urlStr));
- if (!url.is_valid()) {
- // Mimic observed friendliness from Windows
- urlStr = [@"http://" stringByAppendingString:urlStr];
- GURL fixedURL(base::SysNSStringToUTF8(urlStr));
- if (fixedURL.is_valid())
- url = fixedURL;
- }
- return url;
-}
-
-
-@implementation BookmarkItem
-
-@synthesize node = node_;
-
-- (id)initWithBookmarkNode:(const BookmarkNode*)node
- manager:(BookmarkManagerController*)manager {
- DCHECK(manager);
- self = [super init];
- if (self) {
- node_ = node;
- manager_ = manager;
- }
- return self;
-}
-
-- (NSString*)description {
- return [NSString stringWithFormat:@"%@[%@]", [self class], [self title]];
-}
-
-- (NSString*)title {
- return base::SysWideToNSString(node_->GetTitle());
-}
-
-- (void)setTitle:(NSString*)title {
- DCHECK(![self isFixed]);
- [manager_ bookmarkModel]->SetTitle(node_, base::SysNSStringToWide(title));
-}
-
-- (NSString*)URLString {
- GURL url = node_->GetURL();
- if (url.is_empty())
- return nil;
- return base::SysUTF8ToNSString(url.possibly_invalid_spec());
-}
-
-- (void)setURLString:(NSString*)urlStr {
- DCHECK(![self isFolder]);
- DCHECK(![self isFixed]);
- GURL url = ConvertToGURL(urlStr);
- if (url == node_->GetURL() || !url.is_valid())
- return;
-
- icon_.reset(nil);
- // Create a new node with the updated URL.
- BookmarkModel* model = [manager_ bookmarkModel];
- const BookmarkNode* parent = node_->GetParent();
- int index = parent->IndexOfChild(node_);
- node_ = model->AddURLWithCreationTime(parent, index, node_->GetTitle(),
- url, node_->date_added());
- // Tell the manager that the new node maps to me.
- [manager_ remapItem:self forNode:node_];
- // Remove my old node.
- model->Remove(parent, index + 1);
-}
-
-- (BookmarkItem*)parent {
- const BookmarkNode* parent = node_->GetParent();
- if (!parent || parent->IsRoot())
- return nil;
- return [manager_ itemFromNode:parent];
-}
-
-- (NSString*)folderPath {
- scoped_nsobject<NSMutableArray> path([[NSMutableArray alloc] init]);
- for (BookmarkItem* folder = [self parent]; folder; folder = [folder parent]) {
- [path insertObject:[folder title] atIndex:0];
- }
- return [path componentsJoinedByString:@"/"];
-}
-
-- (BOOL)isFolder {
- return node_->is_folder();
-}
-
-- (NSUInteger)numberOfChildren {
- return node_->GetChildCount();
-}
-
-- (BookmarkItem*)childAtIndex:(NSUInteger)index {
- return [manager_ itemFromNode:node_->GetChild(index)];
-}
-
-- (NSUInteger)indexOfChild:(BookmarkItem*)child {
- DCHECK(child);
- int index = node_->IndexOfChild([child node]);
- return index >= 0 ? index : NSNotFound;
-}
-
-- (BOOL)hasDescendant:(BookmarkItem*)item {
- while (item) {
- if (item == self)
- return YES;
- item = [item parent];
- }
- return NO;
-}
-
-- (BOOL)childAtIndexIsFolder:(NSUInteger)index {
- return node_->GetChild(index)->is_folder();
-}
-
-- (NSUInteger)numberOfChildFolders {
- int nChildren = [self numberOfChildren];
- NSUInteger nFolders = 0;
- for (int i = 0; i < nChildren; i++) {
- if ([self childAtIndexIsFolder:i])
- ++nFolders;
- }
- return nFolders;
-}
-
-- (BookmarkItem*)childFolderAtIndex:(NSUInteger)index {
- NSUInteger nChildren = [self numberOfChildren];
- for (NSUInteger i = 0; i < nChildren; i++) {
- if ([self childAtIndexIsFolder:i]) {
- if (index-- == 0)
- return [self childAtIndex:i];
- }
- }
- NOTREACHED();
- return nil;
-}
-
-- (NSUInteger)indexOfChildFolder:(BookmarkItem*)child {
- const BookmarkNode* childNode = [child node];
- DCHECK(childNode);
- NSUInteger folderIndex = 0;
- NSUInteger nChildren = [self numberOfChildren];
- for (NSUInteger i = 0; i < nChildren; i++) {
- if ([self childAtIndexIsFolder:i]) {
- if ([self childAtIndex:i] == child)
- return folderIndex;
- ++folderIndex;
- }
- }
- return NSNotFound;
-}
-
-+ (NSImage*)defaultIcon {
- static NSImage* sDefaultFavIcon = [ResourceBundle::GetSharedInstance().
- GetNSImageNamed(IDR_DEFAULT_FAVICON) retain];
- return sDefaultFavIcon;
-}
-
-+ (NSImage*)folderIcon {
- static NSImage* sFolderIcon = [ResourceBundle::GetSharedInstance().
- GetNSImageNamed(IDR_BOOKMARK_BAR_FOLDER) retain];
- return sFolderIcon;
-}
-
-- (NSImage*)icon {
- if (!icon_) {
- // Lazily load icon.
- NSImage* icon = [[self class] defaultIcon];
- if ([self isFolder]) {
- icon = [[self class] folderIcon];
- } else if (node_ && node_->is_url()) {
- const SkBitmap& skIcon = [manager_ bookmarkModel]->GetFavIcon(node_);
- if (!skIcon.isNull()) {
- icon = gfx::SkBitmapToNSImage(skIcon);
- }
- }
- icon_.reset([icon retain]);
- }
- return icon_;
-}
-
-- (id)persistentID {
- DCHECK(node_);
- return [NSNumber numberWithLongLong:node_->id()];
-}
-
-- (BookmarkItem*)itemWithPersistentID:(id)persistentID {
- if ([persistentID isKindOfClass:[NSNumber class]]) {
- int64 nodeID = [persistentID longLongValue];
- const BookmarkNode* node = [manager_ bookmarkModel]->GetNodeByID(nodeID);
- return [manager_ itemFromNode:node];
- }
- NOTREACHED();
- return nil;
-}
-
-- (BOOL)isFake {
- return NO;
-}
-
-- (BOOL)isFixed {
- BookmarkModel* model = [manager_ bookmarkModel];
- return node_ == model->GetBookmarkBarNode() || node_ == model->other_node();
-}
-
-// Open a bookmark, by having Chrome open a tab on its URL.
-- (BOOL)open {
- if (!node_ || !node_->is_url())
- return NO;
- GURL url = node_->GetURL();
- if (url.is_empty())
- return NO;
-
- Browser* browser = BrowserList::GetLastActive();
- // if no browser window exists then create one with no tabs to be filled in
- if (!browser) {
- browser = Browser::Create([manager_ profile]);
- browser->window()->Show();
- }
- browser->OpenURL(url, GURL(), NEW_FOREGROUND_TAB,
- PageTransition::AUTO_BOOKMARK);
- return YES;
-}
-
-- (void)moveItem:(BookmarkItem*)item toIndex:(int)index {
- DCHECK(![item isFixed]);
- const BookmarkNode* srcNode = [item node];
- DCHECK(srcNode);
- DCHECK(node_);
- [manager_ bookmarkModel]->Move(srcNode, node_, index);
-}
-
-- (BookmarkItem*)addBookmarkWithTitle:(NSString*)title
- URL:(NSString*)urlString
- atIndex:(int)index{
- DCHECK(title);
- DCHECK_GT([urlString length], 0U);
- DCHECK([self isFolder]);
- DCHECK(node_);
- GURL url = ConvertToGURL(urlString);
- if (!url.is_valid())
- return nil;
- BookmarkModel* model = [manager_ bookmarkModel];
- const BookmarkNode* node = model->AddURL([self node],
- index,
- base::SysNSStringToWide(title),
- url);
- return [manager_ itemFromNode:node];
-}
-
-- (BookmarkItem*)addFolderWithTitle:(NSString*)title
- atIndex:(int)index {
- DCHECK(title);
- DCHECK([self isFolder]);
- DCHECK(node_);
- BookmarkModel* model = [manager_ bookmarkModel];
- const BookmarkNode* node = model->AddGroup([self node],
- index,
- base::SysNSStringToWide(title));
- return [manager_ itemFromNode:node];
-}
-
-- (BOOL)removeChild:(BookmarkItem*)child {
- DCHECK(![child isFixed]);
- if (!node_)
- return NO;
- const BookmarkNode* childNode = [child node];
- if (!childNode)
- return NO;
- int index = node_->IndexOfChild(childNode);
- if (index < 0)
- return NO;
- [manager_ bookmarkModel]->Remove(node_, index);
- return YES;
-}
-
-- (void)nodeChanged {
- if (node_)
- icon_.reset(nil);
-}
-
-@end
-
-
-@implementation FakeBookmarkItem
-
-@synthesize title = title_, parent = parent_, children = children_;
-
-- (id)initWithTitle:(NSString*)title
- icon:(NSImage*)icon
- manager:(BookmarkManagerController*)manager {
- self = [super initWithBookmarkNode:nil manager:manager];
- if (self) {
- title_ = [title copy];
- children_ = [[NSMutableArray alloc] init];
- icon_.reset([icon retain]);
- }
- return self;
-}
-
-- (void)dealloc {
- [title_ release];
- [children_ release];
- [super dealloc];
-}
-
-- (BOOL)isFolder {
- return children_ != nil;
-}
-
-- (NSUInteger)numberOfChildren {
- return [children_ count];
-}
-
-- (BookmarkItem*)childAtIndex:(NSUInteger)index {
- return [children_ objectAtIndex:index];
-}
-
-- (NSUInteger)indexOfChild:(BookmarkItem*)child {
- return [children_ indexOfObjectIdenticalTo:child];
-}
-
-- (BOOL)childAtIndexIsFolder:(NSUInteger)index {
- return [[children_ objectAtIndex:index] isFolder];
-}
-
-- (NSString*)URLString {
- return nil;
-}
-
-- (void)setURLString:(NSString*)urlStr {
- NOTREACHED();
-}
-
-- (BOOL)isFake {
- return YES;
-}
-
-- (BOOL)isFixed {
- return YES;
-}
-
-@end
diff --git a/chrome/browser/cocoa/bookmark_item_unittest.mm b/chrome/browser/cocoa/bookmark_item_unittest.mm
deleted file mode 100644
index 64ca3c4..0000000
--- a/chrome/browser/cocoa/bookmark_item_unittest.mm
+++ /dev/null
@@ -1,250 +0,0 @@
-// 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.
-
-#include "base/scoped_nsobject.h"
-#include "base/sys_string_conversions.h"
-#import "chrome/browser/cocoa/bookmark_item.h"
-#import "chrome/browser/cocoa/bookmark_manager_controller.h"
-#include "chrome/browser/cocoa/browser_test_helper.h"
-#import "chrome/browser/cocoa/cocoa_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-namespace {
-
-::testing::AssertionResult isEqual(id expected, id actual) {
- if(expected == actual || [expected isEqual:actual])
- return ::testing::AssertionSuccess();
- else
- return ::testing::AssertionFailure()
- << "Actual value: " << base::SysNSStringToWide([actual description]);
-}
-
-class BookmarkItemTest : public CocoaTest {
- public:
- void SetUp() {
- CocoaTest::SetUp();
- manager_ = [BookmarkManagerController showBookmarkManager:
- browser_test_helper_.profile()];
- ASSERT_TRUE(manager_);
- model_ = [manager_ bookmarkModel];
- ASSERT_TRUE(model_);
- EXPECT_EQ(browser_test_helper_.profile()->GetBookmarkModel(), model_);
- barNode_ = model_->GetBookmarkBarNode();
- ASSERT_TRUE(barNode_);
- bar_ = [manager_ itemFromNode:barNode_];
- ASSERT_TRUE(bar_);
- }
-
- void AddTestBookmarks() {
- model_->AddURL(barNode_, 0, L"bookmark0", GURL("http://example.com/0"));
- model_->AddURL(barNode_, 1, L"bookmark1", GURL("http://example.com/1"));
- model_->AddURL(barNode_, 2, L"bookmark3", GURL("http://example.com/3"));
- const BookmarkNode* folder = model_->AddGroup(barNode_, 2, L"group");
- ASSERT_TRUE(folder);
- model_->AddURL(folder, 0, L"nested0", GURL("http://example.com/n0"));
- model_->AddURL(folder, 1, L"nested1", GURL("http://example.com/n1"));
- }
-
- void TearDown() {
- [manager_ close];
- CocoaTest::TearDown();
- }
-
- BrowserTestHelper browser_test_helper_;
- BookmarkManagerController* manager_;
- BookmarkModel* model_;
- const BookmarkNode* barNode_;
- const BookmarkItem* bar_;
-};
-
-TEST_F(BookmarkItemTest, RootItems) {
- // Check the bookmarks-bar item:
- EXPECT_EQ(barNode_, [bar_ node]);
- EXPECT_EQ(bar_, [manager_ itemFromNode:barNode_]);
- EXPECT_EQ(bar_, [manager_ bookmarkBarItem]);
- EXPECT_TRUE([bar_ isFixed]);
- EXPECT_FALSE([bar_ isFake]);
- EXPECT_FALSE([bar_ parent]);
- EXPECT_TRUE([bar_ isFolder]);
- EXPECT_EQ(0U, [bar_ numberOfChildren]);
-
- // Check the 'others' item:
- const BookmarkNode* otherNode = model_->other_node();
- ASSERT_TRUE(otherNode);
- EXPECT_NE(barNode_, otherNode);
- BookmarkItem* other = [manager_ itemFromNode:otherNode];
- ASSERT_TRUE(other);
- EXPECT_EQ(otherNode, [other node]);
- EXPECT_EQ(other, [manager_ itemFromNode:otherNode]);
- EXPECT_EQ(other, [manager_ otherBookmarksItem]);
- EXPECT_TRUE([other isFixed]);
- EXPECT_FALSE([other isFake]);
- EXPECT_FALSE([other parent]);
- EXPECT_TRUE([other isFolder]);
- EXPECT_EQ(0U, [other numberOfChildren]);
-
- EXPECT_NE(bar_, other);
- EXPECT_FALSE(isEqual(bar_, other));
-}
-
-TEST_F(BookmarkItemTest, FakeItems) {
- NSImage* icon = [NSImage imageNamed:@"NSApplicationIcon"];
- EXPECT_TRUE(icon);
- FakeBookmarkItem* fake = [[FakeBookmarkItem alloc] initWithTitle:@"Fakir"
- icon:icon
- manager:manager_];
- [fake setChildren:nil];
- [fake autorelease];
- EXPECT_TRUE(isEqual(@"Fakir", [fake title]));
- EXPECT_EQ(icon, [fake icon]);
- EXPECT_TRUE([fake isFake]);
- EXPECT_TRUE([fake isFixed]);
- EXPECT_FALSE([fake parent]);
- EXPECT_FALSE([fake isFolder]);
-
- NSArray* children = [NSArray arrayWithObject:bar_];
- FakeBookmarkItem* bogus = [[FakeBookmarkItem alloc] initWithTitle:@"Bogus"
- icon:nil
- manager:manager_];
- [bogus setChildren:children];
- [bogus autorelease];
- EXPECT_EQ([BookmarkItem folderIcon], [bogus icon]);
- EXPECT_TRUE([bogus isFolder]);
- EXPECT_TRUE(isEqual(children, [bogus children]));
- ASSERT_EQ(1U, [bogus numberOfChildren]);
- EXPECT_EQ(bar_, [bogus childAtIndex:0]);
-
- BookmarkItem* otherItem = [manager_ itemFromNode:model_->other_node()];
- children = [NSArray arrayWithObjects:bar_, otherItem, nil];
- [bogus setChildren:children];
- EXPECT_TRUE([bogus isFolder]);
- EXPECT_TRUE(isEqual(children, [bogus children]));
- EXPECT_EQ(2U, [bogus numberOfChildren]);
- EXPECT_EQ(bar_, [bogus childAtIndex:0]);
- EXPECT_EQ(otherItem, [bogus childAtIndex:1]);
-}
-
-TEST_F(BookmarkItemTest, AddItems) {
- BookmarkItem* item1 = [bar_ addBookmarkWithTitle:@"item1"
- URL:@"http://example.com/item1"
- atIndex:0];
- EXPECT_TRUE(isEqual(@"item1", [item1 title]));
- EXPECT_TRUE(isEqual(@"http://example.com/item1", [item1 URLString]));
- EXPECT_TRUE([item1 icon]);
- EXPECT_FALSE([item1 isFixed]);
- EXPECT_FALSE([item1 isFolder]);
- EXPECT_EQ(bar_, [item1 parent]);
- EXPECT_EQ(item1, [bar_ childAtIndex:0]);
-
- BookmarkItem* folder = [bar_ addFolderWithTitle:@"folder"
- atIndex:1];
- EXPECT_TRUE(isEqual(@"folder", [folder title]));
- EXPECT_FALSE([folder URLString]);
- EXPECT_EQ([BookmarkItem folderIcon], [folder icon]);
- EXPECT_FALSE([folder isFixed]);
- EXPECT_TRUE([folder isFolder]);
- ASSERT_EQ(0U, [folder numberOfChildren]);
- EXPECT_EQ(bar_, [folder parent]);
- EXPECT_EQ(folder, [bar_ childAtIndex:1]);
-
- BookmarkItem* item2 = [folder addBookmarkWithTitle:@"item2"
- URL:@"http://example.com/item2"
- atIndex:0];
- EXPECT_TRUE(isEqual(@"item2", [item2 title]));
- EXPECT_TRUE(isEqual(@"http://example.com/item2", [item2 URLString]));
- EXPECT_TRUE([item2 icon]);
- EXPECT_FALSE([item2 isFixed]);
- EXPECT_FALSE([item2 isFolder]);
- EXPECT_EQ(folder, [item2 parent]);
- EXPECT_EQ(item2, [folder childAtIndex:0]);
- EXPECT_EQ(0U, [folder indexOfChild:item2]);
-}
-
-TEST_F(BookmarkItemTest, URLEditing) {
- BookmarkItem* item = [bar_ addBookmarkWithTitle:@"URL"
- URL:@"http://www.google.com/"
- atIndex:0];
- EXPECT_TRUE(item);
- EXPECT_TRUE([@"http://www.google.com/" isEqual:[item URLString]]);
- [item setURLString: @"http://www.google.com/chrome"];
- EXPECT_TRUE([@"http://www.google.com/chrome" isEqual:[item URLString]]);
-}
-
-TEST_F(BookmarkItemTest, URLConversion) {
- BookmarkItem* item = [bar_ addBookmarkWithTitle:@"fixable URL"
- URL:@"www.google.com"
- atIndex:0];
- EXPECT_TRUE(item);
- EXPECT_TRUE([@"http://www.google.com/" isEqual:[item URLString]]);
-
- item = [bar_ addBookmarkWithTitle:@"bad URL"
- URL:@"!$%@djd ^%QQQ"
- atIndex:0];
- EXPECT_FALSE(item);
-}
-
-TEST_F(BookmarkItemTest, Hierarchy) {
- AddTestBookmarks();
- ASSERT_EQ(4U, [bar_ numberOfChildren]);
- NSString* barTitle = [bar_ title];
-
- // Check the bookmarks added to the bar.
- BookmarkItem* item = [bar_ childAtIndex:0];
- EXPECT_TRUE(isEqual(@"bookmark0", [item title]));
- EXPECT_TRUE(isEqual(@"http://example.com/0", [item URLString]));
- EXPECT_FALSE([item isFixed]);
- EXPECT_FALSE([item isFake]);
- EXPECT_EQ(bar_, [item parent]);
- EXPECT_FALSE([item isFolder]);
- EXPECT_TRUE(isEqual(barTitle, [item folderPath]));
-
- item = [bar_ childAtIndex:1];
- EXPECT_TRUE(isEqual(@"bookmark1", [item title]));
- EXPECT_TRUE(isEqual(@"http://example.com/1", [item URLString]));
- EXPECT_FALSE([item isFixed]);
- EXPECT_FALSE([item isFake]);
- EXPECT_EQ(bar_, [item parent]);
- EXPECT_FALSE([item isFolder]);
-
- item = [bar_ childAtIndex:3];
- EXPECT_TRUE(isEqual(@"bookmark3", [item title]));
- EXPECT_TRUE(isEqual(@"http://example.com/3", [item URLString]));
- EXPECT_FALSE([item isFixed]);
- EXPECT_FALSE([item isFake]);
- EXPECT_EQ(bar_, [item parent]);
- EXPECT_FALSE([item isFolder]);
-
- // Check the subfolder.
- BookmarkItem* folder = [bar_ childAtIndex:2];
- EXPECT_TRUE(isEqual(@"group", [folder title]));
- EXPECT_EQ(0U, [[folder URLString] length]);
- EXPECT_FALSE([item isFixed]);
- EXPECT_FALSE([folder isFake]);
- EXPECT_EQ(bar_, [folder parent]);
- EXPECT_TRUE([folder isFolder]);
- ASSERT_EQ(2U, [folder numberOfChildren]);
- EXPECT_TRUE(isEqual(barTitle, [folder folderPath]));
-
- // Check items in subfolder.
- item = [folder childAtIndex:0];
- EXPECT_TRUE(isEqual(@"nested0", [item title]));
- EXPECT_TRUE(isEqual(@"http://example.com/n0", [item URLString]));
- EXPECT_FALSE([item isFixed]);
- EXPECT_FALSE([item isFake]);
- EXPECT_EQ(folder, [item parent]);
- EXPECT_FALSE([item isFolder]);
- EXPECT_TRUE(isEqual([barTitle stringByAppendingString:@"/group"],
- [item folderPath]));
-
- item = [folder childAtIndex:1];
- EXPECT_TRUE(isEqual(@"nested1", [item title]));
- EXPECT_TRUE(isEqual(@"http://example.com/n1", [item URLString]));
- EXPECT_FALSE([item isFixed]);
- EXPECT_FALSE([item isFake]);
- EXPECT_EQ(folder, [item parent]);
- EXPECT_FALSE([item isFolder]);
-}
-
-} // namespace
diff --git a/chrome/browser/cocoa/bookmark_manager_controller.h b/chrome/browser/cocoa/bookmark_manager_controller.h
deleted file mode 100644
index 5c30875..0000000
--- a/chrome/browser/cocoa/bookmark_manager_controller.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (c) 2009 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>
-#include "base/scoped_nsobject.h"
-#include "base/scoped_ptr.h"
-
-@class BookmarkItem;
-@class BookmarkTreeController;
-class BookmarkManagerBridge;
-class BookmarkModel;
-class BookmarkNode;
-@class FakeBookmarkItem;
-class Profile;
-
-// Controller for the bookmark manager window. There is at most one instance.
-@interface BookmarkManagerController : NSWindowController {
- @private
- IBOutlet NSSearchField* searchField_;
- IBOutlet NSSegmentedControl* addRemoveButton_;
- IBOutlet NSPopUpButton* actionButton_;
- IBOutlet BookmarkTreeController* groupsController_;
- IBOutlet BookmarkTreeController* listController_;
-
- Profile* profile_; // weak
- scoped_ptr<BookmarkManagerBridge> bridge_;
- scoped_nsobject<NSMapTable> nodeMap_;
- scoped_nsobject<FakeBookmarkItem> root_; // Root of tree
- scoped_nsobject<FakeBookmarkItem> searchGroup_; // Search Results group item
- scoped_nsobject<FakeBookmarkItem> recentGroup_; // Recently-Added group item
- scoped_nsobject<BookmarkItem> preSearchGroup_; // Selected before search
-}
-
-// Opens the bookmark manager window, or brings it to the front if it's open.
-+ (BookmarkManagerController*)showBookmarkManager:(Profile*)profile;
-
-// The user Profile.
-@property (readonly) Profile* profile;
-
-// The BookmarkModel of the manager's Profile.
-@property (readonly) BookmarkModel* bookmarkModel;
-
-@property (readonly) BookmarkItem* bookmarkBarItem;
-@property (readonly) BookmarkItem* otherBookmarksItem;
-
-// Maps C++ BookmarkNode objects to Objective-C BookmarkItems.
-- (BookmarkItem*)itemFromNode:(const BookmarkNode*)node;
-
-// Shows a group and its contents.
-- (void)showGroup:(BookmarkItem*)group;
-// Shows and selects a particular bookmark in its group.
-- (BOOL)revealItem:(BookmarkItem*)item;
-
-- (void)setSearchString:(NSString*)string;
-
-// Called by the toolbar search field after the user changes its text.
-- (IBAction)searchFieldChanged:(id)sender;
-// Called by the toolbar item; forwards to the focused tree controller.
-- (IBAction)delete:(id)sender;
-// Called by add/remove button.
-- (IBAction)segmentedControlClicked:(id)sender;
-
-// Updates the node->item mapping; called only by BookmarkItem itself!
-- (void)remapItem:(BookmarkItem*)item forNode:(const BookmarkNode*)node;
-@end
-
-
-// Exposed only for unit tests.
-@interface BookmarkManagerController (UnitTesting)
-
-- (void)forgetNode:(const BookmarkNode*)node;
-@property (readonly) BookmarkTreeController* groupsController;
-@property (readonly) BookmarkTreeController* listController;
-@property (readonly) FakeBookmarkItem* searchGroup;
-@property (readonly) FakeBookmarkItem* recentGroup;
-
-@end
diff --git a/chrome/browser/cocoa/bookmark_manager_controller.mm b/chrome/browser/cocoa/bookmark_manager_controller.mm
deleted file mode 100644
index 99f57b0..0000000
--- a/chrome/browser/cocoa/bookmark_manager_controller.mm
+++ /dev/null
@@ -1,577 +0,0 @@
-// Copyright (c) 2009 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 "chrome/browser/cocoa/bookmark_manager_controller.h"
-
-#include "app/l10n_util_mac.h"
-#include "app/resource_bundle.h"
-#include "base/logging.h"
-#include "base/mac_util.h"
-#include "base/sys_string_conversions.h"
-#include "chrome/app/chrome_dll_resource.h"
-#include "chrome/browser/bookmarks/bookmark_model.h"
-#include "chrome/browser/bookmarks/bookmark_model_observer.h"
-#include "chrome/browser/bookmarks/bookmark_utils.h"
-#import "chrome/browser/cocoa/bookmark_item.h"
-#import "chrome/browser/cocoa/bookmark_tree_controller.h"
-#import "chrome/browser/cocoa/browser_window_controller.h"
-#include "chrome/browser/pref_service.h"
-#include "chrome/browser/profile.h"
-#include "chrome/common/pref_names.h"
-#include "grit/app_resources.h"
-#include "grit/generated_resources.h"
-#include "grit/theme_resources.h"
-
-
-// Max number of recently-added bookmarks to show.
-static const int kMaxRecents = 200;
-
-// There's at most one BookmarkManagerController at a time. This points to it.
-static BookmarkManagerController* sInstance;
-
-
-@interface BookmarkManagerController ()
-- (void)nodeChanged:(const BookmarkNode*)node
- childrenChanged:(BOOL)childrenChanged;
-- (void)updateRecents;
-- (void)setupActionMenu;
-@end
-
-
-// Adapter to tell BookmarkManagerController when bookmarks change.
-class BookmarkManagerBridge : public BookmarkModelObserver {
- public:
- BookmarkManagerBridge(BookmarkManagerController* manager)
- :manager_(manager) { }
-
- virtual void Loaded(BookmarkModel* model) {
- // Ignore this; model has already loaded by this point.
- }
-
- virtual void BookmarkNodeMoved(BookmarkModel* model,
- const BookmarkNode* old_parent,
- int old_index,
- const BookmarkNode* new_parent,
- int new_index) {
- [manager_ nodeChanged:old_parent childrenChanged:YES];
- [manager_ nodeChanged:new_parent childrenChanged:YES];
- }
-
- virtual void BookmarkNodeAdded(BookmarkModel* model,
- const BookmarkNode* parent,
- int index) {
- [manager_ nodeChanged:parent childrenChanged:YES];
- }
-
- virtual void BookmarkNodeRemoved(BookmarkModel* model,
- const BookmarkNode* parent,
- int old_index,
- const BookmarkNode* node) {
- [manager_ nodeChanged:parent childrenChanged:YES];
- [manager_ forgetNode:node];
- }
-
- virtual void BookmarkNodeChanged(BookmarkModel* model,
- const BookmarkNode* node) {
- [manager_ nodeChanged:node childrenChanged:NO];
- }
-
- virtual void BookmarkNodeFavIconLoaded(BookmarkModel* model,
- const BookmarkNode* node) {
- [manager_ nodeChanged:node childrenChanged:NO];
- }
-
- virtual void BookmarkNodeChildrenReordered(BookmarkModel* model,
- const BookmarkNode* node) {
- [manager_ nodeChanged:node childrenChanged:YES];
- }
-
- private:
- BookmarkManagerController* manager_; // weak
-};
-
-
-@implementation BookmarkManagerController
-
-
-@synthesize profile = profile_;
-
-// Private instance initialization method.
-- (id)initWithProfile:(Profile*)profile {
- // Use initWithWindowNibPath:: instead of initWithWindowNibName: so we
- // can override it in a unit test.
- NSString* nibPath = [mac_util::MainAppBundle()
- pathForResource:@"BookmarkManager"
- ofType:@"nib"];
- self = [super initWithWindowNibPath:nibPath owner:self];
- if (self != nil) {
- // Never use an incognito Profile, which can be deleted at any moment when
- // the user closes its browser window. Use the default one instead.
- DCHECK(profile);
- profile_ = profile->GetOriginalProfile();
-
- bridge_.reset(new BookmarkManagerBridge(self));
- profile_->GetBookmarkModel()->AddObserver(bridge_.get());
-
- // Initialize the Recents and Search Results groups:
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- NSImage* recentIcon = rb.GetNSImageNamed(IDR_BOOKMARK_MANAGER_RECENT_ICON);
- recentGroup_.reset([[FakeBookmarkItem alloc] initWithTitle:@"Recently Added"
- icon:recentIcon
- manager:self]);
- NSImage* searchIcon = rb.GetNSImageNamed(IDR_BOOKMARK_MANAGER_SEARCH_ICON);
- searchGroup_.reset([[FakeBookmarkItem alloc] initWithTitle:@"Search Results"
- icon:searchIcon
- manager:self]);
- }
- return self;
-}
-
-- (void)dealloc {
- if (self == sInstance) {
- sInstance = nil;
- }
- [groupsController_ removeObserver:self forKeyPath:@"selectedItem"];
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- if (bridge_.get())
- profile_->GetBookmarkModel()->RemoveObserver(bridge_.get());
- [super dealloc];
-}
-
-- (void)awakeFromNib {
- // Set up the action button's menu.
- [self setupActionMenu];
-
- // Set the tooltips of the +/- buttons. Chrome's automatic UI localization
- // doesn't know about tooltips of NSSegmentedCells.
- NSSegmentedCell* cell = [addRemoveButton_ cell];
- [cell setToolTip:l10n_util::GetNSString(
- IDS_BOOKMARK_MANAGER_TOOLTIP_NEW_FOLDER_MAC)
- forSegment:0];
- [cell setToolTip:l10n_util::GetNSString(
- IDS_BOOKMARK_MANAGER_TOOLTIP_DELETE_MAC)
- forSegment:1];
-
- // Synthesize the hierarchy of the left-hand outline view.
- BookmarkModel* model = [self bookmarkModel];
- BookmarkItem* bar = [self itemFromNode:model->GetBookmarkBarNode()];
- BookmarkItem* other = [self itemFromNode:model->other_node()];
- NSArray* rootItems = [NSArray arrayWithObjects:
- bar,
- other,
- recentGroup_.get(),
- nil];
- root_.reset([[FakeBookmarkItem alloc] initWithTitle:@""
- icon:nil
- manager:self]);
- [root_ setChildren:rootItems];
- [recentGroup_ setParent:root_];
- [searchGroup_ setParent:root_];
- [groupsController_ setGroup:root_];
-
- // Turning on autosave also loads and applies the settings, which we couldn't
- // do until setting up the data model, above.
- NSOutlineView* outline = [groupsController_ outline];
- [outline setAutosaveExpandedItems:YES];
- if (![outline isItemExpanded:bar] && ![outline isItemExpanded:other]) {
- // By default, expand the Bookmarks Bar and Other:
- [groupsController_ expandItem:bar];
- [groupsController_ expandItem:other];
- }
-
- // The Source-List style on the group outline has less space between rows,
- // so compensate for this by increasing the spacing:
- NSSize spacing = [[groupsController_ outline] intercellSpacing];
- spacing.height += 2;
- [[groupsController_ outline] setIntercellSpacing:spacing];
-
- [listController_ setShowsLeaves:YES];
- [listController_ setFlat:YES];
-
- // Observe selection changes in the groups outline.
- [groupsController_ addObserver:self
- forKeyPath:@"selectedItem"
- options:NSKeyValueObservingOptionInitial
- context:NULL];
-
- // Register windowDidUpdate: to be called after every user event.
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(windowDidUpdate:)
- name:NSWindowDidUpdateNotification
- object:[self window]];
-}
-
-// When window closes, get rid of myself too. (NSWindow delegate)
-- (void)windowWillClose:(NSNotification*)n {
- [self autorelease];
-}
-
-
-#pragma mark -
-#pragma mark ACCESSORS:
-
-
-// can't synthesize category methods, unfortunately
-- (BookmarkTreeController*)groupsController {
- return groupsController_;
-}
-
-- (BookmarkTreeController*)listController {
- return listController_;
-}
-
-// Returns the groups or list controller, whichever one has focus.
-- (BookmarkTreeController*)focusedController {
- id first = [[self window] firstResponder];
- if ([first isKindOfClass:[BookmarksOutlineView class]])
- return [(BookmarksOutlineView*)first bookmarkController];
- return nil;
-}
-
-- (FakeBookmarkItem*)recentGroup {
- return recentGroup_;
-}
-
-- (FakeBookmarkItem*)searchGroup {
- return searchGroup_;
-}
-
-- (void)setSearchString:(NSString*)string {
- [searchField_ setStringValue:string];
- [self searchFieldChanged:self];
-}
-
-
-#pragma mark -
-#pragma mark DATA MODEL:
-
-
-// Getter for the |bookmarkModel| property.
-- (BookmarkModel*)bookmarkModel {
- return profile_->GetBookmarkModel();
-}
-
-// Maps a BookmarkNode to a table/outline row item placeholder.
-- (BookmarkItem*)itemFromNode:(const BookmarkNode*)node {
- if (!node)
- return nil;
- if (!nodeMap_) {
- nodeMap_.reset([[NSMapTable alloc]
- initWithKeyOptions:NSPointerFunctionsOpaqueMemory |
- NSPointerFunctionsOpaquePersonality
- valueOptions:NSPointerFunctionsStrongMemory
- capacity:500]);
- }
- BookmarkItem* item = (BookmarkItem*)NSMapGet(nodeMap_, node);
- if (!item) {
- item = [[BookmarkItem alloc] initWithBookmarkNode:node manager:self];
- NSMapInsertKnownAbsent(nodeMap_, node, item);
- [item release];
- }
- return item;
-}
-
-- (BookmarkItem*)bookmarkBarItem {
- return [self itemFromNode:[self bookmarkModel]->GetBookmarkBarNode()];
-}
-
-- (BookmarkItem*)otherBookmarksItem {
- return [self itemFromNode:[self bookmarkModel]->other_node()];
-}
-
-// Updates the mapping; called by a BookmarkItem if it changes its node.
-- (void)remapItem:(BookmarkItem*)item forNode:(const BookmarkNode*)node {
- NSMapInsert(nodeMap_, node, item);
-}
-
-// Removes a BookmarkNode from the node<->item mapping table.
-- (void)forgetNode:(const BookmarkNode*)node {
- NSMapRemove(nodeMap_, node);
- for (int i = node->GetChildCount() - 1 ; i >= 0 ; i--) {
- [self forgetNode:node->GetChild(i)];
- }
-
- if (node == [preSearchGroup_ node])
- preSearchGroup_.reset();
-}
-
-// Called when the bookmark model changes; forwards to the sub-controllers.
-- (void)itemChanged:(BookmarkItem*)item
- childrenChanged:(BOOL)childrenChanged {
- if (item) {
- [item nodeChanged];
- [groupsController_ itemChanged:item childrenChanged:childrenChanged];
- [listController_ itemChanged:item childrenChanged:childrenChanged];
- }
-
- // Update the recents or search results if they're visible.
- if ([groupsController_ selectedItem] == searchGroup_.get())
- [self searchFieldChanged:self];
- if ([groupsController_ selectedItem] == recentGroup_.get())
- [self updateRecents];
-}
-
-// Called when the bookmark model changes; forwards to the sub-controllers.
-- (void)nodeChanged:(const BookmarkNode*)node
- childrenChanged:(BOOL)childrenChanged {
- BookmarkItem* item = (BookmarkItem*)NSMapGet(nodeMap_, node);
- if (item) {
- [self itemChanged:item childrenChanged:childrenChanged];
- }
-}
-
-- (void)updateRecents {
- typedef std::vector<const BookmarkNode*> NodeVector;
- NodeVector nodes;
- bookmark_utils::GetMostRecentlyAddedEntries(
- [self bookmarkModel], kMaxRecents, &nodes);
-
- // Update recentGroup_:
- NSMutableArray* result = [NSMutableArray arrayWithCapacity:nodes.size()];
- for (NodeVector::iterator it = nodes.begin(); it != nodes.end(); ++it) {
- [result addObject:[self itemFromNode:*it]];
- }
- if (![result isEqual:[recentGroup_ children]]) {
- [recentGroup_ setChildren:result];
- [self itemChanged:recentGroup_ childrenChanged:YES];
- }
-}
-
-- (void)updateSearch {
- typedef std::vector<const BookmarkNode*> MatchVector;
- MatchVector matches;
- NSString* searchString = [searchField_ stringValue];
- if ([searchString length] > 0) {
- // Search in the BookmarkModel:
- std::wstring text = base::SysNSStringToWide(searchString);
- bookmark_utils::GetBookmarksContainingText(
- [self bookmarkModel],
- base::SysNSStringToWide(searchString),
- std::numeric_limits<int>::max(), // unlimited result count
- profile_->GetPrefs()->GetString(prefs::kAcceptLanguages),
- &matches);
- }
-
- // Update contents of searchGroup_:
- NSMutableArray* result = [NSMutableArray arrayWithCapacity:matches.size()];
- for (MatchVector::iterator it = matches.begin(); it != matches.end(); ++it) {
- [result addObject:[self itemFromNode:*it]];
- }
- if (![result isEqual:[searchGroup_ children]]) {
- [searchGroup_ setChildren:result];
- [self itemChanged:searchGroup_ childrenChanged:YES];
- }
-
- // Show searchGroup_ if it's not visible yet:
- NSArray* rootItems = [root_ children];
- if (![rootItems containsObject:searchGroup_]) {
- [root_ setChildren:[rootItems arrayByAddingObject:searchGroup_]];
- [self itemChanged:root_ childrenChanged:YES];
- }
-}
-
-- (void)selectedGroupChanged {
- BOOL showFolders = YES;
- BookmarkItem* group = [groupsController_ selectedItem];
- if (group == recentGroup_.get())
- [self updateRecents];
- else if (group == searchGroup_.get())
- [self updateSearch];
- else
- showFolders = NO;
- [listController_ setGroup:group];
- [listController_ setShowsFolderColumn:showFolders];
-}
-
-- (void)observeValueForKeyPath:(NSString*)keyPath
- ofObject:(id)object
- change:(NSDictionary*)change
- context:(void*)context {
- if (object == groupsController_)
- [self selectedGroupChanged];
-}
-
-
-#pragma mark -
-#pragma mark ACTIONS:
-
-
-// Public entry point to open the bookmark manager.
-+ (BookmarkManagerController*)showBookmarkManager:(Profile*)profile
-{
- if (!sInstance) {
- sInstance = [[self alloc] initWithProfile:profile];
- }
- [sInstance showWindow:self];
- return sInstance;
-}
-
-- (void)showGroup:(BookmarkItem*)group {
- [groupsController_ revealItem:group];
-}
-
-// Makes an item visible and selects it.
-- (BOOL)revealItem:(BookmarkItem*)item {
- return [groupsController_ revealItem:[item parent]] &&
- [listController_ revealItem:item];
-}
-
-// Shows/hides the "Search Results" item.
-- (void)setSearchGroupVisible:(BOOL)visible {
- NSMutableArray* rootItems = [NSMutableArray arrayWithArray:[root_ children]];
- if (visible != [rootItems containsObject:searchGroup_]) {
- if (visible) {
- [rootItems addObject:searchGroup_];
- } else {
- [rootItems removeObject:searchGroup_];
- }
- [root_ setChildren:rootItems];
- [self itemChanged:root_ childrenChanged:YES];
- }
-}
-
-// Called when the user modifies the search field.
-- (IBAction)searchFieldChanged:(id)sender {
- [self updateSearch];
- if ([[searchField_ stringValue] length]) {
- // There is search text. Show searchGroup_ if it's not visible yet:
- [self setSearchGroupVisible:YES];
-
- BookmarkItem *sel = [groupsController_ selectedItem];
- if (sel != searchGroup_.get()) {
- // Remember which group used to be selected.
- preSearchGroup_.reset([sel retain]);
- // And select searchGroup_.
- [self showGroup:searchGroup_];
- }
-
- } else {
- // No search text. Restore the pre-search group selction:
- if (preSearchGroup_.get()) {
- if ([groupsController_ selectedItem] == searchGroup_.get()) {
- [self showGroup:preSearchGroup_];
- }
- preSearchGroup_.reset();
- }
- // Hide the Search Results group:
- [self setSearchGroupVisible:NO];
- }
-}
-
-- (IBAction)segmentedControlClicked:(id)sender {
- BookmarkTreeController* controller = [self focusedController];
- DCHECK(controller);
- NSSegmentedCell* cell = [sender cell];
- switch ([cell tagForSegment:[cell selectedSegment]]) {
- case 0:
- [controller newFolder:sender];
- break;
- case 1:
- [controller delete:sender];
- break;
- default:
- NOTREACHED();
- }
-}
-
-- (IBAction)delete:(id)sender {
- [[self focusedController] delete:sender];
-}
-
-- (IBAction)openItems:(id)sender {
- [[self focusedController] openItems:sender];
-}
-
-- (IBAction)revealSelectedItem:(id)sender {
- [[self focusedController] revealSelectedItem:sender];
-}
-
-- (IBAction)editTitle:(id)sender {
- [[self focusedController] editTitle:sender];
-}
-
-// Called when the user picks a menu or toolbar item when this window is key.
-- (void)commandDispatch:(id)sender {
- // Copied from app_controller_mac.mm:
- // Handle the case where we're dispatching a command from a sender that's in a
- // browser window. This means that the command came from a background window
- // and is getting here because the foreground window is not a browser window.
- if ([sender respondsToSelector:@selector(window)]) {
- id delegate = [[sender window] windowController];
- if ([delegate isKindOfClass:[BrowserWindowController class]]) {
- [delegate commandDispatch:sender];
- return;
- }
- }
-
- switch ([sender tag]) {
- case IDC_FIND:
- [[self window] makeFirstResponder:searchField_];
- break;
- case IDC_SHOW_BOOKMARK_MANAGER:
- // The Bookmark Manager menu command _closes_ the window if it's frontmost.
- [self close];
- break;
- default: {
- // Forward other commands to the AppController -- New Window etc.
- [[NSApp delegate] commandDispatch:sender];
- break;
- }
- }
-}
-
-- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item {
- SEL action = [item action];
- if (action == @selector(commandDispatch:) ||
- action == @selector(commandDispatchUsingKeyModifiers:)) {
- NSInteger tag = [item tag];
- if (tag == IDC_FIND || tag == IDC_SHOW_BOOKMARK_MANAGER)
- return YES;
- // Let the AppController validate other commands -- New Window etc.
- return [[NSApp delegate] validateUserInterfaceItem:item];
- } else if (action == @selector(newFolder:) ||
- action == @selector(delete:) ||
- action == @selector(openItems:) ||
- action == @selector(revealSelectedItem:) ||
- action == @selector(editTitle:)) {
- return [[self focusedController] validateUserInterfaceItem:item];
- }
- return YES;
-}
-
-- (void)windowDidUpdate:(NSNotification*)n {
- // After any event, enable/disable the buttons:
- BookmarkTreeController* tree = [self focusedController];
- [addRemoveButton_ setEnabled:[tree validateAction:@selector(newFolder:)]
- forSegment:0];
- [addRemoveButton_ setEnabled:[tree validateAction:@selector(delete:)]
- forSegment:1];
-}
-
-
-// Generates the pull-down menu for the "action" (gear) button.
-- (void)setupActionMenu {
- static const int kMenuActionsCount = 3;
- const struct {int title; SEL action;} kMenuActions[kMenuActionsCount] = {
- {IDS_BOOMARK_BAR_OPEN_IN_NEW_TAB, @selector(openItems:)},
- {IDS_BOOKMARK_BAR_EDIT, @selector(editTitle:)},
- {IDS_BOOKMARK_MANAGER_SHOW_IN_FOLDER, @selector(revealSelectedItem:)},
- };
-
- [actionButton_ setTarget:self];
- NSMenu* menu = [actionButton_ menu];
- for (int i = 0; i < kMenuActionsCount; i++) {
- if (kMenuActions[i].action) {
- NSString* title = l10n_util::GetNSStringWithFixup(kMenuActions[i].title);
- [menu addItemWithTitle:title
- action:kMenuActions[i].action
- keyEquivalent:@""];
- [[[menu itemArray] lastObject] setTarget:self];
- } else {
- [menu addItem:[NSMenuItem separatorItem]];
- }
- }
-}
-
-@end
diff --git a/chrome/browser/cocoa/bookmark_manager_controller_unittest.mm b/chrome/browser/cocoa/bookmark_manager_controller_unittest.mm
deleted file mode 100644
index 5f5c4cb..0000000
--- a/chrome/browser/cocoa/bookmark_manager_controller_unittest.mm
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright (c) 2009 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.
-
-#include "base/scoped_nsobject.h"
-#import "chrome/browser/cocoa/bookmark_item.h"
-#import "chrome/browser/cocoa/bookmark_manager_controller.h"
-#import "chrome/browser/cocoa/bookmark_tree_controller.h"
-#include "chrome/browser/cocoa/browser_test_helper.h"
-#import "chrome/browser/cocoa/cocoa_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-namespace {
-
-class BookmarkManagerControllerTest : public CocoaTest {
- public:
- void SetUp() {
- CocoaTest::SetUp();
- controller_ = [BookmarkManagerController showBookmarkManager:
- browser_test_helper_.profile()];
- ASSERT_TRUE(controller_);
- }
-
- void TearDown() {
- [controller_ close];
- CocoaTest::TearDown();
- }
-
- BookmarkItem* AddToBar(NSString*title, NSString* urlStr) {
- BookmarkItem* bar = [controller_ bookmarkBarItem];
- return [bar addBookmarkWithTitle:title
- URL:urlStr
- atIndex:[bar numberOfChildren]];
- }
-
- NSSet* AddFixtureItems() {
- return [NSSet setWithObjects:
- AddToBar(@"Google", @"http://google.com"),
- AddToBar(@"GMail", @"http://gmail.com"),
- AddToBar(@"Google Sites", @"http://sites.google.com"),
- nil];
- }
-
- bool SearchResultsVisible() {
- NSOutlineView* outline = [[controller_ groupsController] outline];
- return [outline rowForItem:[controller_ searchGroup]] >= 0;
- }
-
- BrowserTestHelper browser_test_helper_;
- BookmarkManagerController* controller_;
-};
-
-TEST_F(BookmarkManagerControllerTest, IsThisThingTurnedOn) {
- NSWindow* w = [controller_ window];
- ASSERT_TRUE(w);
- EXPECT_TRUE([w isVisible]);
-
- ASSERT_TRUE([controller_ groupsController]);
- ASSERT_TRUE([controller_ listController]);
-}
-
-TEST_F(BookmarkManagerControllerTest, Model) {
- BookmarkModel* model = [controller_ bookmarkModel];
- ASSERT_EQ(browser_test_helper_.profile()->GetBookmarkModel(), model);
-
- // Check the bookmarks-bar item:
- const BookmarkNode* bar = model->GetBookmarkBarNode();
- ASSERT_TRUE(bar);
- BookmarkItem* barItem = [controller_ itemFromNode:bar];
- ASSERT_TRUE(barItem);
- ASSERT_EQ(barItem, [controller_ bookmarkBarItem]);
-
- // Check the 'others' item:
- const BookmarkNode* other = model->other_node();
- ASSERT_TRUE(other);
- EXPECT_NE(bar, other);
- scoped_nsobject<BookmarkItem> otherItem(
- [[controller_ itemFromNode:other] retain]);
- ASSERT_TRUE(otherItem);
- ASSERT_EQ(otherItem, [controller_ otherBookmarksItem]);
-
- EXPECT_NE(barItem, otherItem);
- EXPECT_FALSE([barItem isEqual:otherItem]);
-
- EXPECT_EQ(bar, [barItem node]);
- EXPECT_EQ(barItem, [controller_ itemFromNode:bar]);
- EXPECT_EQ(other, [otherItem node]);
- EXPECT_EQ(otherItem, [controller_ itemFromNode:other]);
-
- // Now tell it to forget 'other' and see if we get a different BookmarkItem:
- [controller_ forgetNode:other];
- BookmarkItem* otherItem2 = [controller_ itemFromNode:other];
- EXPECT_TRUE(otherItem2);
- EXPECT_NE(otherItem, otherItem2);
-}
-
-TEST_F(BookmarkManagerControllerTest, Recents) {
- NSSet* fixtures = AddFixtureItems();
- // Show the Recent Items group, so its contents will be updated.
- FakeBookmarkItem* recents = [controller_ recentGroup];
- [controller_ showGroup:recents];
- NSSet* shown = [NSSet setWithArray:[recents children]];
- EXPECT_TRUE([fixtures isEqual:shown]);
-}
-
-TEST_F(BookmarkManagerControllerTest, Search) {
- AddFixtureItems();
- // Search for 'gmail':
- [controller_ setSearchString:@"gmail"];
- FakeBookmarkItem* search = [controller_ searchGroup];
- EXPECT_EQ(search, [[controller_ groupsController] selectedItem]);
- NSArray* shown = [search children];
- EXPECT_EQ(1U, [shown count]);
- EXPECT_TRUE([@"GMail" isEqualToString:[[shown lastObject] title]]);
-
- // Search for 'google':
- [controller_ setSearchString:@"google"];
- shown = [search children];
- EXPECT_EQ(2U, [shown count]);
-
- // Search for 'fnord':
- [controller_ setSearchString:@"fnord"];
- shown = [search children];
- EXPECT_EQ(0U, [shown count]);
-}
-
-TEST_F(BookmarkManagerControllerTest, SearchSelection) {
- BookmarkTreeController* groupsController = [controller_ groupsController];
- AddFixtureItems();
- BookmarkItem* originalSelection = [controller_ bookmarkBarItem];
- EXPECT_FALSE(SearchResultsVisible());
- EXPECT_EQ(originalSelection, [groupsController selectedItem]);
-
- // Start a search and verify the search results group is selected.
- [controller_ setSearchString:@"g"];
- EXPECT_TRUE(SearchResultsVisible());
- EXPECT_EQ([controller_ searchGroup], [groupsController selectedItem]);
-
- // Type some more, see if updating the search string works.
- [controller_ setSearchString:@"gmail"];
- EXPECT_TRUE(SearchResultsVisible());
- EXPECT_EQ([controller_ searchGroup], [groupsController selectedItem]);
-
- // Clear search, verify search results are hidden and original sel restored.
- [controller_ setSearchString:@""];
- EXPECT_FALSE(SearchResultsVisible());
- EXPECT_EQ(originalSelection, [groupsController selectedItem]);
-
- // Now search, then change the selection, then clear search:
- [controller_ setSearchString:@"gmail"];
- EXPECT_TRUE(SearchResultsVisible());
- EXPECT_EQ([controller_ searchGroup], [groupsController selectedItem]);
- BookmarkItem* newerSelection = [controller_ otherBookmarksItem];
- [controller_ showGroup:newerSelection];
- [controller_ setSearchString:@""];
- EXPECT_FALSE(SearchResultsVisible());
- EXPECT_EQ(newerSelection, [groupsController selectedItem]);
-}
-
-} // namespace
diff --git a/chrome/browser/cocoa/bookmark_tree_controller.h b/chrome/browser/cocoa/bookmark_tree_controller.h
deleted file mode 100644
index 171e979..0000000
--- a/chrome/browser/cocoa/bookmark_tree_controller.h
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2009 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>
-#include <vector>
-
-@class BookmarkItem;
-@class BookmarkManagerController;
-
-
-// Controller for the bookmark tree view (the right pane).
-@interface BookmarkTreeController : NSObject <NSUserInterfaceValidations> {
- @private
- IBOutlet NSOutlineView* outline_;
- IBOutlet BookmarkManagerController* manager_;
- BookmarkItem* group_;
- BOOL showsLeaves_;
- BOOL flat_;
-}
-
-// If set, leaf (URL) bookmarks are shown; if not, they're hidden.
-@property BOOL showsLeaves;
-// If set, displays a flat list (no hierarchy).
-@property BOOL flat;
-// Controls the visibility of the "Folder" column (used with search/recents.)
-@property BOOL showsFolderColumn;
-
-// The top-level bookmark folder used as the root of the outline's tree.
-// Observable, bindable.
-@property (assign) BookmarkItem* group;
-// Controls whether leaf bookmarks or just folders are shown.
-// The currently selected item(s) in the outline. (Observable.)
-@property (retain) NSArray* selectedItems;
-// The currently selected single item; nil on multiple selection. (Observable.)
-@property (retain) BookmarkItem* selectedItem;
-// The currently selected or right-clicked items, for commands to act on.
-@property (readonly) NSArray* actionItems;
-
-// The parent folder and index at which items should be inserted/pasted.
-// Returns NO if insertion is not allowed.
-- (BOOL)getInsertionParent:(BookmarkItem**)outParent
- index:(NSUInteger*)outIndex;
-// Just returns whether insertion is allowed.
-- (BOOL)canInsert;
-
-// Expands a folder item (including any parent folders).
-// Returns YES on success, NO if it couldn't find the folder.
-- (BOOL)expandItem:(BookmarkItem*)item;
-// Expands parent folders, selects the item, and scrolls it into view:
-// Returns YES on success, NO if it couldn't find the item.
-- (BOOL)revealItem:(BookmarkItem*)item;
-
-// Action for the New Folder command.
-- (IBAction)newFolder:(id)sender;
-
-// Action for the Delete command; also invoked by the delete key.
-- (IBAction)delete:(id)sender;
-
-// Reveals the selected search/recent item in its real folder.
-- (IBAction)revealSelectedItem:(id)sender;
-
-// Opens the selected bookmark(s) in new tabs.
-- (IBAction)openItems:(id)sender;
-
-// Makes the selected bookmark's title editable.
-- (IBAction)editTitle:(id)sender;
-
-// Returns YES if an action should be enabled.
-- (BOOL)validateAction:(SEL)action;
-
-// Called by the BookmarkManagerController to notify the data model's changed.
-- (void)itemChanged:(BookmarkItem*)nodeItem
- childrenChanged:(BOOL)childrenChanged;
-
-@end
-
-
-// Drag/drop and copy/paste methods
-// (These are implemented in bookmark_tree_controller_paste.mm.)
-@interface BookmarkTreeController (Pasteboard)
-// One-time drag-n-drop setup; called from -awakeFromNib.
-- (void)registerDragTypes;
-- (IBAction)cut:(id)sender;
-- (IBAction)copy:(id)sender;
-- (IBAction)paste:(id)sender;
-@end
-
-
-// Exposed only for unit tests.
-@interface BookmarkTreeController (UnitTesting)
-@property (readonly) NSOutlineView* outline;
-- (BookmarkItem*)newFolderWithTitle:(NSString*)title;
-- (NSArray*)readPropertyListFromPasteboard:(NSPasteboard*)pb;
-- (BOOL)copyToPasteboard:(NSPasteboard*)pb;
-- (BOOL)pasteFromPasteboard:(NSPasteboard*)pb;
-- (BookmarkItem*)itemForDropOnItem:(BookmarkItem*)item
- proposedIndex:(NSInteger*)childIndex;
-- (void)moveItems:(NSArray*)items
- toFolder:(BookmarkItem*)dstParent
- atIndex:(int)dstIndex;
-@end
-
-
-// Outline view for bookmark tree; handles Cut/Copy/Paste and Delete key.
-@interface BookmarksOutlineView : NSOutlineView
-// The owning BookmarkTreeController (same as the delegate).
-@property (readonly) BookmarkTreeController* bookmarkController;
-@end
diff --git a/chrome/browser/cocoa/bookmark_tree_controller.mm b/chrome/browser/cocoa/bookmark_tree_controller.mm
deleted file mode 100644
index fb0bc97..0000000
--- a/chrome/browser/cocoa/bookmark_tree_controller.mm
+++ /dev/null
@@ -1,536 +0,0 @@
-// Copyright (c) 2009 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 "chrome/browser/cocoa/bookmark_tree_controller.h"
-
-#include "app/l10n_util_mac.h"
-#include "base/logging.h"
-#import "chrome/browser/cocoa/bookmark_item.h"
-#import "chrome/browser/cocoa/bookmark_manager_controller.h"
-#include "grit/generated_resources.h"
-
-// Outline-view column identifiers.
-static NSString* const kTitleColIdent = @"title";
-static NSString* const kURLColIdent = @"url";
-static NSString* const kFolderColIdent = @"folder";
-
-
-@implementation BookmarkTreeController
-
-@synthesize showsLeaves = showsLeaves_;
-
-// Initialization after the nib is loaded.
-- (void)awakeFromNib {
- [outline_ setTarget:self];
- [outline_ setDoubleAction:@selector(openItems:)];
- [outline_ setAutoresizesOutlineColumn:NO]; // Prevents issue 35031
- [self registerDragTypes];
-}
-
-- (BookmarkItem*)group {
- return group_;
-}
-
-- (void)setGroup:(BookmarkItem*)group {
- if (group != group_) {
- group_ = group;
-
- [outline_ deselectAll:self];
- [outline_ reloadData];
- [outline_ noteNumberOfRowsChanged];
- }
-}
-
-- (NSOutlineView*)outline {
- return outline_;
-}
-
-- (BOOL)showsFolderColumn {
- NSTableColumn* col = [outline_ tableColumnWithIdentifier:kFolderColIdent];
- return ![col isHidden];
-}
-
-- (void)setShowsFolderColumn:(BOOL)show {
- NSTableColumn* col = [outline_ tableColumnWithIdentifier:kFolderColIdent];
- DCHECK(col);
- if (show != ![col isHidden]) {
- [col setHidden:!show];
- [outline_ sizeToFit];
- }
-}
-
-- (BOOL)flat {
- return flat_;
-}
-
-- (void)setFlat:(BOOL)flat {
- flat_ = flat;
- [outline_ setIndentationPerLevel:flat ? 0.0 : 16.0];
-}
-
-
-#pragma mark -
-#pragma mark SELECTION:
-
-// Getter for the |selectedItems| property.
-- (NSArray*)selectedItems {
- NSMutableArray* items = [NSMutableArray array];
- NSIndexSet* selectedRows = [outline_ selectedRowIndexes];
- if (selectedRows != nil) {
- for (NSInteger row = [selectedRows firstIndex]; row != NSNotFound;
- row = [selectedRows indexGreaterThanIndex:row]) {
- [items addObject:[outline_ itemAtRow:row]];
- }
- }
- return items;
-}
-
-// Setter for the |selectedItems| property.
-- (void)setSelectedItems:(NSArray*)items {
- NSMutableIndexSet* newSelection = [NSMutableIndexSet indexSet];
-
- for (NSUInteger i = 0; i < [items count]; i++) {
- NSInteger row = [outline_ rowForItem:[items objectAtIndex:i]];
- if (row >= 0) {
- [newSelection addIndex:row];
- }
- }
-
- [outline_ selectRowIndexes:newSelection byExtendingSelection:NO];
-}
-
-- (BookmarkItem*)selectedItem {
- BookmarkItem* selected = nil;
- if ([outline_ numberOfSelectedRows] == 1)
- selected = [outline_ itemAtRow:[outline_ selectedRow]];
- return selected;
-}
-
-- (void)setSelectedItem:(BookmarkItem*)item {
- [self setSelectedItems:item ? [NSArray arrayWithObject:item] : nil];
-}
-
-+ (NSArray*)keyPathsForValuesAffectingSelectedItem {
- return [NSArray arrayWithObject:@"selectedItems"];
-}
-
-- (BOOL)selectionShouldChangeInOutlineView:(NSOutlineView*)outlineView {
- [self willChangeValueForKey:@"selectedItems"];
- return YES;
-}
-
-- (void)outlineViewSelectionDidChange:(NSNotification*)notification {
- [self didChangeValueForKey:@"selectedItems"];
-}
-
-// Returns the selected/right-clicked item(s) for a command to act on.
-- (NSArray*)actionItems {
- int row = [outline_ clickedRow];
- if (row >= 0 && ![outline_ isRowSelected:row]) {
- BookmarkItem* item = [outline_ itemAtRow:row];
- if (!item)
- return nil; // clickedRow can occasionally return a nonexistent row
- return [NSArray arrayWithObject:item];
- }
- return [self selectedItems];
-}
-
-- (BOOL)expandItem:(BookmarkItem*)item {
- if (!item)
- return NO;
- if (item == group_)
- return YES;
- if ([outline_ rowForItem:item] < 0) {
- // If the item's not visible, expand its ancestors.
- if (![self expandItem:[item parent]])
- return NO;
- }
- if (![outline_ isExpandable:item])
- return NO;
- [outline_ expandItem:item];
- DCHECK([outline_ isItemExpanded:item]);
- return YES;
-}
-
-- (BOOL)revealItem:(BookmarkItem*)item {
- if ([item parent] && ![self expandItem:[item parent]])
- return NO;
- [outline_ scrollRowToVisible:[outline_ rowForItem:item]];
- [self setSelectedItems:[NSArray arrayWithObject:item]];
- return YES;
-}
-
-- (BOOL)getInsertionParent:(BookmarkItem**)outParent
- index:(NSUInteger*)outIndex {
- NSArray* selItems = [self actionItems];
- NSUInteger numSelected = [selItems count];
- if (numSelected > 1) {
- return NO;
- } else if (numSelected == 1) {
- // Insert at selected/clicked row.
- BookmarkItem* selected = [selItems objectAtIndex:0];
- *outParent = [selected parent];
- if (*outParent && ![*outParent isFake])
- *outIndex = [*outParent indexOfChild:selected];
- else if ([selected isFolder]) {
- // If root item like Bookmarks Bar selected, insert _into_ it.
- *outParent = selected;
- *outIndex = 0;
- }
- } else {
- // Insert at very end if there's no selection:
- *outParent = group_;
- *outIndex = [group_ numberOfChildren];
- }
- // Can't add to a fake group.
- return *outParent && ![*outParent isFake];
-}
-
-- (BOOL)canInsert {
- BookmarkItem* parent;
- NSUInteger index;
- return [self getInsertionParent:&parent index:&index];
-}
-
-
-#pragma mark -
-#pragma mark COMMANDS:
-
-
-// Responds to a double-click by opening the selected URL(s).
-- (IBAction)openItems:(id)sender {
- for (BookmarkItem* item in [self actionItems]) {
- if (![item isFolder]) {
- [item open];
- } else if (flat_) {
- [manager_ showGroup:item];
- } else {
- if ([outline_ isItemExpanded:item])
- [outline_ collapseItem:item];
- else
- [outline_ expandItem:item];
- }
- }
-}
-
-// The Delete command (also bound to the delete key.)
-- (IBAction)delete:(id)sender {
- NSArray* items = [self actionItems];
- // Iterate backwards so that any selected children are deleted before
- // selected parents (opposite order could cause double-free!)
- bool any = false;
- if ([items count]) {
- for (NSInteger i = [items count] - 1; i >= 0; i--) {
- BookmarkItem* item = [items objectAtIndex:i];
- if ([[item parent] removeChild:item])
- any = true;
- }
- }
- if (any) {
- [outline_ reloadData];
- [outline_ deselectAll:self];
- } else {
- NSBeep();
- }
-}
-
-- (void)editTitleOfItem:(BookmarkItem*)item {
- int row = [outline_ rowForItem:item];
- DCHECK(row >= 0);
- [self setSelectedItem:item];
- [outline_ editColumn:[outline_ columnWithIdentifier:@"title"]
- row:row
- withEvent:[NSApp currentEvent]
- select:YES];
-}
-
-- (IBAction)editTitle:(id)sender {
- NSArray* items = [self actionItems];
- if ([items count] == 1)
- [self editTitleOfItem:[items objectAtIndex:0]];
- else
- NSBeep();
-}
-
-- (BookmarkItem*)newFolderWithTitle:(NSString*)title {
- BookmarkItem* parent;
- NSUInteger index;
- if (![self getInsertionParent:&parent index:&index]) {
- NSBeep();
- return nil;
- }
- // Create the folder, then select it and make the title editable:
- BookmarkItem* folder = [parent addFolderWithTitle:title atIndex:index];
- [self revealItem:folder];
- return folder;
-}
-
-- (IBAction)newFolder:(id)sender {
- BookmarkItem* folder = [self newFolderWithTitle:@""];
- if (folder)
- [self editTitleOfItem:folder];
-}
-
-- (IBAction)revealSelectedItem:(id)sender {
- NSArray* selItems = [self actionItems];
- if ([selItems count] != 1 ||
- ![manager_ revealItem:[selItems objectAtIndex:0]])
- NSBeep();
- [[outline_ window] makeFirstResponder:outline_];
-}
-
-static void addItem(NSMenu* menu, int command, SEL action) {
- [menu addItemWithTitle:l10n_util::GetNSStringWithFixup(command)
- action:action
- keyEquivalent:@""];
-}
-
-// Generates a context menu for the outline view.
-- (NSMenu*)menu {
- NSMenu* menu = [[[NSMenu alloc] initWithTitle:@""] autorelease];
- addItem(menu, IDS_BOOMARK_BAR_OPEN_IN_NEW_TAB, @selector(openItems:));
- if (showsLeaves_) {
- addItem(menu, IDS_BOOKMARK_MANAGER_SHOW_IN_FOLDER,
- @selector(revealSelectedItem:));
- }
- [menu addItem:[NSMenuItem separatorItem]];
- addItem(menu, IDS_BOOKMARK_BAR_EDIT, @selector(editTitle:));
- addItem(menu, IDS_BOOKMARK_BAR_REMOVE, @selector(delete:));
- [menu addItem:[NSMenuItem separatorItem]];
- addItem(menu, IDS_BOOMARK_BAR_NEW_FOLDER, @selector(newFolder:));
- for (NSMenuItem* item in [menu itemArray])
- [item setTarget:self];
- return menu;
-}
-
-// Selectively enables/disables menu commands.
-- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item {
- return [self validateAction:[item action]];
-}
-
-- (BOOL)validateAction:(SEL)action {
- NSArray* selected = [self actionItems];
- NSUInteger selCount = [selected count];
- if (action == @selector(copy:)) {
- return selCount > 0;
-
- } else if (action == @selector(cut:) || action == @selector(delete:)) {
- if (selCount == 0)
- return NO;
- for(BookmarkItem* item in selected) {
- if ([item isFixed])
- return NO;
- }
- return YES;
-
- } else if (action == @selector(paste:)) {
- return [self canInsert] &&
- [[NSPasteboard generalPasteboard] availableTypeFromArray:
- [outline_ registeredDraggedTypes]] != nil;
-
- } else if (action == @selector(openItems:)) {
- if (selCount == 0)
- return NO;
- // Disable if folder selected (if only because title says "Open In Tab".)
- for (BookmarkItem* item in selected) {
- if (![item URLString])
- return NO;
- }
- return YES;
-
- } else if (action == @selector(editTitle:)) {
- return selCount == 1 && ![[selected lastObject] isFixed];
-
- } else if (action == @selector(newFolder:)) {
- return [self canInsert];
-
- } else if (action == @selector(revealSelectedItem:)) {
- // Enable Show In Folder only in the flat list when
- // showing Recents or Search, and a URL is selected.
- return flat_ && [group_ isFake] &&
- selCount == 1 && [[selected lastObject] URLString];
-
- } else {
- return YES;
- }
-}
-
-
-#pragma mark -
-#pragma mark DATA SOURCE:
-
-
-// Returns the number of children of an item (NSOutlineView data source)
-- (NSInteger) outlineView:(NSOutlineView*)outlineView
- numberOfChildrenOfItem:(id)item {
- item = (item ? item : group_);
- return showsLeaves_ ? [item numberOfChildren] : [item numberOfChildFolders];
-}
-
-// Returns a child of an item (NSOutlineView data source)
-- (id)outlineView:(NSOutlineView*)outlineView
- child:(NSInteger)index
- ofItem:(id)item {
- item = (item ? item : group_);
- if (showsLeaves_)
- return [item childAtIndex:index];
- else
- return [item childFolderAtIndex:index];
-}
-
-// Returns whether an item is expandable (NSOutlineView data source)
-- (BOOL)outlineView:(NSOutlineView*)outlineView isItemExpandable:(id)item {
- if (flat_ || ![(item ? item : group_) isFolder])
- return NO;
- // In leafless mode, a folder with no subfolders isn't expandable.
- if (!showsLeaves_ && [item numberOfChildFolders] == 0)
- return NO;
- return YES;
-}
-
-- (id) outlineView:(NSOutlineView*)outlineView
- itemForPersistentObject:(id)persistentID {
- return [group_ itemWithPersistentID:persistentID];
-}
-
-- (id) outlineView:(NSOutlineView*)outlineView
- persistentObjectForItem:(id)item {
- item = (item ? item : group_);
- return [item persistentID];
-}
-
-
-// Returns the value to display in a cell (NSOutlineView data source)
-- (id) outlineView:(NSOutlineView*)outlineView
- objectValueForTableColumn:(NSTableColumn*)tableColumn
- byItem:(id)item {
- item = (item ? item : group_);
- NSString* ident = [tableColumn identifier];
- if ([ident isEqualToString:kTitleColIdent]) {
- return [item title];
- } else if ([ident isEqualToString:kURLColIdent]) {
- return [item URLString];
- } else if ([ident isEqualToString:kFolderColIdent]) {
- return [item folderPath];
- } else {
- NOTREACHED();
- return nil;
- }
-}
-
-// Stores the edited value of a cell (NSOutlineView data source)
-- (void)outlineView:(NSOutlineView*)outlineView
- setObjectValue:(id)value
- forTableColumn:(NSTableColumn*)tableColumn
- byItem:(id)item
-{
- item = (item ? item : group_);
- NSString* ident = [tableColumn identifier];
- if ([ident isEqualToString:kTitleColIdent]) {
- [item setTitle:value];
- } else if ([ident isEqualToString:kURLColIdent]) {
- if ([value length])
- [item setURLString:value];
- }
-}
-
-// Returns whether a cell is editable (NSOutlineView data source)
-- (BOOL) outlineView:(NSOutlineView*)outlineView
- shouldEditTableColumn:(NSTableColumn*)tableColumn
- item:(id)item {
- NSString* ident = [tableColumn identifier];
- if ([item isFixed])
- return NO;
- if ([ident isEqualToString:kURLColIdent] && [item isFolder])
- return NO;
- return YES;
-}
-
-// Sets a cell's icon before it's drawn (NSOutlineView data source)
-- (void)outlineView:(NSOutlineView*)outlineView
- willDisplayCell:(id)cell
- forTableColumn:(NSTableColumn*)tableColumn
- item:(id)item
-{
- // Use the bookmark/folder's icon.
- if ([[tableColumn identifier] isEqualToString:kTitleColIdent]) {
- item = (item ? item : group_);
- [cell setImage:[item icon]];
- }
-}
-
-// Updates the tree after the data model has changed.
-- (void)itemChanged:(BookmarkItem*)nodeItem
- childrenChanged:(BOOL)childrenChanged {
- if (nodeItem == group_)
- nodeItem = nil;
- NSArray* sel = [self selectedItems];
- [outline_ reloadItem:nodeItem reloadChildren:childrenChanged];
- [self setSelectedItems:sel];
-}
-
-@end
-
-
-@implementation BookmarksOutlineView
-
-- (BookmarkTreeController*)bookmarkController {
- return (BookmarkTreeController*)[self delegate];
-}
-
-- (NSRect)frameOfOutlineCellAtRow:(NSInteger)row {
- // If the controller is in flat view, don't reserve space for the triangles.
- BookmarkTreeController* controller = [self bookmarkController];
- if ([controller flat])
- return NSZeroRect;
- return [super frameOfOutlineCellAtRow:row];
-}
-
-- (IBAction)cut:(id)sender {
- [[self bookmarkController] cut:sender];
-}
-
-- (IBAction)copy:(id)sender {
- [[self bookmarkController] copy:sender];
-}
-
-- (IBAction)paste:(id)sender {
- [[self bookmarkController] paste:sender];
-}
-
-- (IBAction)delete:(id)sender {
- [[self bookmarkController] delete:sender];
-}
-
-- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item {
- return [[self bookmarkController] validateUserInterfaceItem:item];
-}
-
-- (void)keyDown:(NSEvent*)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:
- [[self bookmarkController] 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];
-}
-
-- (NSMenu*)menu {
- return [[self bookmarkController] menu];
-}
-
-@end
diff --git a/chrome/browser/cocoa/bookmark_tree_controller_pasteboard.mm b/chrome/browser/cocoa/bookmark_tree_controller_pasteboard.mm
deleted file mode 100644
index 9032657d..0000000
--- a/chrome/browser/cocoa/bookmark_tree_controller_pasteboard.mm
+++ /dev/null
@@ -1,426 +0,0 @@
-// Copyright (c) 2009 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 "chrome/browser/cocoa/bookmark_tree_controller.h"
-#import "base/logging.h"
-#import "chrome/browser/cocoa/bookmark_item.h"
-
-
-// Safari uses this type, though it's not declared in any header.
-static NSString* const BookmarkDictionaryListPboardType =
- @"BookmarkDictionaryListPboardType";
-
-// Mac WebKit uses this type, declared in WebKit/mac/History/WebURLsWithTitles.h
-static NSString* const WebURLsWithTitlesPboardType =
- @"WebURLsWithTitlesPboardType";
-
-// Used internally to identify intra-outline drags.
-static NSString* const kCustomPboardType =
- @"ChromeBookmarkTreeControllerPlaceholderType";
-
-// Remembers which items are being dragged, during a drag. Static because
-// there's by definition only one drag at a time, but multiple controllers.
-static scoped_nsobject<NSArray> sDraggedItems;
-
-
-@implementation BookmarkTreeController (Pasteboard)
-
-
-// One-time dnd setup; called from -awakeFromNib.
-- (void)registerDragTypes {
- [outline_ registerForDraggedTypes:[NSArray arrayWithObjects:
- BookmarkDictionaryListPboardType,
- WebURLsWithTitlesPboardType,
- NSURLPboardType, nil]];
- [outline_ setDraggingSourceOperationMask:NSDragOperationCopy |
- NSDragOperationMove
- forLocal:YES];
- [outline_ setDraggingSourceOperationMask:NSDragOperationCopy
- forLocal:NO];
-}
-
-// Selects a range of items in a parent item.
-- (void)selectItemsInFolder:(BookmarkItem*)parent
- atIndexes:(NSRange)childRange {
- DCHECK(NSMaxRange(childRange) <= (NSUInteger)[parent numberOfChildren]);
- if (parent != group_) {
- // If parent is not the root, need to offset range by parent's index:
- int startRow = [outline_ rowForItem:parent];
- if (startRow < 0) {
- return;
- }
- if ([outline_ isItemExpanded:parent]) {
- childRange.location += startRow + 1;
- } else {
- childRange.location = startRow;
- childRange.length = 1;
- }
- }
- NSIndexSet* indexes = [NSIndexSet indexSetWithIndexesInRange:childRange];
- [outline_ selectRowIndexes:indexes byExtendingSelection:NO];
-}
-
-
-#pragma mark -
-#pragma mark DRAGGING OUT AND COPYING:
-
-
-// Generates parallel arrays of URLs and titles for contents of an item.
-static void flattenItem(BookmarkItem* item,
- NSMutableArray* urlStrings,
- NSMutableArray* titles) {
- if ([item isFolder]) {
- NSUInteger n = [item numberOfChildren];
- for (NSUInteger i = 0; i < n; i++) {
- flattenItem([item childAtIndex:i], urlStrings, titles);
- }
- } else {
- NSString* urlStr = [item URLString];
- if (urlStr) {
- [urlStrings addObject:urlStr];
- [titles addObject:[item title]];
- }
- }
-}
-
-// Writes data to the pasteboard given a list of row items.
-- (BOOL)writeItems:(NSArray*)items
- toPasteboard:(NSPasteboard*)pb
- canMove:(BOOL)canMove {
- if ([items count] == 0) {
- return NO;
- }
-
- [pb declareTypes:[NSMutableArray arrayWithObjects:
- WebURLsWithTitlesPboardType,
- NSStringPboardType, nil]
- owner:self];
-
- // Add URLs and titles:
- NSMutableArray* urls = [NSMutableArray array];
- NSMutableArray* titles = [NSMutableArray array];
- for (BookmarkItem* item in items) {
- flattenItem(item, urls, titles);
- }
- [pb setPropertyList:[NSArray arrayWithObjects:urls, titles, nil]
- forType:WebURLsWithTitlesPboardType];
-
- // Add plain text, as one URL per line:
- [pb setString:[urls componentsJoinedByString:@"\n"]
- forType:NSStringPboardType];
-
- // If moves are allowed, remember the actual BookmarkItems in sDraggedItems,
- // and add a special pasteboard type to signal that they're there.
- if (canMove) {
- [pb addTypes:[NSArray arrayWithObject:kCustomPboardType] owner:self];
- [pb setData:[NSData data] forType:kCustomPboardType];
- }
-
- // Add single URL:
- if ([urls count] == 1) {
- [pb addTypes:[NSArray arrayWithObject:NSURLPboardType] owner:self];
- NSString* firstURLStr = [urls objectAtIndex:0];
- [pb setString:firstURLStr forType:NSURLPboardType];
- }
- return YES;
-}
-
-// Called after the pasteboard I've written to is no longer in use.
-- (void)pasteboardChangedOwner:(NSPasteboard*)sender {
- sDraggedItems.reset(nil);
-}
-
-// Invoked when dragging outline-view rows.
-- (BOOL)outlineView:(NSOutlineView*)outlineView
- writeItems:(NSArray*)items
- toPasteboard:(NSPasteboard*)pb {
- // Special items (bookmark bar, Recents...) cannot be moved.
- BOOL canMove = YES;
- for (BookmarkItem* item in items) {
- if ([item isFixed]) {
- canMove = NO;
- break;
- }
- }
-
- sDraggedItems.reset(canMove ? [items copy] : nil);
-
- [self writeItems:items toPasteboard:pb canMove:canMove];
- return YES;
-}
-
-
-// The Cut command.
-- (IBAction)cut:(id)sender {
- if ([self writeItems:[self actionItems]
- toPasteboard:[NSPasteboard generalPasteboard]
- canMove:NO]) {
- [self delete:self];
- } else {
- NSBeep();
- }
-}
-
-// The Copy command.
-- (IBAction)copy:(id)sender {
- if (![self copyToPasteboard:[NSPasteboard generalPasteboard]])
- NSBeep();
-}
-
-// Copy to any pasteboard.
-- (BOOL)copyToPasteboard:(NSPasteboard*)pb {
- return [self writeItems:[self actionItems]
- toPasteboard:pb
- canMove:NO];
-}
-
-
-#pragma mark -
-#pragma mark INCOMING DRAGS AND PASTING:
-
-
-// BookmarkDictionaryListPboardType represents bookmarks as dictionaries,
-// which have the following keys.
-// Strangely, folder items (whose WebBookmarkType is WebBookmarkTypeLeaf) have
-// their title under 'Title', while leaf items have it in 'URIDictionary.title'.
-static const NSString* kTitleKey = @"Title";
-static const NSString* kURIDictionaryKey = @"URIDictionary";
-static const NSString* kURIDictTitleKey = @"title";
-static const NSString* kURLStringKey = @"URLString";
-static const NSString* kTypeKey = @"WebBookmarkType";
-static const NSString* kLeafType = @"WebBookmarkTypeLeaf";
-//static const NSString* kListType = @"WebBookmarkTypeList"; // unused for now
-static const NSString* kChildrenKey = @"Children";
-
-// Helper that creates a dictionary in BookmarkDictionaryListPboardType format.
-// |name| may be nil, but |urlStr| is required.
-static NSDictionary* makeBookmarkPlistEntry(NSString* name, NSString* urlStr) {
- if (!name) {
- name = urlStr;
- }
- NSDictionary* nameDict = [NSDictionary dictionaryWithObject:name
- forKey:kURIDictTitleKey];
- return [NSDictionary dictionaryWithObjectsAndKeys:
- kLeafType, kTypeKey,
- nameDict, kURIDictionaryKey,
- urlStr, kURLStringKey,
- nil];
-}
-
-// Reads URL(s) off the pasteboard and returns them in BookmarkDictionaryList-
-// PboardType format, or nil on failure.
-- (NSArray*)readPropertyListFromPasteboard:(NSPasteboard*)pb {
- NSString* type = [pb availableTypeFromArray:
- [outline_ registeredDraggedTypes]];
- if ([type isEqualToString:BookmarkDictionaryListPboardType]) {
- // Safari's full bookmark plist type:
- return [pb propertyListForType:type];
-
- } else if ([type isEqualToString:WebURLsWithTitlesPboardType]) {
- // Safari's parallel-URLs-and-titles type:
- NSArray* contents = [pb propertyListForType:type];
- NSArray* urlStrings = [contents objectAtIndex:0];
- NSArray* titles = [contents objectAtIndex:1];
- NSUInteger n = [urlStrings count];
- if (n == 0 || [titles count] != n) {
- return nil;
- }
- NSMutableArray* plist = [NSMutableArray array];
- for (NSUInteger i = 0; i < n; i++) {
- [plist addObject:makeBookmarkPlistEntry([titles objectAtIndex:i],
- [urlStrings objectAtIndex:i])];
- }
- return plist;
-
- } else if ([type isEqualToString:NSURLPboardType]) {
- // Standard URL type:
- NSString* urlStr = [[NSURL URLFromPasteboard:pb] absoluteString];
- if (!urlStr) {
- return nil;
- }
- NSString* title = [pb stringForType:@"public.url-name"];
- if (!title)
- title = [pb stringForType:NSStringPboardType];
- return [NSArray arrayWithObject:makeBookmarkPlistEntry(title, urlStr)];
-
- } else {
- return nil;
- }
-}
-
-- (BOOL)isDirectDrag:(id<NSDraggingInfo>)info {
- if (!sDraggedItems)
- return NO;
- if (![[[info draggingPasteboard] types] containsObject:kCustomPboardType])
- return NO;
- id source = [info draggingSource];
- return [source isKindOfClass:[BookmarksOutlineView class]];
-}
-
-// Moves BookmarkItems into a parent folder, then selects them.
-- (void)moveItems:(NSArray*)items
- toFolder:(BookmarkItem*)dstParent
- atIndex:(int)dstIndex {
- for (BookmarkItem* srcItem in items) {
- // Use an autorelease pool to clean up after the various observers that
- // get called after each individual bookmark change.
- NSAutoreleasePool* pool = [NSAutoreleasePool new];
- BookmarkItem* srcParent = [srcItem parent];
- int srcIndex = [srcParent indexOfChild:srcItem];
- [dstParent moveItem:srcItem toIndex:dstIndex];
- if (srcParent != dstParent || srcIndex >= dstIndex) {
- dstIndex++;
- }
- [pool drain];
- }
-
- NSRange selRange = {dstIndex - [items count], [items count]};
- [self selectItemsInFolder:dstParent atIndexes:selRange];
-}
-
-// Inserts bookmarks in BookmarkDictionaryListPboardType into a folder item.
-- (BOOL)insertPropertyList:(NSArray*)plist
- inFolder:(BookmarkItem*)dstParent
- atIndex:(NSInteger)dstIndex {
- if (!plist || !dstParent || dstIndex < 0)
- return NO;
- NSInteger i = 0;
- for (NSDictionary* plistItem in plist) {
- // Use an autorelease pool to clean up after the various observers that
- // get called after each individual bookmark change.
- NSAutoreleasePool* pool = [NSAutoreleasePool new];
- if ([[plistItem objectForKey:kTypeKey] isEqual:kLeafType]) {
- NSString* title = [[plistItem objectForKey:kURIDictionaryKey]
- objectForKey:kURIDictTitleKey];
- NSString* urlStr = [plistItem objectForKey:kURLStringKey];
- if (title && urlStr) {
- BookmarkItem* newItem = [dstParent addBookmarkWithTitle:title
- URL:urlStr
- atIndex:dstIndex + i];
- // It is possible for that call to fail if urlStr isn't a valid URL.
- if (newItem)
- ++i;
- }
- } else {
- NSString* title = [plistItem objectForKey:kTitleKey];
- NSArray* children = [plistItem objectForKey:kChildrenKey];
- if (title && children) {
- BookmarkItem* newFolder = [dstParent addFolderWithTitle:title
- atIndex:dstIndex + i];
- ++i;
- [self insertPropertyList:children
- inFolder:newFolder
- atIndex:0];
- }
- }
- [pool drain];
- }
- [self selectItemsInFolder:dstParent
- atIndexes:NSMakeRange(dstIndex, i)];
- return YES;
-}
-
-// Determine the parent to insert into and the child index to insert at.
-- (BookmarkItem*)itemForDropOnItem:(BookmarkItem*)item
- proposedIndex:(NSInteger*)childIndex {
- BookmarkItem* targetItem = item ? item : group_;
- if ([targetItem isFolder]) {
- if (*childIndex == NSOutlineViewDropOnItemIndex) {
- // Insert it at the end, if we were dropping on it
- *childIndex = [targetItem numberOfChildren];
- }
- } else {
- if (*childIndex == NSOutlineViewDropOnItemIndex) {
- // Can't drop directly on a leaf.
- return nil;
- } else {
- // We will be dropping on the item's parent at the target index
- // of this child, plus one.
- BookmarkItem* oldTargetItem = targetItem;
- targetItem = [targetItem parent];
- *childIndex = [targetItem indexOfChild:oldTargetItem] + 1;
- }
- }
- if ([targetItem isFake]) {
- targetItem = nil;
- }
- return targetItem;
-}
-
-// Validates whether or not the proposed drop is valid.
-- (NSDragOperation)outlineView:(NSOutlineView*)outlineView
- validateDrop:(id <NSDraggingInfo>)info
- proposedItem:(id)item
- proposedChildIndex:(NSInteger)childIndex {
- // Determine the parent to insert into and the child index to insert at.
- BookmarkItem* targetItem = [self itemForDropOnItem:item
- proposedIndex:&childIndex];
- if (!targetItem)
- return NSDragOperationNone;
-
- // Dragging within the outline?
- if ([self isDirectDrag:info]) {
- // If dragging within the tree, we see if we are dragging from ourselves
- // and dropping into a descendant, which wouldn't be allowed...
- for (BookmarkItem* draggedItem in sDraggedItems.get()) {
- if ([draggedItem hasDescendant:targetItem]) {
- return NSDragOperationNone;
- }
- }
- return NSDragOperationMove;
- }
-
- // Drag from elsewhere is a copy.
- return NSDragOperationCopy;
-}
-
-// Actually handles the drop.
-- (BOOL)outlineView:(NSOutlineView*)outlineView
- acceptDrop:(id <NSDraggingInfo>)info
- item:(id)item
- childIndex:(NSInteger)childIndex
-{
- // Determine the parent to insert into and the child index to insert at.
- BookmarkItem* targetItem = [self itemForDropOnItem:item
- proposedIndex:&childIndex];
- if (!targetItem)
- return NO;
-
- if ([self isDirectDrag:info]) {
- // If the source was ourselves, move the selected items.
- [self moveItems:sDraggedItems
- toFolder:targetItem
- atIndex:childIndex];
- return YES;
- } else {
- // Else copy.
- NSArray* plist = [self readPropertyListFromPasteboard:
- [info draggingPasteboard]];
- return [self insertPropertyList:plist
- inFolder:targetItem
- atIndex:childIndex];
- }
-}
-
-
-// The Paste command.
-- (IBAction)paste:(id)sender {
- if (![self pasteFromPasteboard:[NSPasteboard generalPasteboard]])
- NSBeep();
-}
-
-- (BOOL)pasteFromPasteboard:(NSPasteboard*)pb {
- NSArray* plist = [self readPropertyListFromPasteboard:pb];
- if (!plist)
- return NO;
-
- BookmarkItem* parentItem;
- NSUInteger childIndex;
- return [self getInsertionParent:&parentItem index:&childIndex] &&
- [self insertPropertyList:plist
- inFolder:parentItem
- atIndex:childIndex];
-}
-
-@end
diff --git a/chrome/browser/cocoa/bookmark_tree_controller_unittest.mm b/chrome/browser/cocoa/bookmark_tree_controller_unittest.mm
deleted file mode 100644
index b33fd8e..0000000
--- a/chrome/browser/cocoa/bookmark_tree_controller_unittest.mm
+++ /dev/null
@@ -1,360 +0,0 @@
-// Copyright (c) 2009 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.
-
-#include "base/scoped_nsobject.h"
-#import "chrome/browser/cocoa/bookmark_item.h"
-#import "chrome/browser/cocoa/bookmark_manager_controller.h"
-#import "chrome/browser/cocoa/bookmark_tree_controller.h"
-#include "chrome/browser/cocoa/browser_test_helper.h"
-#import "chrome/browser/cocoa/cocoa_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-// Mac WebKit uses this type, declared in WebKit/mac/History/WebURLsWithTitles.h
-static NSString* const WebURLsWithTitlesPboardType =
- @"WebURLsWithTitlesPboardType";
-
-namespace {
-
-class BookmarkTreeControllerTest : public CocoaTest {
- public:
- void SetUp() {
- CocoaTest::SetUp();
- pasteboard_ = [NSPasteboard pasteboardWithUniqueName];
- manager_ = [BookmarkManagerController showBookmarkManager:
- browser_test_helper_.profile()];
- ASSERT_TRUE(manager_);
- listController_ = [manager_ listController];
- ASSERT_TRUE(listController_);
- groupsController_ = [manager_ groupsController];
- ASSERT_TRUE(groupsController_);
- }
-
- void TearDown() {
- [manager_ close];
- [pasteboard_ releaseGlobally];
- CocoaTest::TearDown();
- }
-
- BookmarkItem* SelectBar() {
- BookmarkItem* bar = [manager_ bookmarkBarItem];
- EXPECT_TRUE(bar);
- [[manager_ groupsController] setSelectedItem:bar];
- return bar;
- }
-
- BookmarkItem* AddToBar(NSString*title, NSString* urlStr) {
- BookmarkItem* bar = [manager_ bookmarkBarItem];
- return [bar addBookmarkWithTitle:title
- URL:urlStr
- atIndex:[bar numberOfChildren]];
- }
-
- BookmarkItem* AddFolderToBar(NSString* title) {
- BookmarkItem* bar = [manager_ bookmarkBarItem];
- return [bar addFolderWithTitle:title
- atIndex:[bar numberOfChildren]];
- }
-
- BrowserTestHelper browser_test_helper_;
- BookmarkManagerController* manager_;
- BookmarkTreeController* listController_;
- BookmarkTreeController* groupsController_;
- NSPasteboard* pasteboard_;
-};
-
-TEST_F(BookmarkTreeControllerTest, Model) {
- // Select nothing in the group list and check tree is empty:
- BookmarkTreeController* groupsController = [manager_ groupsController];
- [groupsController setSelectedItem:nil];
- EXPECT_EQ(nil, [listController_ group]);
-
- // Select the bookmarks bar and check that it's shown in the tree:
- BookmarkItem* bar = SelectBar();
- EXPECT_EQ(bar, [listController_ group]);
-}
-
-TEST_F(BookmarkTreeControllerTest, Selection) {
- SelectBar();
- BookmarkItem* test1 = AddToBar(@"Test 1", @"http://example.com/test1");
- BookmarkItem* test2 = AddToBar(@"Test 2", @"http://example.com/test2");
- BookmarkItem* test3 = AddToBar(@"Test 3", @"http://example.com/test3");
- EXPECT_EQ(0U, [[listController_ selectedItems] count]);
-
- NSArray* sel = [NSArray arrayWithObject:test2];
- [listController_ setSelectedItems:sel];
- EXPECT_TRUE([sel isEqual:[listController_ selectedItems]]);
- sel = [NSArray arrayWithObjects:test1, test3, nil];
- [listController_ setSelectedItems:sel];
- EXPECT_TRUE([sel isEqual:[listController_ selectedItems]]);
- sel = [NSArray arrayWithObjects:test1, test2, test3, nil];
- [listController_ setSelectedItems:sel];
- EXPECT_TRUE([sel isEqual:[listController_ selectedItems]]);
- sel = [NSArray array];
- [listController_ setSelectedItems:sel];
- EXPECT_TRUE([sel isEqual:[listController_ selectedItems]]);
-}
-
-TEST_F(BookmarkTreeControllerTest, NewFolder) {
- // Select Bookmark Bar in tree and create a new folder:
- BookmarkItem* bar = SelectBar();
- EXPECT_EQ(0U, [bar numberOfChildren]);
- BookmarkItem* parent = nil;
- NSUInteger index = 0;
- EXPECT_TRUE([groupsController_ getInsertionParent:&parent index:&index]);
- EXPECT_EQ(bar, parent);
- EXPECT_EQ(0U, index);
- BookmarkItem* newFolder = [groupsController_ newFolderWithTitle:@""];
-
- // Verify the new folder exists and is selected:
- ASSERT_EQ(1U, [bar numberOfChildren]);
- EXPECT_EQ(newFolder, [bar childAtIndex:0]);
- EXPECT_EQ(newFolder, [groupsController_ selectedItem]);
-
- // Do New Folder again:
- EXPECT_TRUE([groupsController_ getInsertionParent:&parent index:&index]);
- EXPECT_EQ(bar, parent);
- EXPECT_EQ(0U, index);
- EXPECT_TRUE([listController_ getInsertionParent:&parent index:&index]);
- EXPECT_EQ(newFolder, parent);
- EXPECT_EQ(0U, index);
- newFolder = [groupsController_ newFolderWithTitle:@""];
-
- // Verify the new folder exists and is selected:
- ASSERT_EQ(2U, [bar numberOfChildren]);
- EXPECT_EQ(newFolder, [bar childAtIndex:0]);
- EXPECT_EQ(newFolder, [groupsController_ selectedItem]);
-
- // Verify it's possible to add to Other Bookmarks:
- [groupsController_ setSelectedItem:[manager_ otherBookmarksItem]];
- EXPECT_TRUE([groupsController_ canInsert]);
- EXPECT_TRUE([listController_ canInsert]);
-
- // Verify it's not possible to add to Recents:
- [groupsController_ setSelectedItem:[manager_ recentGroup]];
- EXPECT_FALSE([groupsController_ canInsert]);
- EXPECT_FALSE([listController_ canInsert]);
-}
-
-TEST_F(BookmarkTreeControllerTest, Deletion) {
- // Create a new folder in the bookmarks bar:
- SelectBar();
- BookmarkItem* newFolder = [groupsController_ newFolderWithTitle:@""];
- ASSERT_TRUE(newFolder);
- ASSERT_EQ(newFolder, [groupsController_ selectedItem]);
-
- // Now delete the folder and make sure it's not still selected/shown:
- [groupsController_ delete:nil];
- ASSERT_EQ(0U, [[manager_ bookmarkBarItem] numberOfChildren]);
- BookmarkItem* newSel = [groupsController_ selectedItem];
- EXPECT_NE(newFolder, newSel);
- EXPECT_EQ(newSel, [listController_ group]);
-}
-
-TEST_F(BookmarkTreeControllerTest, MoveItems) {
- NSOutlineView* outline = [groupsController_ outline];
- ASSERT_TRUE(outline);
-
- // Add three folders and another one we'll drop some into:
- BookmarkItem* bookmarkBar = SelectBar();
- BookmarkItem* test1 = AddFolderToBar(@"Test 1");
- BookmarkItem* test2 = AddFolderToBar(@"Test 2");
- BookmarkItem* folder = AddFolderToBar(@"Folder");
- BookmarkItem* test3 = AddFolderToBar(@"Test 3");
- EXPECT_TRUE([groupsController_ expandItem:bookmarkBar]);
-
- // Verify NSOutlineView hierarchy.
- EXPECT_EQ(0, [outline rowForItem:bookmarkBar]);
- EXPECT_EQ(1, [outline rowForItem:test1]);
- EXPECT_EQ(2, [outline rowForItem:test2]);
- EXPECT_EQ(3, [outline rowForItem:folder]);
- EXPECT_EQ(4, [outline rowForItem:test3]);
- EXPECT_EQ(bookmarkBar, [outline parentForItem:test1]);
- EXPECT_EQ(bookmarkBar, [outline parentForItem:test2]);
- EXPECT_EQ(bookmarkBar, [outline parentForItem:folder]);
- EXPECT_EQ(bookmarkBar, [outline parentForItem:test3]);
-
- // Check where dropped URLs would go:
- NSInteger dropIndex = 0;
- BookmarkItem* target = [groupsController_ itemForDropOnItem:folder
- proposedIndex:&dropIndex];
- EXPECT_EQ(folder, target);
- EXPECT_EQ(0, dropIndex);
-
- dropIndex = NSOutlineViewDropOnItemIndex;
- target = [groupsController_ itemForDropOnItem:folder
- proposedIndex:&dropIndex];
- EXPECT_EQ(folder, target);
- EXPECT_EQ(0, dropIndex);
-
- // Move the first and third item into the folder.
- [groupsController_ moveItems:[NSMutableArray arrayWithObjects:test1, test3, nil]
- toFolder:folder
- atIndex:0];
-
- // Verify bookmark model hierarchy.
- EXPECT_EQ(folder, [test1 parent]);
- EXPECT_EQ(folder, [test3 parent]);
- EXPECT_EQ(bookmarkBar, [folder parent]);
- EXPECT_EQ(bookmarkBar, [test2 parent]);
-
- // Verify NSOutlineView hierarchy. test1 and test3 should be in the folder.
- EXPECT_TRUE([groupsController_ expandItem:folder]);
- EXPECT_TRUE([outline isItemExpanded:folder]);
- EXPECT_EQ(bookmarkBar, [outline parentForItem:test2]);
- EXPECT_EQ(bookmarkBar, [outline parentForItem:folder]);
- EXPECT_EQ(folder, [outline parentForItem:test1]);
- EXPECT_EQ(folder, [outline parentForItem:test3]);
-
- // Verify the folder is selected.
- EXPECT_TRUE([[outline selectedRowIndexes]
- isEqual:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(2, 1)]]);
- NSArray* sel = [groupsController_ selectedItems];
- EXPECT_TRUE([sel isEqual:([NSArray arrayWithObject:folder])]);
-}
-
-TEST_F(BookmarkTreeControllerTest, MoveItemsFlat) {
- // Add three bookmarks and a folder.
- NSOutlineView* outline = [listController_ outline];
- SelectBar();
- BookmarkItem* test1 = AddToBar(@"Test 1", @"http://example.com/test1");
- BookmarkItem* test2 = AddToBar(@"Test 2", @"http://example.com/test2");
- BookmarkItem* folder = AddFolderToBar(@"Folder");
- BookmarkItem* test3 = AddToBar(@"Test 3", @"http://example.com/test3");
-
- BookmarkItem* group = [listController_ group];
-
- // Check where dropped URLs would go:
- NSInteger dropIndex = NSOutlineViewDropOnItemIndex;
- BookmarkItem* target = [listController_ itemForDropOnItem:test1
- proposedIndex:&dropIndex];
- EXPECT_EQ(nil, target);
- dropIndex = 0;
- target = [listController_ itemForDropOnItem:test1
- proposedIndex:&dropIndex];
- EXPECT_EQ(group, target);
- EXPECT_EQ(1, dropIndex);
- dropIndex = 0;
- target = [listController_ itemForDropOnItem:folder
- proposedIndex:&dropIndex];
- EXPECT_EQ(folder, target);
- EXPECT_EQ(0, dropIndex);
- dropIndex = NSOutlineViewDropOnItemIndex;
- target = [listController_ itemForDropOnItem:folder
- proposedIndex:&dropIndex];
- EXPECT_EQ(folder, target);
- EXPECT_EQ(0, dropIndex);
-
- // Move the first and third item into the folder.
- [listController_ moveItems:[NSArray arrayWithObjects:test1, test3, nil]
- toFolder:folder
- atIndex:0];
-
- // Verify bookmark model hierarchy.
- EXPECT_EQ(folder, [test1 parent]);
- EXPECT_EQ(folder, [test3 parent]);
- EXPECT_EQ(group, [folder parent]);
- EXPECT_EQ(group, [test2 parent]);
-
- // Verify NSOutlineView hierarchy. test1 and test3 should be gone now.
- EXPECT_EQ(-1, [outline rowForItem:test1]);
- EXPECT_EQ(-1, [outline rowForItem:test3]);
- EXPECT_EQ(nil, [outline parentForItem:test2]);
- EXPECT_EQ(nil, [outline parentForItem:folder]);
-}
-
-TEST_F(BookmarkTreeControllerTest, CopyURLs) {
- SelectBar();
- AddToBar(@"Test 1", @"http://example.com/test1");
- AddToBar(@"Test 2", @"http://example.com/test2");
- AddToBar(@"Test 3", @"http://example.com/test3");
- [[listController_ outline] selectAll:listController_];
-
- ASSERT_TRUE([listController_ copyToPasteboard:pasteboard_]);
-
- NSArray* contents = [pasteboard_ propertyListForType:
- WebURLsWithTitlesPboardType];
- ASSERT_TRUE([contents isKindOfClass:[NSArray class]]);
- NSArray* urlStrings = [contents objectAtIndex:0];
- EXPECT_TRUE([urlStrings isKindOfClass:[NSArray class]]);
- NSArray* expectedURLStrings = [NSArray arrayWithObjects:
- @"http://example.com/test1",
- @"http://example.com/test2",
- @"http://example.com/test3", nil];
- EXPECT_TRUE([urlStrings isEqual:expectedURLStrings]);
- NSArray* titles = [contents objectAtIndex:1];
- EXPECT_TRUE([titles isKindOfClass:[NSArray class]]);
- NSArray* expectedTitles = [NSArray arrayWithObjects:
- @"Test 1",
- @"Test 2",
- @"Test 3", nil];
- EXPECT_TRUE([titles isEqual:expectedTitles]);
-
- NSString* str = [pasteboard_ stringForType:NSStringPboardType];
- EXPECT_TRUE([str isEqual:
- @"http://example.com/test1\n"
- "http://example.com/test2\n"
- "http://example.com/test3"]);
-
- EXPECT_FALSE([pasteboard_ dataForType:NSURLPboardType]);
-}
-
-TEST_F(BookmarkTreeControllerTest, PasteSingleURL) {
- [pasteboard_ declareTypes:[NSArray arrayWithObjects:
- NSURLPboardType, @"public.url-name", nil]
- owner:nil];
- [[NSURL URLWithString:@"http://google.com/"] writeToPasteboard:pasteboard_];
- [pasteboard_ setString:@"Gooooogle" forType:@"public.url-name"];
-
- SelectBar();
- AddToBar(@"Test 1", @"http://example.com/test1");
- AddToBar(@"Test 2", @"http://example.com/test2");
- AddToBar(@"Test 3", @"http://example.com/test3");
-
- ASSERT_TRUE([listController_ pasteFromPasteboard:pasteboard_]);
- EXPECT_EQ(4, [[listController_ outline] numberOfRows]);
- EXPECT_EQ(3, [[listController_ outline] selectedRow]);
- NSArray* sel = [listController_ selectedItems];
- ASSERT_EQ(1U, [sel count]);
- BookmarkItem* item = [sel objectAtIndex:0];
- EXPECT_TRUE([@"http://google.com/" isEqual:[item URLString]]);
- EXPECT_TRUE([@"Gooooogle" isEqual:[item title]]);
-}
-
-TEST_F(BookmarkTreeControllerTest, PasteMultipleURLs) {
- [pasteboard_ declareTypes:[NSArray arrayWithObjects:
- WebURLsWithTitlesPboardType,
- NSURLPboardType, nil]
- owner:nil];
- NSMutableArray* urls = [NSArray arrayWithObjects:
- @"http://google.com/", @"http://chromium.org/", nil];
- NSMutableArray* titles = [NSArray arrayWithObjects:
- @"Gooooogle", @"Chrooooomium", nil];
- [pasteboard_ setPropertyList:[NSArray arrayWithObjects:urls, titles, nil]
- forType:WebURLsWithTitlesPboardType];
- [[NSURL URLWithString:@"http://example.com"] writeToPasteboard:pasteboard_];
-
- SelectBar();
- AddToBar(@"Test 1", @"http://example.com/test1");
- BookmarkItem* test2 = AddToBar(@"Test 2", @"http://example.com/test2");
- AddToBar(@"Test 3", @"http://example.com/test3");
- [listController_ setSelectedItems:[NSArray arrayWithObject:test2]];
-
- EXPECT_TRUE([listController_ readPropertyListFromPasteboard:pasteboard_]);
- ASSERT_TRUE([listController_ pasteFromPasteboard:pasteboard_]);
- EXPECT_EQ(5, [[listController_ outline] numberOfRows]);
- EXPECT_TRUE([[[listController_ outline] selectedRowIndexes]
- isEqual:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 2)]]);
- NSArray* sel = [listController_ selectedItems];
- ASSERT_EQ(2U, [sel count]);
-
- BookmarkItem* item = [sel objectAtIndex:0];
- EXPECT_TRUE([@"http://google.com/" isEqual:[item URLString]]);
- EXPECT_TRUE([@"Gooooogle" isEqual:[item title]]);
- item = [sel objectAtIndex:1];
- EXPECT_TRUE([@"http://chromium.org/" isEqual:[item URLString]]);
- EXPECT_TRUE([@"Chrooooomium" isEqual:[item title]]);
-}
-
-} // namespace
diff --git a/chrome/browser/cocoa/browser_window_cocoa.mm b/chrome/browser/cocoa/browser_window_cocoa.mm
index 7df9ee1..0de692f 100644
--- a/chrome/browser/cocoa/browser_window_cocoa.mm
+++ b/chrome/browser/cocoa/browser_window_cocoa.mm
@@ -11,7 +11,6 @@
#include "chrome/app/chrome_dll_resource.h"
#include "chrome/browser/bookmarks/bookmark_utils.h"
#include "chrome/browser/browser_list.h"
-#import "chrome/browser/cocoa/bookmark_manager_controller.h"
#import "chrome/browser/cocoa/browser_window_controller.h"
#import "chrome/browser/cocoa/bug_report_window_controller.h"
#import "chrome/browser/cocoa/chrome_browser_window.h"
@@ -266,7 +265,8 @@ void BrowserWindowCocoa::ShowTaskManager() {
}
void BrowserWindowCocoa::ShowBookmarkManager() {
- [BookmarkManagerController showBookmarkManager:browser_->profile()];
+ // TODO(viettrungluu): Remove function when no callers remain. crbug.com/38908
+ NOTIMPLEMENTED();
}
void BrowserWindowCocoa::ShowBookmarkBubble(const GURL& url,