Home | History | Annotate | Download | only in bookmarks
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/bookmarks/bookmark_editor.h"
      6 
      7 #include "base/logging.h"
      8 #include "grit/generated_resources.h"
      9 
     10 namespace {
     11 
     12 const BookmarkNode* CreateNewNode(BookmarkModel* model,
     13                                   const BookmarkNode* parent,
     14                                   const BookmarkEditor::EditDetails& details,
     15                                   const base::string16& new_title,
     16                                   const GURL& new_url) {
     17   const BookmarkNode* node;
     18   // When create the new one to right-clicked folder, add it to the next to the
     19   // folder's position. Because |details.index| has a index of the folder when
     20   // it was right-clicked, it might cause out of range exception when another
     21   // bookmark manager edits contents of the folder.
     22   // So we must check the range.
     23   int child_count = parent->child_count();
     24   int insert_index = (parent == details.parent_node && details.index >= 0 &&
     25                       details.index <= child_count) ?
     26                       details.index : child_count;
     27   if (details.type == BookmarkEditor::EditDetails::NEW_URL) {
     28     node = model->AddURL(parent, insert_index, new_title, new_url);
     29   } else if (details.type == BookmarkEditor::EditDetails::NEW_FOLDER) {
     30     node = model->AddFolder(parent, insert_index, new_title);
     31     for (size_t i = 0; i < details.urls.size(); ++i) {
     32       model->AddURL(node, node->child_count(), details.urls[i].second,
     33                     details.urls[i].first);
     34     }
     35     model->SetDateFolderModified(parent, base::Time::Now());
     36   } else {
     37     NOTREACHED();
     38     return NULL;
     39   }
     40 
     41   return node;
     42 }
     43 
     44 }  // namespace
     45 
     46 BookmarkEditor::EditDetails::EditDetails(Type node_type)
     47     : type(node_type), existing_node(NULL), parent_node(NULL), index(-1) {
     48 }
     49 
     50 BookmarkNode::Type BookmarkEditor::EditDetails::GetNodeType() const {
     51   BookmarkNode::Type node_type = BookmarkNode::URL;
     52   switch (type) {
     53     case EXISTING_NODE:
     54       node_type = existing_node->type();
     55       break;
     56     case NEW_URL:
     57       node_type = BookmarkNode::URL;
     58       break;
     59     case NEW_FOLDER:
     60       node_type = BookmarkNode::FOLDER;
     61       break;
     62     default:
     63       NOTREACHED();
     64   }
     65   return node_type;
     66 }
     67 
     68 int BookmarkEditor::EditDetails::GetWindowTitleId() const {
     69   int dialog_title = IDS_BOOKMARK_EDITOR_TITLE;
     70   switch (type) {
     71     case EditDetails::EXISTING_NODE:
     72     case EditDetails::NEW_URL:
     73       dialog_title = (type == EditDetails::EXISTING_NODE &&
     74                       existing_node->type() == BookmarkNode::FOLDER) ?
     75           IDS_BOOKMARK_FOLDER_EDITOR_WINDOW_TITLE :
     76           IDS_BOOKMARK_EDITOR_TITLE;
     77       break;
     78     case EditDetails::NEW_FOLDER:
     79       dialog_title = urls.empty() ?
     80           IDS_BOOKMARK_FOLDER_EDITOR_WINDOW_TITLE_NEW :
     81           IDS_BOOKMARK_ALL_TABS_DIALOG_TITLE;
     82       break;
     83     default:
     84       NOTREACHED();
     85   }
     86   return dialog_title;
     87 }
     88 
     89 BookmarkEditor::EditDetails BookmarkEditor::EditDetails::EditNode(
     90     const BookmarkNode* node) {
     91   EditDetails details(EXISTING_NODE);
     92   details.existing_node = node;
     93   if (node)
     94     details.parent_node = node->parent();
     95   return details;
     96 }
     97 
     98 BookmarkEditor::EditDetails BookmarkEditor::EditDetails::AddNodeInFolder(
     99     const BookmarkNode* parent_node,
    100     int index,
    101     const GURL& url,
    102     const base::string16& title) {
    103   EditDetails details(NEW_URL);
    104   details.parent_node = parent_node;
    105   details.index = index;
    106   details.url = url;
    107   details.title = title;
    108   return details;
    109 }
    110 
    111 BookmarkEditor::EditDetails BookmarkEditor::EditDetails::AddFolder(
    112     const BookmarkNode* parent_node,
    113     int index) {
    114   EditDetails details(NEW_FOLDER);
    115   details.parent_node = parent_node;
    116   details.index = index;
    117   return details;
    118 }
    119 
    120 BookmarkEditor::EditDetails::~EditDetails() {}
    121 
    122 // static
    123 const BookmarkNode* BookmarkEditor::ApplyEditsWithNoFolderChange(
    124     BookmarkModel* model,
    125     const BookmarkNode* parent,
    126     const EditDetails& details,
    127     const base::string16& new_title,
    128     const GURL& new_url) {
    129   if (details.type == EditDetails::NEW_URL ||
    130       details.type == EditDetails::NEW_FOLDER) {
    131     return CreateNewNode(model, parent, details, new_title, new_url);
    132   }
    133 
    134   const BookmarkNode* node = details.existing_node;
    135   DCHECK(node);
    136 
    137   if (node->is_url())
    138     model->SetURL(node, new_url);
    139   model->SetTitle(node, new_title);
    140 
    141   return node;
    142 }
    143 
    144 // static
    145 const BookmarkNode* BookmarkEditor::ApplyEditsWithPossibleFolderChange(
    146     BookmarkModel* model,
    147     const BookmarkNode* new_parent,
    148     const EditDetails& details,
    149     const base::string16& new_title,
    150     const GURL& new_url) {
    151   if (details.type == EditDetails::NEW_URL ||
    152       details.type == EditDetails::NEW_FOLDER) {
    153     return CreateNewNode(model, new_parent, details, new_title, new_url);
    154   }
    155 
    156   const BookmarkNode* node = details.existing_node;
    157   DCHECK(node);
    158 
    159   if (new_parent != node->parent())
    160     model->Move(node, new_parent, new_parent->child_count());
    161   if (node->is_url())
    162     model->SetURL(node, new_url);
    163   model->SetTitle(node, new_title);
    164 
    165   return node;
    166 }
    167