blob: c2fcba18520ef5f9b582eb70964d328a861d376d [file] [log] [blame]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript.h"
#import "base/mac/scoped_nsobject.h"
#include "base/strings/sys_string_conversions.h"
#import "chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.h"
#import "chrome/browser/ui/cocoa/applescript/constants_applescript.h"
#include "chrome/browser/ui/cocoa/applescript/error_applescript.h"
#include "components/bookmarks/browser/bookmark_model.h"
#include "url/gurl.h"
using bookmarks::BookmarkModel;
using bookmarks::BookmarkNode;
@implementation BookmarkFolderAppleScript
- (NSArray*)bookmarkFolders {
NSMutableArray* bookmarkFolders =
[NSMutableArray arrayWithCapacity:_bookmarkNode->children().size()];
for (const auto& node : _bookmarkNode->children()) {
if (!node->is_folder())
continue;
base::scoped_nsobject<BookmarkFolderAppleScript> bookmarkFolder(
[[BookmarkFolderAppleScript alloc] initWithBookmarkNode:node.get()]);
[bookmarkFolder setContainer:self
property:AppleScript::kBookmarkFoldersProperty];
[bookmarkFolders addObject:bookmarkFolder];
}
return bookmarkFolders;
}
- (void)insertInBookmarkFolders:(id)aBookmarkFolder {
// This method gets called when a new bookmark folder is created so
// the container and property are set here.
[aBookmarkFolder setContainer:self
property:AppleScript::kBookmarkFoldersProperty];
BookmarkModel* model = [self bookmarkModel];
if (!model)
return;
const BookmarkNode* node = model->AddFolder(
_bookmarkNode, _bookmarkNode->children().size(), std::u16string());
if (!node) {
AppleScript::SetError(AppleScript::errCreateBookmarkFolder);
return;
}
[aBookmarkFolder setBookmarkNode:node];
}
- (void)insertInBookmarkFolders:(id)aBookmarkFolder atIndex:(size_t)index {
// This method gets called when a new bookmark folder is created so
// the container and property are set here.
[aBookmarkFolder setContainer:self
property:AppleScript::kBookmarkFoldersProperty];
size_t position = [self calculatePositionOfBookmarkFolderAt:index];
BookmarkModel* model = [self bookmarkModel];
if (!model)
return;
const BookmarkNode* node =
model->AddFolder(_bookmarkNode, position, std::u16string());
if (!node) {
AppleScript::SetError(AppleScript::errCreateBookmarkFolder);
return;
}
[aBookmarkFolder setBookmarkNode:node];
}
- (void)removeFromBookmarkFoldersAtIndex:(size_t)index {
size_t position = [self calculatePositionOfBookmarkFolderAt:index];
BookmarkModel* model = [self bookmarkModel];
if (!model)
return;
model->Remove(_bookmarkNode->children()[position].get());
}
- (NSArray*)bookmarkItems {
NSMutableArray* bookmarkItems =
[NSMutableArray arrayWithCapacity:_bookmarkNode->children().size()];
for (const auto& node : _bookmarkNode->children()) {
if (!node->is_url())
continue;
base::scoped_nsobject<BookmarkItemAppleScript> bookmarkItem(
[[BookmarkItemAppleScript alloc] initWithBookmarkNode:node.get()]);
[bookmarkItem setContainer:self
property:AppleScript::kBookmarkItemsProperty];
[bookmarkItems addObject:bookmarkItem];
}
return bookmarkItems;
}
- (void)insertInBookmarkItems:(BookmarkItemAppleScript*)aBookmarkItem {
// This method gets called when a new bookmark item is created so
// the container and property are set here.
[aBookmarkItem setContainer:self
property:AppleScript::kBookmarkItemsProperty];
BookmarkModel* model = [self bookmarkModel];
if (!model)
return;
GURL url = GURL(base::SysNSStringToUTF8([aBookmarkItem URL]));
if (!url.is_valid()) {
AppleScript::SetError(AppleScript::errInvalidURL);
return;
}
const BookmarkNode* node = model->AddURL(
_bookmarkNode, _bookmarkNode->children().size(), std::u16string(), url);
if (!node) {
AppleScript::SetError(AppleScript::errCreateBookmarkItem);
return;
}
[aBookmarkItem setBookmarkNode:node];
}
- (void)insertInBookmarkItems:(BookmarkItemAppleScript*)aBookmarkItem
atIndex:(size_t)index {
// This method gets called when a new bookmark item is created so
// the container and property are set here.
[aBookmarkItem setContainer:self
property:AppleScript::kBookmarkItemsProperty];
size_t position = [self calculatePositionOfBookmarkItemAt:index];
BookmarkModel* model = [self bookmarkModel];
if (!model)
return;
GURL url(base::SysNSStringToUTF8([aBookmarkItem URL]));
if (!url.is_valid()) {
AppleScript::SetError(AppleScript::errInvalidURL);
return;
}
const BookmarkNode* node =
model->AddURL(_bookmarkNode, position, std::u16string(), url);
if (!node) {
AppleScript::SetError(AppleScript::errCreateBookmarkItem);
return;
}
[aBookmarkItem setBookmarkNode:node];
}
- (void)removeFromBookmarkItemsAtIndex:(size_t)index {
size_t position = [self calculatePositionOfBookmarkItemAt:index];
BookmarkModel* model = [self bookmarkModel];
if (!model)
return;
model->Remove(_bookmarkNode->children()[position].get());
}
- (size_t)calculatePositionOfBookmarkFolderAt:(size_t)index {
// Traverse through all the child nodes till the required node is found and
// return its position.
// AppleScript is 1-based therefore index is incremented by 1.
++index;
size_t count = 0;
while (index) {
if (_bookmarkNode->children()[count++]->is_folder())
--index;
}
return count - 1;
}
- (size_t)calculatePositionOfBookmarkItemAt:(size_t)index {
// Traverse through all the child nodes till the required node is found and
// return its position.
// AppleScript is 1-based therefore index is incremented by 1.
++index;
size_t count = 0;
while (index) {
if (_bookmarkNode->children()[count++]->is_url())
--index;
}
return count - 1;
}
@end