Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / cocoa / applescript / bookmark_node_applescript.mm
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 #import "chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.h"
6
7 #include "base/logging.h"
8 #import "base/mac/scoped_nsobject.h"
9 #include "base/strings/sys_string_conversions.h"
10 #import "chrome/browser/app_controller_mac.h"
11 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
12 #import "chrome/browser/chrome_browser_application_mac.h"
13 #include "chrome/browser/profiles/profile.h"
14 #import "chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.h"
15 #import "chrome/browser/ui/cocoa/applescript/error_applescript.h"
16 #include "components/bookmarks/core/browser/bookmark_model.h"
17
18 @interface BookmarkNodeAppleScript()
19 @property (nonatomic, copy) NSString* tempTitle;
20 @end
21
22 @implementation BookmarkNodeAppleScript
23
24 @synthesize tempTitle = tempTitle_;
25
26 - (id)init {
27   if ((self = [super init])) {
28     BookmarkModel* model = [self bookmarkModel];
29     if (!model) {
30       [self release];
31       return nil;
32     }
33
34     base::scoped_nsobject<NSNumber> numID(
35         [[NSNumber alloc] initWithLongLong:model->next_node_id()]);
36     [self setUniqueID:numID];
37     [self setTempTitle:@""];
38   }
39   return self;
40 }
41
42 - (void)dealloc {
43   [tempTitle_ release];
44   [super dealloc];
45 }
46
47
48 - (id)initWithBookmarkNode:(const BookmarkNode*)aBookmarkNode {
49   if (!aBookmarkNode) {
50     [self release];
51     return nil;
52   }
53
54   if ((self = [super init])) {
55     // It is safe to be weak, if a bookmark item/folder goes away
56     // (eg user deleting a folder) the applescript runtime calls
57     // bookmarkFolders/bookmarkItems in BookmarkFolderAppleScript
58     // and this particular bookmark item/folder is never returned.
59     bookmarkNode_ = aBookmarkNode;
60
61     base::scoped_nsobject<NSNumber> numID(
62         [[NSNumber alloc] initWithLongLong:aBookmarkNode->id()]);
63     [self setUniqueID:numID];
64   }
65   return self;
66 }
67
68 - (void)setBookmarkNode:(const BookmarkNode*)aBookmarkNode {
69   DCHECK(aBookmarkNode);
70   // It is safe to be weak, if a bookmark item/folder goes away
71   // (eg user deleting a folder) the applescript runtime calls
72   // bookmarkFolders/bookmarkItems in BookmarkFolderAppleScript
73   // and this particular bookmark item/folder is never returned.
74   bookmarkNode_ = aBookmarkNode;
75
76   base::scoped_nsobject<NSNumber> numID(
77       [[NSNumber alloc] initWithLongLong:aBookmarkNode->id()]);
78   [self setUniqueID:numID];
79
80   [self setTitle:[self tempTitle]];
81 }
82
83 - (NSString*)title {
84   if (!bookmarkNode_)
85     return tempTitle_;
86
87   return base::SysUTF16ToNSString(bookmarkNode_->GetTitle());
88 }
89
90 - (void)setTitle:(NSString*)aTitle {
91   // If the scripter enters |make new bookmarks folder with properties
92   // {title:"foo"}|, the node has not yet been created so title is stored in the
93   // temp title.
94   if (!bookmarkNode_) {
95     [self setTempTitle:aTitle];
96     return;
97   }
98
99   BookmarkModel* model = [self bookmarkModel];
100   if (!model)
101     return;
102
103   model->SetTitle(bookmarkNode_, base::SysNSStringToUTF16(aTitle));
104 }
105
106 - (NSNumber*)index {
107   const BookmarkNode* parent = bookmarkNode_->parent();
108   int index = parent->GetIndexOf(bookmarkNode_);
109   // NOTE: AppleScript is 1-Based.
110   return [NSNumber numberWithInt:index+1];
111 }
112
113 - (BookmarkModel*)bookmarkModel {
114   AppController* appDelegate = [NSApp delegate];
115
116   Profile* lastProfile = [appDelegate lastProfile];
117   if (!lastProfile) {
118     AppleScript::SetError(AppleScript::errGetProfile);
119     return NULL;
120   }
121
122   BookmarkModel* model = BookmarkModelFactory::GetForProfile(lastProfile);
123   if (!model->loaded()) {
124     AppleScript::SetError(AppleScript::errBookmarkModelLoad);
125     return NULL;
126   }
127
128   return model;
129 }
130
131 @end