diff --git a/frontends/gnustep/AppDelegate.h b/frontends/gnustep/AppDelegate.h index 13d01784a..669211297 100644 --- a/frontends/gnustep/AppDelegate.h +++ b/frontends/gnustep/AppDelegate.h @@ -22,6 +22,9 @@ along with this program. If not, see . #define TAG_MENU_REMOVE 206 #define TAG_MENU_CANCEL 204 #define TAG_MENU_OPEN 104 +#define TAG_MENU_COPY 202 +#define TAG_MENU_CUT 201 +#define TAG_MENU_PASTE 203 #define TAG_SUBMENU_HISTORY 500 @interface AppDelegate: NSResponder { diff --git a/frontends/gnustep/BookmarkFolder.m b/frontends/gnustep/BookmarkFolder.m index df637b240..13d4ea600 100644 --- a/frontends/gnustep/BookmarkFolder.m +++ b/frontends/gnustep/BookmarkFolder.m @@ -90,6 +90,7 @@ lazy-loaded when requested. NSString *destPath = [path stringByAppendingPathComponent: filename]; ok = [[child asDictionary] writeToFile: destPath atomically: YES]; [child setFilename: filename]; + [child setParentFolder: self]; } else if ([child isKindOfClass: [BookmarkFolder class]]) { ok = [[NSFileManager defaultManager] createDirectoryAtPath: path attributes: nil]; @@ -227,6 +228,7 @@ lazy-loaded when requested. chDict = [NSDictionary dictionaryWithContentsOfFile: chPath]; child = [[Website alloc] initWithDictionary: chDict fromFileNamed: fileName]; + [child setParentFolder: self]; [newChildren addObject: [child autorelease]]; } } diff --git a/frontends/gnustep/BookmarksWindowController.h b/frontends/gnustep/BookmarksWindowController.h index b987c5df9..dfad199d3 100644 --- a/frontends/gnustep/BookmarksWindowController.h +++ b/frontends/gnustep/BookmarksWindowController.h @@ -5,8 +5,14 @@ id outlineView; id searchBar; NSArray *topLevelFolders; + BOOL isCutting; + NSArray *copiedItems; } -(void)search: (id)sender; -(void)clearSearch: (id)sender; -(void)newFolder: (id)sender; +-(void)cut: (id)sender; +-(void)copy: (id)sender; +-(void)paste: (id)sender; +-(void)remove: (id)sender; @end diff --git a/frontends/gnustep/BookmarksWindowController.m b/frontends/gnustep/BookmarksWindowController.m index 79529f8f8..3233a9ebe 100644 --- a/frontends/gnustep/BookmarksWindowController.m +++ b/frontends/gnustep/BookmarksWindowController.m @@ -2,6 +2,11 @@ #import "BookmarksWindowController.h" #import "BookmarkFolder.h" #import "Website.h" +#import "AppDelegate.h" + +@interface BookmarksWindowController (Private) +-(void)copySelectedItems; +@end @implementation BookmarksWindowController @@ -12,6 +17,12 @@ return self; } +-(void)dealloc { + [copiedItems release]; + [topLevelFolders release]; + [super dealloc]; +} + -(BOOL)windowShouldClose: (id)sender { [topLevelFolders release]; topLevelFolders = nil; @@ -32,6 +43,55 @@ [self onWindowAppeared]; } +-(void)cut: (id)sender { + isCutting = YES; + [self copySelectedItems]; +} + +-(void)copy: (id)sender { + isCutting = NO; + [self copySelectedItems]; +} + +-(void)paste: (id)sender { + NSEnumerator *selected = [outlineView selectedRowEnumerator]; + NSNumber *row = [selected nextObject]; + if (row == nil) { + return; + } + id item = [outlineView itemAtRow: [row integerValue]]; + if (row == nil) { + return; + } + BookmarkFolder *destinationFolder = nil; + if ([item isKindOfClass: [Website class]]) { + destinationFolder = [item parentFolder]; + } else if ([item isKindOfClass: [BookmarkFolder class]]) { + destinationFolder = item; + } + if (destinationFolder == nil) { + NSLog(@"Couldn't find destination for paste"); + return; + } + for (NSUInteger i = 0; i < [copiedItems count]; i++) { + item = [copiedItems objectAtIndex: i]; + if (isCutting) { + [[item parentFolder] removeChild: item]; + } + [destinationFolder addChild: item]; + } + + if (isCutting) { + isCutting = NO; + [copiedItems release]; + copiedItems = nil; + } +} + +-(void)remove: (id)sender { + +} + -(void)newFolder: (id)sender { NSLog(@"create new folder"); } @@ -50,6 +110,17 @@ NSLog(@"Clear bookmarks search"); } +-(BOOL)validateMenuItem: (NSMenuItem*)aMenuItem { + NSInteger tag = [aMenuItem tag]; + if (tag == TAG_MENU_REMOVE || tag == TAG_MENU_OPEN || tag == TAG_MENU_COPY || + tag == TAG_MENU_CUT) { + return [outlineView numberOfSelectedRows] > 0; + } else if (tag == TAG_MENU_PASTE) { + return copiedItems != nil; + } + return YES; +} + -(id)outlineView: (NSOutlineView*)outlineView child: (NSInteger)index ofItem: (id)item { if (item == nil) { @@ -101,4 +172,29 @@ } } +-(void)copySelectedItems { + NSEnumerator *selected = [outlineView selectedRowEnumerator]; + NSMutableArray *copiedFolders = [NSMutableArray array]; + NSMutableArray *toCopy = [NSMutableArray array]; + BOOL addedToPB = NO; + id row, item; + while ((row = [selected nextObject]) != NULL) { + item = [outlineView itemAtRow: [row integerValue]]; + if (!addedToPB && [item isKindOfClass: [Website class]]) { + [[NSPasteboard generalPasteboard] setString: [item url] + forType: NSStringPboardType]; + addedToPB = YES; + } + if ([item isKindOfClass: [BookmarkFolder class]]) { + [copiedFolders addObject: item]; + } + if ([copiedFolders containsObject: [item parentFolder]]) { + break; + } + [toCopy addObject: item]; + } + [copiedItems release]; + copiedItems = [toCopy retain]; +} + @end diff --git a/frontends/gnustep/Website.h b/frontends/gnustep/Website.h index 5ec56be8b..62d118b1b 100644 --- a/frontends/gnustep/Website.h +++ b/frontends/gnustep/Website.h @@ -14,6 +14,7 @@ struct website_data { @class BookmarkFolder; @interface Website: NSObject { + BookmarkFolder *parentFolder; NSString *filename; long fileOffset; struct website_data *data; @@ -28,7 +29,8 @@ struct website_data { -(long)fileOffset; -(NSString*)filename; -(void)setFilename: (NSString*)aFilename; - +-(BookmarkFolder*)parentFolder; +-(void)setParentFolder: (BookmarkFolder*)aBookmarkFolder; -(NSDictionary*)asDictionary; -(void)open; diff --git a/frontends/gnustep/Website.m b/frontends/gnustep/Website.m index c71806d7c..eb4865205 100644 --- a/frontends/gnustep/Website.m +++ b/frontends/gnustep/Website.m @@ -41,6 +41,7 @@ -(void)dealloc { free(data); + [parentFolder release]; [filename release]; [super dealloc]; } @@ -74,6 +75,16 @@ filename = [aFilename retain]; } +// Set when init from bookmarks or added to folder +-(BookmarkFolder*)parentFolder { + return parentFolder; +} + +-(void)setParentFolder: (BookmarkFolder*)aBookmarkFolder { + [parentFolder release]; + parentFolder = [aBookmarkFolder retain]; +} + -(NSDictionary*)asDictionary { NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject: [self name] forKey: @"name"]; diff --git a/frontends/gnustep/res/Menu.gorm/objects.gorm b/frontends/gnustep/res/Menu.gorm/objects.gorm index f4f92c013..ade626ac8 100644 Binary files a/frontends/gnustep/res/Menu.gorm/objects.gorm and b/frontends/gnustep/res/Menu.gorm/objects.gorm differ