blob: b8af440eeeba1e3d51b102b273d8458aa5fdc952 [file] [log] [blame]
// Copyright 2013 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 "chrome/browser/ui/bookmarks/bookmark_editor.h"
#include "base/logging.h"
#include "grit/generated_resources.h"
namespace {
const BookmarkNode* CreateNewNode(BookmarkModel* model,
const BookmarkNode* parent,
const BookmarkEditor::EditDetails& details,
const base::string16& new_title,
const GURL& new_url) {
const BookmarkNode* node;
// When create the new one to right-clicked folder, add it to the next to the
// folder's position. Because |details.index| has a index of the folder when
// it was right-clicked, it might cause out of range exception when another
// bookmark manager edits contents of the folder.
// So we must check the range.
int child_count = parent->child_count();
int insert_index = (parent == details.parent_node && details.index >= 0 &&
details.index <= child_count) ?
details.index : child_count;
if (details.type == BookmarkEditor::EditDetails::NEW_URL) {
node = model->AddURL(parent, insert_index, new_title, new_url);
} else if (details.type == BookmarkEditor::EditDetails::NEW_FOLDER) {
node = model->AddFolder(parent, insert_index, new_title);
for (size_t i = 0; i < details.urls.size(); ++i) {
model->AddURL(node, node->child_count(), details.urls[i].second,
details.urls[i].first);
}
model->SetDateFolderModified(parent, base::Time::Now());
} else {
NOTREACHED();
return NULL;
}
return node;
}
} // namespace
BookmarkEditor::EditDetails::EditDetails(Type node_type)
: type(node_type), existing_node(NULL), parent_node(NULL), index(-1) {
}
BookmarkNode::Type BookmarkEditor::EditDetails::GetNodeType() const {
BookmarkNode::Type node_type = BookmarkNode::URL;
switch (type) {
case EXISTING_NODE:
node_type = existing_node->type();
break;
case NEW_URL:
node_type = BookmarkNode::URL;
break;
case NEW_FOLDER:
node_type = BookmarkNode::FOLDER;
break;
default:
NOTREACHED();
}
return node_type;
}
int BookmarkEditor::EditDetails::GetWindowTitleId() const {
int dialog_title = IDS_BOOKMARK_EDITOR_TITLE;
switch (type) {
case EditDetails::EXISTING_NODE:
case EditDetails::NEW_URL:
dialog_title = (type == EditDetails::EXISTING_NODE &&
existing_node->type() == BookmarkNode::FOLDER) ?
IDS_BOOKMARK_FOLDER_EDITOR_WINDOW_TITLE :
IDS_BOOKMARK_EDITOR_TITLE;
break;
case EditDetails::NEW_FOLDER:
dialog_title = urls.empty() ?
IDS_BOOKMARK_FOLDER_EDITOR_WINDOW_TITLE_NEW :
IDS_BOOKMARK_ALL_TABS_DIALOG_TITLE;
break;
default:
NOTREACHED();
}
return dialog_title;
}
BookmarkEditor::EditDetails BookmarkEditor::EditDetails::EditNode(
const BookmarkNode* node) {
EditDetails details(EXISTING_NODE);
details.existing_node = node;
if (node)
details.parent_node = node->parent();
return details;
}
BookmarkEditor::EditDetails BookmarkEditor::EditDetails::AddNodeInFolder(
const BookmarkNode* parent_node,
int index,
const GURL& url,
const base::string16& title) {
EditDetails details(NEW_URL);
details.parent_node = parent_node;
details.index = index;
details.url = url;
details.title = title;
return details;
}
BookmarkEditor::EditDetails BookmarkEditor::EditDetails::AddFolder(
const BookmarkNode* parent_node,
int index) {
EditDetails details(NEW_FOLDER);
details.parent_node = parent_node;
details.index = index;
return details;
}
BookmarkEditor::EditDetails::~EditDetails() {}
// static
const BookmarkNode* BookmarkEditor::ApplyEditsWithNoFolderChange(
BookmarkModel* model,
const BookmarkNode* parent,
const EditDetails& details,
const base::string16& new_title,
const GURL& new_url) {
if (details.type == EditDetails::NEW_URL ||
details.type == EditDetails::NEW_FOLDER) {
return CreateNewNode(model, parent, details, new_title, new_url);
}
const BookmarkNode* node = details.existing_node;
DCHECK(node);
if (node->is_url())
model->SetURL(node, new_url);
model->SetTitle(node, new_title);
return node;
}
// static
const BookmarkNode* BookmarkEditor::ApplyEditsWithPossibleFolderChange(
BookmarkModel* model,
const BookmarkNode* new_parent,
const EditDetails& details,
const base::string16& new_title,
const GURL& new_url) {
if (details.type == EditDetails::NEW_URL ||
details.type == EditDetails::NEW_FOLDER) {
return CreateNewNode(model, new_parent, details, new_title, new_url);
}
const BookmarkNode* node = details.existing_node;
DCHECK(node);
if (new_parent != node->parent())
model->Move(node, new_parent, new_parent->child_count());
if (node->is_url())
model->SetURL(node, new_url);
model->SetTitle(node, new_title);
return node;
}