/* * Copyright 2011 Sven Weidauer * * This file is part of NetSurf, http://www.netsurf-browser.org/ * * NetSurf is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License. * * NetSurf is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #import #import "utils/messages.h" #import "utils/utils.h" #import "utils/nsurl.h" #import "netsurf/browser_window.h" #import "netsurf/keypress.h" #import "desktop/hotlist.h" #import "cocoa/desktop-tree.h" #import "cocoa/BookmarksController.h" #import "cocoa/Tree.h" #import "cocoa/TreeView.h" #import "cocoa/NetsurfApp.h" #import "cocoa/BrowserViewController.h" #import "cocoa/gui.h" @interface BookmarksController () - (void)noteAppWillTerminate:(NSNotification *)note; - (void)save; @end @implementation BookmarksController @synthesize defaultMenu; @synthesize view; static const char *cocoa_hotlist_path(void) { NSString *path = [[NSUserDefaults standardUserDefaults] stringForKey:kHotlistFileOption]; return [path UTF8String]; } - (id)init { if ((self = [super initWithWindowNibName:@"BookmarksWindow"]) == nil) { return nil; } tree_hotlist_path = cocoa_hotlist_path(); tree = [[Tree alloc] initWithFlags:TREE_HOTLIST]; nodeForMenu = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, NSNonOwnedPointerMapValueCallBacks, 0); [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(noteAppWillTerminate:) name:NSApplicationWillTerminateNotification object:NSApp]; return self; } - (void)noteAppWillTerminate:(NSNotification *)note { [self save]; } - (void)save { hotlist_export(cocoa_hotlist_path(), NULL); } - (void)dealloc { [self setView:nil]; NSFreeMapTable(nodeForMenu); [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (void)menuNeedsUpdate:(NSMenu *)menu { #if 0 for (NSMenuItem *item in [menu itemArray]) { if ([item hasSubmenu]) NSMapRemove( nodeForMenu, [item submenu] ); [menu removeItem: item]; } bool hasSeparator = true; struct node *node = (struct node *)NSMapGet( nodeForMenu, menu ); if (node == NULL) { for (NSMenuItem *item in [defaultMenu itemArray]) { [menu addItem: [[item copy] autorelease]]; } hasSeparator = false; } for (struct node *child = tree_node_get_child( node ); child != NULL; child = tree_node_get_next( child )) { if (tree_node_is_deleted( child )) continue; if (!hasSeparator) { [menu addItem: [NSMenuItem separatorItem]]; hasSeparator = true; } NSString *title = [NSString stringWithUTF8String: tree_url_node_get_title( child )]; NSMenuItem *item = [menu addItemWithTitle: title action: NULL keyEquivalent: @""]; if (tree_node_is_folder( child )) { NSMenu *subMenu = [[[NSMenu alloc] initWithTitle: title] autorelease]; NSMapInsert( nodeForMenu, subMenu, child ); [subMenu setDelegate: self]; [menu setSubmenu: subMenu forItem: item]; } else { [item setRepresentedObject: [NSString stringWithUTF8String: tree_url_node_get_url( child )]]; [item setTarget: self]; [item setAction: @selector( openBookmarkURL: )]; } } #endif } - (IBAction)openBookmarkURL:(id)sender { const char *urltxt = [[sender representedObject] UTF8String]; NSParameterAssert(urltxt != NULL); nsurl *url; nserror error; error = nsurl_create(urltxt, &url); if (error == NSERROR_OK) { BrowserViewController *tab = [(NetSurfApp *)NSApp frontTab]; if (tab != nil) { error = browser_window_navigate([tab browser], url, NULL, BW_NAVIGATE_HISTORY, NULL, NULL, NULL); } else { error = browser_window_create(BW_CREATE_HISTORY, url, NULL, NULL, NULL); } nsurl_unref(url); } if (error != NSERROR_OK) { cocoa_warning(messages_get_errorcode(error), 0); } } - (IBAction)addBookmark:(id)sender { struct browser_window *bw = [[(NetSurfApp *)NSApp frontTab] browser]; if (bw != NULL) { hotlist_add_url(browser_window_get_url(bw)); } } - (BOOL)validateUserInterfaceItem:(id)item { SEL action = [item action]; if (action == @selector(addBookmark:)) { return [(NetSurfApp *)NSApp frontTab] != nil; } return YES; } - (void)windowDidLoad { hotlist_expand(false); hotlist_contract(true); [view setTree:tree]; } + (void)initialize { [[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithObjectsAndKeys:cocoa_get_user_path(@"Bookmarks.html"), kHotlistFileOption, nil]]; } - (IBAction)editSelected:(id)sender { hotlist_edit_selection(); } - (IBAction)deleteSelected:(id)sender { hotlist_keypress(NS_KEY_DELETE_LEFT); } - (IBAction)addFolder:(id)sender { hotlist_add_folder(NULL, false, 0); } @end