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#ifndef CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_EDITOR_H_
6#define CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_EDITOR_H_
7
8#include <utility>
9#include <vector>
10
11#include "base/strings/string16.h"
12#include "components/bookmarks/browser/bookmark_model.h"
13#include "ui/gfx/native_widget_types.h"
14
15class GURL;
16class Profile;
17
18// Small, cross platform interface that shows the correct platform specific
19// bookmark editor dialog.
20class BookmarkEditor {
21 public:
22  // An enumeration of the possible configurations offered.
23  enum Configuration {
24    // If Configuration is SHOW_TREE, a tree is shown allowing the user to
25    // choose the parent of the node.
26    SHOW_TREE,
27    NO_TREE
28  };
29
30  // Describes what the user is editing.
31  class EditDetails {
32   public:
33    // Returns the type of the existing or new node.
34    BookmarkNode::Type GetNodeType() const;
35
36    // Returns the resource id for the string resource to use on the window
37    // title for this edit operation.
38    int GetWindowTitleId() const;
39
40    // Returns an EditDetails instance for the user editing the given bookmark.
41    static EditDetails EditNode(const BookmarkNode* node);
42
43    // Returns an EditDetails instance for the user adding a bookmark within
44    // a given parent node with a specified index.
45    static EditDetails AddNodeInFolder(const BookmarkNode* parent_node,
46                                       int index,
47                                       const GURL& url,
48                                       const base::string16& title);
49
50    // Returns an EditDetails instance for the user adding a folder within a
51    // given parent node with a specified index.
52    static EditDetails AddFolder(const BookmarkNode* parent_node,
53                                 int index);
54
55    enum Type {
56      // The user is editing an existing node in the model. The node the user
57      // is editing is set in |existing_node|.
58      EXISTING_NODE,
59
60      // A new bookmark should be created if the user accepts the edit.
61      // |existing_node| is null in this case.
62      NEW_URL,
63
64      // A new folder bookmark should be created if the user accepts the edit.
65      // The contents of the folder should be that of |urls|.
66      // |existing_node| is null in this case.
67      NEW_FOLDER
68    };
69
70    ~EditDetails();
71
72    // See description of enum value for details.
73    const Type type;
74
75    // If type == EXISTING_NODE this gives the existing node.
76    const BookmarkNode* existing_node;
77
78    // If type == NEW_URL or type == NEW_FOLDER this gives the initial parent
79    // node to place the new node in.
80    const BookmarkNode* parent_node;
81
82    // If type == NEW_URL or type == NEW_FOLDER this gives the index to insert
83    // the new node at.
84    int index;
85
86    // If type == NEW_URL this gives the URL/title.
87    GURL url;
88    base::string16 title;
89
90    // If type == NEW_FOLDER, this is the urls/title pairs to add to the
91    // folder.
92    std::vector<std::pair<GURL, base::string16> > urls;
93
94   private:
95    explicit EditDetails(Type node_type);
96  };
97
98  // Shows the bookmark editor. The bookmark editor allows editing an existing
99  // node or creating a new bookmark node (as determined by |details.type|).
100  // |details.parent_node| is only used if |details.existing_node| is null.
101  static void Show(gfx::NativeWindow parent_window,
102                   Profile* profile,
103                   const EditDetails& details,
104                   Configuration configuration);
105
106  // Modifies a bookmark node (assuming that there's no magic that needs to be
107  // done regarding moving from one folder to another).  If a new node is
108  // explicitly being added, returns a pointer to the new node that was created.
109  // Otherwise the return value is identically |node|.
110  static const BookmarkNode* ApplyEditsWithNoFolderChange(
111      BookmarkModel* model,
112      const BookmarkNode* parent,
113      const EditDetails& details,
114      const base::string16& new_title,
115      const GURL& new_url);
116
117  // Modifies a bookmark node assuming that the parent of the node may have
118  // changed and the node will need to be removed and reinserted.  If a new node
119  // is explicitly being added, returns a pointer to the new node that was
120  // created.  Otherwise the return value is identically |node|.
121  static const BookmarkNode* ApplyEditsWithPossibleFolderChange(
122      BookmarkModel* model,
123      const BookmarkNode* new_parent,
124      const EditDetails& details,
125      const base::string16& new_title,
126      const GURL& new_url);
127};
128
129#endif  // CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_EDITOR_H_
130