diff options
Diffstat (limited to 'frontends/cocoa/BrowserWindowController.m')
-rw-r--r-- | frontends/cocoa/BrowserWindowController.m | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/frontends/cocoa/BrowserWindowController.m b/frontends/cocoa/BrowserWindowController.m new file mode 100644 index 000000000..f44e4fb5b --- /dev/null +++ b/frontends/cocoa/BrowserWindowController.m @@ -0,0 +1,262 @@ +/* + * Copyright 2011 Sven Weidauer <sven.weidauer@gmail.com> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#import "netsurf/browser_window.h" +#import "utils/nsoption.h" +#import "utils/messages.h" +#import "utils/utils.h" +#import "utils/nsurl.h" + +#import "cocoa/BrowserWindowController.h" + +#import "cocoa/BrowserViewController.h" +#import "cocoa/PSMTabBarControl/PSMTabBarControl.h" +#import "cocoa/PSMTabBarControl/PSMRolloverButton.h" +#import "cocoa/URLFieldCell.h" +#import "cocoa/gui.h" +#import "cocoa/NetsurfApp.h" + +@interface BrowserWindowController () + +- (void)canCloseAlertDidEnd:(NSAlert *)alert returnCode:(int)returnCode contextInfo:(void *)contextInfo; + +@end + +@implementation BrowserWindowController + +@synthesize tabBar; +@synthesize tabView; +@synthesize urlField; +@synthesize navigationControl; +@synthesize historyButton; +@synthesize historyBackMenu; +@synthesize historyForwardMenu; + +@synthesize activeBrowser; +@synthesize activeBrowserController; + +- (id)init +{ + if (nil == (self = [super initWithWindowNibName:@"BrowserWindow"])) + return nil; + + return self; +} + +- (void)awakeFromNib +{ + [tabBar setShowAddTabButton:YES]; + [tabBar setTearOffStyle:PSMTabBarTearOffMiniwindow]; + [tabBar setCanCloseOnlyTab:YES]; + [tabBar setHideForSingleTab:YES]; + + NSButton *b = [tabBar addTabButton]; + [b setTarget:self]; + [b setAction:@selector(newTab:)]; + + [urlField setRefreshAction:@selector(reloadPage:)]; + [urlField bind:@"favicon" toObject:activeBrowserController withKeyPath:@"selection.favicon" options:nil]; + + [self bind:@"canGoBack" + toObject:activeBrowserController + withKeyPath:@"selection.canGoBack" + options:nil]; + [self bind:@"canGoForward" + toObject:activeBrowserController + withKeyPath:@"selection.canGoForward" + options:nil]; + + [navigationControl setMenu:historyBackMenu forSegment:0]; + [navigationControl setMenu:historyForwardMenu forSegment:1]; +} + +- (void)addTab:(BrowserViewController *)browser +{ + NSTabViewItem *item = [[NSTabViewItem alloc] initWithIdentifier:browser]; + + [item setView:[browser view]]; + [item bind:@"label" toObject:browser withKeyPath:@"title" options:nil]; + + [tabView addTabViewItem:item]; + [browser setWindowController:self]; + + [tabView selectTabViewItem:item]; +} + +- (void)removeTab:(BrowserViewController *)browser +{ + NSUInteger itemIndex = [tabView indexOfTabViewItemWithIdentifier:browser]; + if (itemIndex != NSNotFound) { + NSTabViewItem *item = [tabView tabViewItemAtIndex:itemIndex]; + [tabView removeTabViewItem:item]; + [browser setWindowController:nil]; + } +} + +- (BOOL)windowShouldClose:(NSWindow *)window +{ + if (tabView.numberOfTabViewItems <= 1 || [[NSUserDefaults standardUserDefaults] boolForKey:kAlwaysCloseMultipleTabs]) { + return YES; + } + + NSAlert *ask = [[NSAlert alloc] init]; + ask.messageText = NSLocalizedString(@"Do you really want to close this window?", nil); + [ask addButtonWithTitle:NSLocalizedString(@"Yes", @"'Yes' button")]; + [ask addButtonWithTitle:NSLocalizedString(@"No", @"'No' button")]; + ask.informativeText = [NSString localizedStringWithFormat:NSLocalizedString(@"There are %d tabs open, do you want to close them all?", nil), tabView.numberOfTabViewItems]; + ask.showsSuppressionButton = YES; + + [ask beginSheetModalForWindow:window + completionHandler:^(NSModalResponse returnCode) { + if (returnCode != NSAlertFirstButtonReturn) { + return; + } + + [[NSUserDefaults standardUserDefaults] setBool:[[ask suppressionButton] state] == NSOnState + forKey:kAlwaysCloseMultipleTabs]; + [self.window close]; + + }]; + + return NO; +} + +- (void)windowWillClose:(NSNotification *)notification +{ + for (NSTabViewItem *tab in [tabView tabViewItems]) { + [tabView removeTabViewItem:tab]; + } +} + +- (id)supplementalTargetForAction:(SEL)action sender:(id)sender +{ + if ([self.activeBrowser respondsToSelector:action]) { + return activeBrowser; + } + + return [super supplementalTargetForAction:action sender:sender]; +} + +- (IBAction)newTab:(id)sender +{ + nsurl *url; + nserror error; + + if (nsoption_charp(homepage_url) != NULL) { + error = nsurl_create(nsoption_charp(homepage_url), &url); + } else { + error = nsurl_create(NETSURF_HOMEPAGE, &url); + } + if (error == NSERROR_OK) { + error = browser_window_create(BW_CREATE_HISTORY | BW_CREATE_TAB, + url, + NULL, + [activeBrowser browser], + NULL); + nsurl_unref(url); + } + if (error != NSERROR_OK) { + cocoa_warning(messages_get_errorcode(error), 0); + } +} + +- (IBAction)closeCurrentTab:(id)sender +{ + [self removeTab:activeBrowser]; + if (tabView.numberOfTabViewItems == 0) { + [self.window close]; + } +} + +- (void)setCanGoBack:(BOOL)can +{ + [navigationControl setEnabled:can forSegment:0]; +} + +- (BOOL)canGoBack +{ + return [navigationControl isEnabledForSegment:0]; +} + +- (void)setCanGoForward:(BOOL)can +{ + [navigationControl setEnabled:can forSegment:1]; +} + +- (BOOL)canGoForward +{ + return [navigationControl isEnabledForSegment:1]; +} + +- (void)windowDidBecomeMain:(NSNotification *)note +{ + [(NetSurfApp *)NSApp setFrontTab:[[tabView selectedTabViewItem] identifier]]; +} + +- (void)menuNeedsUpdate:(NSMenu *)menu +{ + if (menu == historyBackMenu) { + [activeBrowser buildBackMenu:menu]; + } else if (menu == historyForwardMenu) { + [activeBrowser buildForwardMenu:menu]; + } +} + +#pragma mark - +#pragma mark Tab bar delegate + +- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem +{ + [self setActiveBrowser:[tabViewItem identifier]]; + if ([[self window] isMainWindow]) { + [(NetSurfApp *)NSApp setFrontTab:[tabViewItem identifier]]; + } +} + +- (BOOL)tabView:(NSTabView *)aTabView shouldDragTabViewItem:(NSTabViewItem *)tabViewItem fromTabBar:(PSMTabBarControl *)tabBarControl +{ + return [aTabView numberOfTabViewItems] > 1; +} + +- (BOOL)tabView:(NSTabView *)aTabView shouldDropTabViewItem:(NSTabViewItem *)tabViewItem inTabBar:(PSMTabBarControl *)tabBarControl +{ + [[tabViewItem identifier] setWindowController:self]; + return YES; +} + +- (PSMTabBarControl *)tabView:(NSTabView *)aTabView newTabBarForDraggedTabViewItem:(NSTabViewItem *)tabViewItem atPoint:(NSPoint)point +{ + BrowserWindowController *newWindow = [[BrowserWindowController alloc] init]; + [[tabViewItem identifier] setWindowController:newWindow]; + [[newWindow window] setFrameOrigin:point]; + return newWindow->tabBar; +} + +- (void)tabView:(NSTabView *)aTabView didCloseTabViewItem:(NSTabViewItem *)tabViewItem +{ + [tabViewItem unbind:@"label"]; + + if (activeBrowser == [tabViewItem identifier]) { + [self setActiveBrowser:nil]; + [(NetSurfApp *)NSApp setFrontTab:nil]; + } + + browser_window_destroy([[tabViewItem identifier] browser]); +} + +@end |