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