// 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 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; }