--- chimera/MainController.mm 2002/01/31 05:45:26 1.6 +++ chimera/MainController.mm 2002/04/17 07:38:31 1.44 @@ -1,21 +1,138 @@ -/* - * MainController.mm - */ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Netscape Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2002 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ #import "MainController.h" #import "BrowserWindowController.h" +#include "BookmarksService.h" +#include "nsCOMPtr.h" +#include "nsIServiceManager.h" +#include "nsIIOService.h" +#include "nsCocoaBrowserService.h" +#import "AboutBox.h" + + +static const char* ioServiceContractID = "@mozilla.org/network/io-service;1"; @implementation MainController --(void)awakeFromNib +-(id)init +{ + if ( (self = [super init]) ) { + mSplashScreen = [[SplashScreenWindow alloc] splashImage:nil withFade:YES withStatusRect:NSMakeRect(0,0,0,0)]; + } + mFindDialog = nil; + mMenuBookmarks = nil; + return self; +} + +-(void)dealloc { + [super dealloc]; + [mFindDialog release]; + printf("Main controller died.\n"); +} + +-(void)awakeFromNib +{ [self newWindow: self]; + + [mSplashScreen close]; + + [mBookmarksMenu setAutoenablesItems: NO]; + mMenuBookmarks = new BookmarksService((BookmarksDataSource*)nil); + mMenuBookmarks->AddObserver(); + mMenuBookmarks->ConstructBookmarksMenu(mBookmarksMenu, nsnull); + BookmarksService::gMainController = self; + + // Initialize offline mode. + mOffline = NO; + nsCOMPtr ioService(do_GetService(ioServiceContractID)); + if (!ioService) + return; + PRBool offline = PR_FALSE; + ioService->GetOffline(&offline); + mOffline = offline; + + // Set the menu item's text to "Go Online" if we're currently + // offline. + if (mOffline) + [mOfflineMenuItem setTitle: @"Go Online"]; + } -(IBAction)newWindow:(id)aSender { - BrowserWindowController* controller = [self openBrowserWindowWithURLString:@"about:blank"]; - [controller focusURLBar]; + // If we have a key window, have it autosave its dimensions before + // we open a new window. That ensures the size ends up matching. + NSWindow* keyWindow = [mApplication keyWindow]; + if ( keyWindow && [keyWindow respondsToSelector:@selector(autosaveWindowFrame)] ) + [[keyWindow windowController] autosaveWindowFrame]; + + // Now open the new window. + BrowserWindowController* controller = [self openBrowserWindowWithURLString:@"about:blank"]; + [controller focusURLBar]; +} + +-(IBAction)newTab:(id)aSender +{ + NSWindow* keyWindow = [mApplication keyWindow]; + if (keyWindow) + [[keyWindow windowController] newTab]; +} + +-(IBAction)closeTab:(id)aSender +{ + NSWindow* keyWindow = [mApplication keyWindow]; + if (keyWindow) + [[keyWindow windowController] closeTab]; +} + +-(IBAction) previousTab:(id)aSender +{ + NSWindow* keyWindow = [mApplication keyWindow]; + if (keyWindow) + [[keyWindow windowController] previousTab]; +} + +-(IBAction) nextTab:(id)aSender; +{ + NSWindow* keyWindow = [mApplication keyWindow]; + if (keyWindow) + [[keyWindow windowController] nextTab]; } -(IBAction) openFile:(id)aSender @@ -34,11 +151,16 @@ if ([urlArray count] == 0) return; NSURL* url = [urlArray objectAtIndex: 0]; + // ---------------------- + [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:url]; + // ---------------------- NSWindow* keyWindow = [mApplication keyWindow]; - if (keyWindow) - return [[keyWindow windowController] loadURL: url]; + if (keyWindow) { + [[keyWindow windowController] loadURL: url]; + [[[[keyWindow windowController] getMyBrowserView] getBrowserView] setActive: YES]; + } else - [self openBrowserWindowWithURL: url]; + [self openBrowserWindowWithURL: url]; } } @@ -53,27 +175,101 @@ [[keyWindow windowController] performAppropriateLocationAction]; } --(IBAction) back:(id)aSender +-(IBAction) savePage:(id)aSender +{ + NSWindow* keyWindow = [mApplication keyWindow]; + if (keyWindow) + [[keyWindow windowController] saveDocument: mFilterView filterList: mFilterList]; +} + +-(IBAction) printPage:(id)aSender +{ + NSWindow* keyWindow = [mApplication keyWindow]; + if (keyWindow) + [[keyWindow windowController] printDocument]; +} + +-(IBAction) printPreview:(id)aSender +{ + NSWindow* keyWindow = [mApplication keyWindow]; + if (keyWindow) + [[keyWindow windowController] printPreview]; +} + +-(IBAction) toggleOfflineMode:(id)aSender +{ + nsCOMPtr ioService(do_GetService(ioServiceContractID)); + if (!ioService) + return; + PRBool offline = PR_FALSE; + ioService->GetOffline(&offline); + ioService->SetOffline(!offline); + mOffline = !offline; + + // Update the menu item text. + // Set the menu item's text to "Go Online" if we're currently + // offline. + if (mOffline) + [mOfflineMenuItem setTitle: @"Go Online"]; + else + [mOfflineMenuItem setTitle: @"Work Offline"]; + + // Indicate that we are working offline. + [[NSNotificationCenter defaultCenter] postNotificationName:@"offlineModeChanged" object:nil]; +} + +// Edit menu actions. + + +// +// -findInPage +// +// Called in response to "Find" in edit menu. Opens the find dialog. We only keep +// one around for the whole app to use, showing/hiding as we see fit. +// +-(IBAction) findInPage:(id)aSender +{ + if ( !mFindDialog ) + mFindDialog = [[FindDlgController alloc] initWithWindowNibName: @"FindDialog"]; + [mFindDialog showWindow:self]; +} + + +// +// -findAgain +// +// Called in response to "Find Again" in edit menu. Tells the find controller +// to find the next occurrance of what's already been found. +// +-(IBAction) findAgain:(id)aSender +{ + if ( mFindDialog ) + [mFindDialog findAgain:aSender]; + else + NSBeep(); +} + +-(IBAction) goBack:(id)aSender { [[[mApplication keyWindow] windowController] back: aSender]; } --(IBAction) forward:(id)aSender +-(IBAction) goForward:(id)aSender { [[[mApplication keyWindow] windowController] forward: aSender]; } --(IBAction) reload:(id)aSender +-(IBAction) doReload:(id)aSender { - [[[mApplication keyWindow] windowController] reload: aSender]; + [(BrowserWindowController*)([[mApplication keyWindow] windowController]) reload: aSender]; } --(IBAction) stop:(id)aSender +-(IBAction) doStop:(id)aSender { - [[[mApplication keyWindow] windowController] stop: aSender]; + [(BrowserWindowController*)([[mApplication keyWindow] windowController]) stop: aSender]; } --(IBAction) home:(id)aSender +-(IBAction) goHome:(id)aSender { [[[mApplication keyWindow] windowController] home: aSender]; } @@ -86,9 +282,107 @@ -(BrowserWindowController*)openBrowserWindowWithURL: (NSURL*)aURL { BrowserWindowController* browser = [[BrowserWindowController alloc] initWithWindowNibName: @"BrowserWindow"]; - [browser loadURL: aURL]; + [browser loadURL: aURL]; [browser showWindow: self]; - return browser; + return browser; } +-(void)applicationWillTerminate: (NSNotification*)aNotification +{ + printf("Termination notification.\n"); + + // Autosave one of the windows. + NSWindow* keyWindow = [mApplication keyWindow]; + if (keyWindow) + [[keyWindow windowController] autosaveWindowFrame]; + + mMenuBookmarks->RemoveObserver(); + delete mMenuBookmarks; + mMenuBookmarks = nsnull; + nsCocoaBrowserService::TermEmbedding(); +} + +// Bookmarks menu actions. +-(IBAction) addBookmark:(id)aSender +{ + NSWindow* keyWindow = [mApplication keyWindow]; + if (keyWindow) + [[keyWindow windowController] addBookmarkExtended: YES]; +} + +-(IBAction) openMenuBookmark:(id)aSender +{ + NSWindow* keyWindow = [mApplication keyWindow]; + if (!keyWindow) { + [self openBrowserWindowWithURLString: @"about:blank"]; + keyWindow = [mApplication keyWindow]; + } + + BookmarksService::OpenMenuBookmark([keyWindow windowController], aSender); +} + +-(IBAction)manageBookmarks: (id)aSender +{ + NSWindow* keyWindow = [mApplication keyWindow]; + if (!keyWindow) { + [self openBrowserWindowWithURLString: @"about:blank"]; + keyWindow = [mApplication keyWindow]; + } + + [[keyWindow windowController] manageBookmarks: aSender]; +} + +- (MVPreferencesController *)preferencesController +{ + if (!preferencesController) { + preferencesController = [[MVPreferencesController sharedInstance] retain]; + } + return preferencesController; +} + +- (void)displayPreferencesWindow:sender +{ + [[self preferencesController] showPreferences:nil] ; +} + +- (IBAction)showAboutBox:(id)sender +{ + [[AboutBox sharedInstance] showPanel:sender]; +} + +- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename +{ + NSWindow* keyWindow = [mApplication keyWindow]; + + if (keyWindow) { + [[keyWindow windowController] loadURL:[NSURL fileURLWithPath:filename]]; + } else { + [self openBrowserWindowWithURL:[NSURL fileURLWithPath:filename]]; + } + + return YES; + +} + +- (IBAction)biggerTextSize:(id)aSender +{ + NSWindow* keyWindow = [mApplication keyWindow]; + if (keyWindow) + [[keyWindow windowController] biggerTextSize]; +} + +- (IBAction)smallerTextSize:(id)aSender +{ + NSWindow* keyWindow = [mApplication keyWindow]; + if (keyWindow) + [[keyWindow windowController] smallerTextSize]; +} + +- (IBAction)toggleSmoothText:(id)aSender +{ + // XXXdwh Grab the prefs service and just set the pref directly. + +} + + @end