bookmark_folder_applescript.mm revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1// Copyright (c) 2011 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_folder_applescript.h" 6 7#import "base/mac/scoped_nsobject.h" 8#import "base/strings/string16.h" 9#include "base/strings/sys_string_conversions.h" 10#import "chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.h" 11#import "chrome/browser/ui/cocoa/applescript/constants_applescript.h" 12#include "chrome/browser/ui/cocoa/applescript/error_applescript.h" 13#include "components/bookmarks/browser/bookmark_model.h" 14#include "url/gurl.h" 15 16@implementation BookmarkFolderAppleScript 17 18- (NSArray*)bookmarkFolders { 19 NSMutableArray* bookmarkFolders = [NSMutableArray 20 arrayWithCapacity:bookmarkNode_->child_count()]; 21 22 for (int i = 0; i < bookmarkNode_->child_count(); ++i) { 23 const BookmarkNode* node = bookmarkNode_->GetChild(i); 24 25 if (!node->is_folder()) 26 continue; 27 base::scoped_nsobject<BookmarkFolderAppleScript> bookmarkFolder( 28 [[BookmarkFolderAppleScript alloc] initWithBookmarkNode:node]); 29 [bookmarkFolder setContainer:self 30 property:AppleScript::kBookmarkFoldersProperty]; 31 [bookmarkFolders addObject:bookmarkFolder]; 32 } 33 34 return bookmarkFolders; 35} 36 37- (void)insertInBookmarkFolders:(id)aBookmarkFolder { 38 // This method gets called when a new bookmark folder is created so 39 // the container and property are set here. 40 [aBookmarkFolder setContainer:self 41 property:AppleScript::kBookmarkFoldersProperty]; 42 BookmarkModel* model = [self bookmarkModel]; 43 if (!model) 44 return; 45 46 const BookmarkNode* node = model->AddFolder(bookmarkNode_, 47 bookmarkNode_->child_count(), 48 base::string16()); 49 if (!node) { 50 AppleScript::SetError(AppleScript::errCreateBookmarkFolder); 51 return; 52 } 53 54 [aBookmarkFolder setBookmarkNode:node]; 55} 56 57- (void)insertInBookmarkFolders:(id)aBookmarkFolder atIndex:(int)index { 58 // This method gets called when a new bookmark folder is created so 59 // the container and property are set here. 60 [aBookmarkFolder setContainer:self 61 property:AppleScript::kBookmarkFoldersProperty]; 62 int position = [self calculatePositionOfBookmarkFolderAt:index]; 63 64 BookmarkModel* model = [self bookmarkModel]; 65 if (!model) 66 return; 67 68 const BookmarkNode* node = model->AddFolder(bookmarkNode_, 69 position, 70 base::string16()); 71 if (!node) { 72 AppleScript::SetError(AppleScript::errCreateBookmarkFolder); 73 return; 74 } 75 76 [aBookmarkFolder setBookmarkNode:node]; 77} 78 79- (void)removeFromBookmarkFoldersAtIndex:(int)index { 80 int position = [self calculatePositionOfBookmarkFolderAt:index]; 81 82 BookmarkModel* model = [self bookmarkModel]; 83 if (!model) 84 return; 85 86 model->Remove(bookmarkNode_, position); 87} 88 89- (NSArray*)bookmarkItems { 90 NSMutableArray* bookmarkItems = [NSMutableArray 91 arrayWithCapacity:bookmarkNode_->child_count()]; 92 93 for (int i = 0; i < bookmarkNode_->child_count(); ++i) { 94 const BookmarkNode* node = bookmarkNode_->GetChild(i); 95 96 if (!node->is_url()) 97 continue; 98 base::scoped_nsobject<BookmarkItemAppleScript> bookmarkItem( 99 [[BookmarkItemAppleScript alloc] initWithBookmarkNode:node]); 100 [bookmarkItem setContainer:self 101 property:AppleScript::kBookmarkItemsProperty]; 102 [bookmarkItems addObject:bookmarkItem]; 103 } 104 105 return bookmarkItems; 106} 107 108- (void)insertInBookmarkItems:(BookmarkItemAppleScript*)aBookmarkItem { 109 // This method gets called when a new bookmark item is created so 110 // the container and property are set here. 111 [aBookmarkItem setContainer:self 112 property:AppleScript::kBookmarkItemsProperty]; 113 114 BookmarkModel* model = [self bookmarkModel]; 115 if (!model) 116 return; 117 118 GURL url = GURL(base::SysNSStringToUTF8([aBookmarkItem URL])); 119 if (!url.is_valid()) { 120 AppleScript::SetError(AppleScript::errInvalidURL); 121 return; 122 } 123 124 const BookmarkNode* node = model->AddURL(bookmarkNode_, 125 bookmarkNode_->child_count(), 126 base::string16(), 127 url); 128 if (!node) { 129 AppleScript::SetError(AppleScript::errCreateBookmarkItem); 130 return; 131 } 132 133 [aBookmarkItem setBookmarkNode:node]; 134} 135 136- (void)insertInBookmarkItems:(BookmarkItemAppleScript*)aBookmarkItem 137 atIndex:(int)index { 138 // This method gets called when a new bookmark item is created so 139 // the container and property are set here. 140 [aBookmarkItem setContainer:self 141 property:AppleScript::kBookmarkItemsProperty]; 142 int position = [self calculatePositionOfBookmarkItemAt:index]; 143 144 BookmarkModel* model = [self bookmarkModel]; 145 if (!model) 146 return; 147 148 GURL url(base::SysNSStringToUTF8([aBookmarkItem URL])); 149 if (!url.is_valid()) { 150 AppleScript::SetError(AppleScript::errInvalidURL); 151 return; 152 } 153 154 const BookmarkNode* node = model->AddURL(bookmarkNode_, 155 position, 156 base::string16(), 157 url); 158 if (!node) { 159 AppleScript::SetError(AppleScript::errCreateBookmarkItem); 160 return; 161 } 162 163 [aBookmarkItem setBookmarkNode:node]; 164} 165 166- (void)removeFromBookmarkItemsAtIndex:(int)index { 167 int position = [self calculatePositionOfBookmarkItemAt:index]; 168 169 BookmarkModel* model = [self bookmarkModel]; 170 if (!model) 171 return; 172 173 model->Remove(bookmarkNode_, position); 174} 175 176- (int)calculatePositionOfBookmarkFolderAt:(int)index { 177 // Traverse through all the child nodes till the required node is found and 178 // return its position. 179 // AppleScript is 1-based therefore index is incremented by 1. 180 ++index; 181 int count = -1; 182 while (index) { 183 if (bookmarkNode_->GetChild(++count)->is_folder()) 184 --index; 185 } 186 return count; 187} 188 189- (int)calculatePositionOfBookmarkItemAt:(int)index { 190 // Traverse through all the child nodes till the required node is found and 191 // return its position. 192 // AppleScript is 1-based therefore index is incremented by 1. 193 ++index; 194 int count = -1; 195 while (index) { 196 if (bookmarkNode_->GetChild(++count)->is_url()) 197 --index; 198 } 199 return count; 200} 201 202@end 203