- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / cocoa / bookmarks / bookmark_editor_base_controller.h
1 // Copyright (c) 2012 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_COCOA_BOOKMARKS_BOOKMARK_EDITOR_BASE_CONTROLLER_H_
6 #define CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_EDITOR_BASE_CONTROLLER_H_
7
8 #import <Cocoa/Cocoa.h>
9
10 #include "base/mac/scoped_nsobject.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "chrome/browser/bookmarks/bookmark_expanded_state_tracker.h"
13 #include "chrome/browser/ui/bookmarks/bookmark_editor.h"
14
15 class BookmarkEditorBaseControllerBridge;
16 class BookmarkModel;
17 @class BookmarkTreeBrowserCell;
18
19 // A base controller class for bookmark creation and editing dialogs which
20 // present the current bookmark folder structure in a tree view.  Do not
21 // instantiate this controller directly -- use one of its derived classes.
22 // NOTE: If a derived class is intended to be dispatched via the
23 // BookmarkEditor::Show static function found in the accompanying
24 // implementation, that function will need to be update.
25 @interface BookmarkEditorBaseController : NSWindowController {
26  @private
27   IBOutlet NSButton* newFolderButton_;
28   IBOutlet NSButton* okButton_;  // Used for unit testing only.
29   IBOutlet NSTreeController* folderTreeController_;
30   IBOutlet NSOutlineView* folderTreeView_;
31
32   NSWindow* parentWindow_;  // weak
33   Profile* profile_;  // weak
34   const BookmarkNode* parentNode_;  // weak; owned by the model
35   GURL url_;  // This and title_ are only used for new urls.
36   string16 title_;
37   BookmarkEditor::Configuration configuration_;
38   NSString* initialName_;
39   NSString* displayName_;  // Bound to a text field in the dialog.
40   BOOL okEnabled_;  // Bound to the OK button.
41   BOOL creatingNewFolders_;  // True while in createNewFolders.
42   // An array of BookmarkFolderInfo where each item describes a folder in the
43   // BookmarkNode structure.
44   base::scoped_nsobject<NSArray> folderTreeArray_;
45   // Bound to the table view giving a path to the current selections, of which
46   // there should only ever be one.
47   base::scoped_nsobject<NSArray> tableSelectionPaths_;
48   // C++ bridge object that observes the BookmarkModel for me.
49   scoped_ptr<BookmarkEditorBaseControllerBridge> observer_;
50 }
51
52 @property(nonatomic, copy) NSString* initialName;
53 @property(nonatomic, copy) NSString* displayName;
54 @property(nonatomic, assign) BOOL okEnabled;
55 @property(nonatomic, retain, readonly) NSArray* folderTreeArray;
56 @property(nonatomic, copy) NSArray* tableSelectionPaths;
57
58 // Designated initializer.  Derived classes should call through to this init.
59 // |url| and |title| are only used for BookmarkNode::Type::NEW_URL.
60 - (id)initWithParentWindow:(NSWindow*)parentWindow
61                    nibName:(NSString*)nibName
62                    profile:(Profile*)profile
63                     parent:(const BookmarkNode*)parent
64                        url:(const GURL&)url
65                      title:(const string16&)title
66              configuration:(BookmarkEditor::Configuration)configuration;
67
68 // Run the bookmark editor as a modal sheet.  Does not block.
69 - (void)runAsModalSheet;
70
71 // Create a new folder at the end of the selected parent folder, give it
72 // an untitled name, and put it into editing mode.
73 - (IBAction)newFolder:(id)sender;
74
75 // The cancel action will dismiss the dialog.  Derived classes which
76 // override cancel:, must call this after accessing any dialog-related
77 // data.
78 - (IBAction)cancel:(id)sender;
79
80 // The OK action will dismiss the dialog.  This action is bound
81 // to the OK button of a dialog which presents a tree view of a profile's
82 // folder hierarchy and allows the creation of new folders within that tree.
83 // When the OK button is pressed, this function will: 1) call the derived
84 // class's -[willCommit] function, 2) create any new folders created by
85 // the user while the dialog is presented, 3) call the derived class's
86 // -[didCommit] function, and then 4) dismiss the dialog.  At least one
87 // of -[willCommit] and -[didCommit] must be provided by the derived class
88 // and should return a NSNumber containing a BOOL or nil ('nil' means YES)
89 // indicating if the operation should be allowed to continue.
90 // Note: A derived class should not override the ok: action.
91 - (IBAction)ok:(id)sender;
92
93 // Methods for use by derived classes only.
94
95 // Determine and returns the rightmost selected/highlighted element (node)
96 // in the bookmark tree view if the tree view is showing, otherwise returns
97 // the original |parentNode_|.  If the tree view is showing but nothing is
98 // selected then the root node is returned.
99 - (const BookmarkNode*)selectedNode;
100
101 // Expands the set of BookmarkNodes in |nodes|.
102 - (void)expandNodes:(const BookmarkExpandedStateTracker::Nodes&)nodes;
103
104 // Returns the set of expanded BookmarkNodes.
105 - (BookmarkExpandedStateTracker::Nodes)getExpandedNodes;
106
107 // Select/highlight the given node within the browser tree view.  If the
108 // node is nil then select the bookmark bar node.  Exposed for unit test.
109 - (void)selectNodeInBrowser:(const BookmarkNode*)node;
110
111 // Notifications called when the BookmarkModel changes out from under me.
112 - (void)nodeRemoved:(const BookmarkNode*)node
113          fromParent:(const BookmarkNode*)parent;
114 - (void)modelChangedPreserveSelection:(BOOL)preserve;
115
116 // Accessors
117 - (BookmarkModel*)bookmarkModel;
118 - (Profile*)profile;
119 - (const BookmarkNode*)parentNode;
120 - (const GURL&)url;
121 - (const string16&)title;
122
123 @end
124
125 // Describes the profile's bookmark folder structure: the folder name, the
126 // original BookmarkNode pointer (if the folder already exists), a BOOL
127 // indicating if the folder is new (meaning: created during this session
128 // but not yet committed to the bookmark structure), and an NSArray of
129 // child folder BookmarkFolderInfo's following this same structure.
130 @interface BookmarkFolderInfo : NSObject {
131  @private
132   NSString* folderName_;
133   const BookmarkNode* folderNode_;  // weak
134   NSMutableArray* children_;
135   BOOL newFolder_;
136 }
137
138 @property(nonatomic, copy) NSString* folderName;
139 @property(nonatomic, assign) const BookmarkNode* folderNode;
140 @property(nonatomic, retain) NSMutableArray* children;
141 @property(nonatomic, assign) BOOL newFolder;
142
143 // Convenience creator for adding a new folder to the editor's bookmark
144 // structure.  This folder will be added to the bookmark model when the
145 // user accepts the dialog. |folderName| must be provided.
146 + (id)bookmarkFolderInfoWithFolderName:(NSString*)folderName;
147
148 // Designated initializer.  |folderName| must be provided.  For folders which
149 // already exist in the bookmark model, |folderNode| and |children| (if any
150 // children are already attached to this folder) must be provided and
151 // |newFolder| should be NO.  For folders which the user has added during
152 // this session and which have not been committed yet, |newFolder| should be
153 // YES and |folderNode| and |children| should be NULL/nil.
154 - (id)initWithFolderName:(NSString*)folderName
155               folderNode:(const BookmarkNode*)folderNode
156                 children:(NSMutableArray*)children
157                newFolder:(BOOL)newFolder;
158
159 // Convenience creator used during construction of the editor's bookmark
160 // structure.  |folderName| and |folderNode| must be provided. |children|
161 // is optional.  Private: exposed here for unit testing purposes.
162 + (id)bookmarkFolderInfoWithFolderName:(NSString*)folderName
163                             folderNode:(const BookmarkNode*)folderNode
164                               children:(NSMutableArray*)children;
165
166 @end
167
168 @interface BookmarkEditorBaseController(TestingAPI)
169
170 @property(nonatomic, readonly) BOOL okButtonEnabled;
171
172 // Create any newly added folders.  New folders are nodes in folderTreeArray
173 // which are marked as being new (i.e. their kFolderTreeNewFolderKey
174 // dictionary item is YES).  This is called by -[ok:].
175 - (void)createNewFolders;
176
177 // Select the given bookmark node within the tree view.
178 - (void)selectTestNodeInBrowser:(const BookmarkNode*)node;
179
180 // Return the dictionary for the folder selected in the tree.
181 - (BookmarkFolderInfo*)selectedFolder;
182
183 @end
184
185 #endif  // CHROME_BROWSER_UI_COCOA_BOOKMARKS_BOOKMARK_EDITOR_BASE_CONTROLLER_H_