From 80484796bd2ebc56c81bf968c6eea8cd794f3bf2 Mon Sep 17 00:00:00 2001 From: "smfr%smfr.org" Date: Fri, 25 Mar 2005 18:23:31 +0000 Subject: [PATCH] Fix bug 287339: correctly enable/disable bookmark items when tabs close, and windows change layers. Make the NSOpenPanel into a sheet when a window is up. Allow opening multiple items in the open panel, opening them in tabs. Remove [MainController pumpGeckoEventQueue] which is obsolete and unused. Add NSResponder+Utils.h/m to the project. Remove #ifdefs in AppComponents.mm now that we will be using nsSimpleGlobalHistory. git-svn-id: svn://10.0.0.236/trunk@171213 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/camino/Camino.xcode/project.pbxproj | 48 ++++ .../MainMenu.nib/keyedobjects.nib | Bin 22843 -> 22825 bytes .../camino/src/application/AppComponents.mm | 16 +- .../camino/src/application/MainController.h | 8 +- .../camino/src/application/MainController.mm | 240 +++++++++++++----- .../src/browser/BrowserWindowController.mm | 26 +- 6 files changed, 244 insertions(+), 94 deletions(-) diff --git a/mozilla/camino/Camino.xcode/project.pbxproj b/mozilla/camino/Camino.xcode/project.pbxproj index e1b3085eb70..00272638cde 100644 --- a/mozilla/camino/Camino.xcode/project.pbxproj +++ b/mozilla/camino/Camino.xcode/project.pbxproj @@ -1017,6 +1017,48 @@ settings = { }; }; + 0F5FD71B07F48CDC00E8EDBD = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = "NSResponder+Utils.h"; + path = "src/extensions/NSResponder+Utils.h"; + refType = 4; + sourceTree = ""; + }; + 0F5FD71C07F48CDC00E8EDBD = { + fileRef = 0F5FD71B07F48CDC00E8EDBD; + isa = PBXBuildFile; + settings = { + }; + }; + 0F5FD71D07F48CDC00E8EDBD = { + fileRef = 0F5FD71B07F48CDC00E8EDBD; + isa = PBXBuildFile; + settings = { + }; + }; + 0F5FD71E07F48CE500E8EDBD = { + fileEncoding = 30; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + name = "NSResponder+Utils.m"; + path = "src/extensions/NSResponder+Utils.m"; + refType = 4; + sourceTree = ""; + }; + 0F5FD71F07F48CE500E8EDBD = { + fileRef = 0F5FD71E07F48CE500E8EDBD; + isa = PBXBuildFile; + settings = { + }; + }; + 0F5FD72007F48CE500E8EDBD = { + fileRef = 0F5FD71E07F48CE500E8EDBD; + isa = PBXBuildFile; + settings = { + }; + }; 0F66E4A807D6D8D500444E2A = { fileRef = 0FCCE56707D6D7DA006DD3D1; isa = PBXBuildFile; @@ -2446,6 +2488,7 @@ 0FBC0EE30798FA2700E8E0E2, 0F13A30F07D7F3930034B176, 0F4752D407DC0F4D002AEE9F, + 0F5FD71C07F48CDC00E8EDBD, ); isa = PBXHeadersBuildPhase; runOnlyForDeploymentPostprocessing = 0; @@ -3559,6 +3602,7 @@ 0FBC0EE00798FA1900E8E0E2, 0F13A31007D7F3930034B176, 0F4752D507DC0F4D002AEE9F, + 0F5FD71F07F48CE500E8EDBD, ); isa = PBXSourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; @@ -6309,6 +6353,7 @@ 0FBC0EE40798FA2700E8E0E2, 0F13A31107D7F3930034B176, 0F4752D607DC0F4D002AEE9F, + 0F5FD71D07F48CDC00E8EDBD, ); isa = PBXHeadersBuildPhase; runOnlyForDeploymentPostprocessing = 0; @@ -7423,6 +7468,7 @@ 0FBC0EE10798FA1900E8E0E2, 0F13A31207D7F3930034B176, 0F4752D707DC0F4D002AEE9F, + 0F5FD72007F48CE500E8EDBD, ); isa = PBXSourcesBuildPhase; runOnlyForDeploymentPostprocessing = 0; @@ -14402,6 +14448,7 @@ F527C90203BCD43601A80166, F549ACE40302DEBB01026D5D, F5B34B04034A50C901A80166, + 0F5FD71B07F48CDC00E8EDBD, F5648739023C3857010001CA, F5C3AB810270072A01A80166, F583E3C203B8228F01A80166, @@ -14431,6 +14478,7 @@ F549ACDF0302DE6001026D5D, F527C90303BCD43601A80166, F5B34B01034A505F01A80166, + 0F5FD71E07F48CE500E8EDBD, F564873A023C3857010001CA, F583E3BF03B8228701A80166, F541495B02711A8301A80166, diff --git a/mozilla/camino/resources/localized/English.lproj/MainMenu.nib/keyedobjects.nib b/mozilla/camino/resources/localized/English.lproj/MainMenu.nib/keyedobjects.nib index 67d1473a763355d38890b1ec84070d4ca8c5a575..1c92b0f5e29bb8ade2a05ba5af4d5049b79ab09e 100644 GIT binary patch delta 4659 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 a7v0tFTK84=HTQM*P514{^~2l4zW)K-TQ(~I delta 4497 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 #import "SecurityDialogs.h" @@ -49,14 +47,12 @@ #include "nsIGenericFactory.h" -#ifdef SIMPLE_GLOBAL_HISTORY #include "nsSimpleGlobalHistory.h" // for some bizarre reason this is in nsDocShellCID.h #define NS_GLOBALHISTORY2_CONTRACTID \ "@mozilla.org/browser/global-history;2" -#endif // {0ffd3880-7a1a-11d6-a384-975d1d5f86fc} #define NS_SECURITYDIALOGS_CID \ @@ -76,7 +72,6 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(SecurityDialogs) NS_GENERIC_FACTORY_CONSTRUCTOR(CocoaPromptService) NS_GENERIC_FACTORY_CONSTRUCTOR(KeychainPrompt) -//NS_GENERIC_FACTORY_CONSTRUCTOR(nsDownloadListener) static nsresult nsDownloadListenerConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult) @@ -97,7 +92,6 @@ nsDownloadListenerConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult return rv; } -#ifdef SIMPLE_GLOBAL_HISTORY // we have to provide a custom constructor to work around a component manager // bug (see bug 276956) that can cause more than one instance of nsSimpleGlobalHistory // to be created (for each of the 2 services it implements). So we enforce its @@ -134,7 +128,6 @@ nsSimpleGlobalHistoryConstructor(nsISupports *aOuter, REFNSIID aIID, void **aRes // the QI does the AddRef return sGlobalHistorySingleton->QueryInterface(aIID, aResult); } -#endif // used by MainController to register the components in which we want to override @@ -176,10 +169,7 @@ static const nsModuleComponentInfo gAppComponents[] = { NS_COOKIEPROMPTSERVICE_CID, NS_COOKIEPROMPTSERVICE_CONTRACTID, CocoaPromptServiceConstructor - } - -#ifdef SIMPLE_GLOBAL_HISTORY - , + }, { "Global History", NS_SIMPLEGLOBALHISTORY_CID, @@ -191,9 +181,7 @@ static const nsModuleComponentInfo gAppComponents[] = { NS_SIMPLEGLOBALHISTORY_CID, NS_GLOBALHISTORY_AUTOCOMPLETE_CONTRACTID, nsSimpleGlobalHistoryConstructor - } -#endif - , + }, { "About Bookmarks Module", NS_ABOUT_BOOKMARKS_MODULE_CID, diff --git a/mozilla/camino/src/application/MainController.h b/mozilla/camino/src/application/MainController.h index b6931eccf6b..bd6c37107d5 100644 --- a/mozilla/camino/src/application/MainController.h +++ b/mozilla/camino/src/application/MainController.h @@ -72,7 +72,6 @@ typedef enum EBookmarkOpenBehavior // IBOutlet NSMenuItem* mOfflineMenuItem; IBOutlet NSMenuItem* mCloseWindowMenuItem; IBOutlet NSMenuItem* mCloseTabMenuItem; - IBOutlet NSMenuItem* mShowAllBookmarksMenuItem; IBOutlet NSMenu* mGoMenu; IBOutlet NSMenu* mBookmarksMenu; @@ -82,7 +81,8 @@ typedef enum EBookmarkOpenBehavior IBOutlet NSMenuItem* mBookmarksToolbarMenuItem; IBOutlet NSMenuItem* mAddBookmarkMenuItem; IBOutlet NSMenuItem* mCreateBookmarksFolderMenuItem; - IBOutlet NSMenuItem* mCreateBookmarksSeparatorMenuItem; + IBOutlet NSMenuItem* mCreateBookmarksSeparatorMenuItem; // unused + IBOutlet NSMenuItem* mShowAllBookmarksMenuItem; BOOL mOffline; @@ -169,7 +169,7 @@ typedef enum EBookmarkOpenBehavior - (void)adjustCloseTabMenuItemKeyEquivalent:(BOOL)inHaveTabs; - (void)fixCloseMenuItemKeyEquivalents; -- (void)adjustBookmarksMenuItemsEnabling:(BOOL)inBrowserWindowFrontmost; +- (void)adjustBookmarksMenuItemsEnabling; - (NSView*)getSavePanelView; - (NSWindow*)getFrontmostBrowserWindow; @@ -185,8 +185,6 @@ typedef enum EBookmarkOpenBehavior + (NSImage*)createImageForDragging:(NSImage*)aIcon title:(NSString*)aTitle; -- (void)pumpGeckoEventQueue; - // used by export bookmarks popup to say what file extension should be used on the resulting // bookmarks file. -(IBAction) setFileExtension:(id)aSender; diff --git a/mozilla/camino/src/application/MainController.mm b/mozilla/camino/src/application/MainController.mm index 7443d2f1002..8da8937ac6e 100644 --- a/mozilla/camino/src/application/MainController.mm +++ b/mozilla/camino/src/application/MainController.mm @@ -42,6 +42,8 @@ #import #import "NSString+Utils.h" +#import "NSResponder+Utils.h" +#import "NSMenu+Utils.h" #import "ChimeraUIConstants.h" #import "MainController.h" @@ -105,9 +107,16 @@ const int kReuseWindowOnAE = 2; @interface MainController(Private) - (void)setupStartpage; +- (void)installBookmarksMenuEnableHandler; +- (NSMenu*)bookmarksMenu; +- (BOOL)bookmarksItemsEnabled; +- (void)adjustBookmarkMenuItems; +- (void)windowLayeringDidChange:(NSNotification*)inNotifiction; +- (void)openPanelDidEnd:(NSOpenPanel*)inOpenPanel returnCode:(int)inReturnCode contextInfo:(void*)inContextInfo; @end +#pragma mark - @implementation MainController @@ -181,9 +190,18 @@ const int kReuseWindowOnAE = 2; -(void)applicationDidFinishLaunching:(NSNotification *)aNotification { + [self installBookmarksMenuEnableHandler]; + // initialize prefs if we haven't already. PreferenceManager *pm = [PreferenceManager sharedInstance]; + // register for window layering changes, so that we can update the bookmarks menu + NSNotificationCenter* notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter addObserver:self selector:@selector(windowLayeringDidChange:) name:NSWindowDidBecomeKeyNotification object:nil]; + [notificationCenter addObserver:self selector:@selector(windowLayeringDidChange:) name:NSWindowDidResignKeyNotification object:nil]; + [notificationCenter addObserver:self selector:@selector(windowLayeringDidChange:) name:NSWindowDidBecomeMainNotification object:nil]; + [notificationCenter addObserver:self selector:@selector(windowLayeringDidChange:) name:NSWindowDidResignMainNotification object:nil]; + // start bookmarks RunLoopMessenger *mainThreadRunLoopMessenger = [[RunLoopMessenger alloc] init]; [NSThread detachNewThreadSelector:@selector(startBookmarksManager:) toTarget:[BookmarkManager class] withObject:mainThreadRunLoopMessenger]; @@ -226,10 +244,9 @@ const int kReuseWindowOnAE = 2; long systemVersion; OSErr err = ::Gestalt(gestaltSystemVersion, &systemVersion); if ((err == noErr) && (systemVersion >= 0x00001023)) { - NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - [nc addObserver:self selector:@selector(availableServicesChanged:) name:NetworkServicesAvailableServicesChanged object:nil]; - [nc addObserver:self selector:@selector(serviceResolved:) name:NetworkServicesResolutionSuccess object:nil]; - [nc addObserver:self selector:@selector(serviceResolutionFailed:) name:NetworkServicesResolutionFailure object:nil]; + [notificationCenter addObserver:self selector:@selector(availableServicesChanged:) name:NetworkServicesAvailableServicesChanged object:nil]; + [notificationCenter addObserver:self selector:@selector(serviceResolved:) name:NetworkServicesResolutionSuccess object:nil]; + [notificationCenter addObserver:self selector:@selector(serviceResolutionFailed:) name:NetworkServicesResolutionFailure object:nil]; doingRendezvous = YES; } } @@ -279,6 +296,13 @@ const int kReuseWindowOnAE = 2; [self autorelease]; } +- (void)windowLayeringDidChange:(NSNotification*)inNotifiction +{ + // The key window isn't set until after this notification is processed, so we have to delay the actual + // menu update. + [self performSelectorOnMainThread:@selector(adjustBookmarksMenuItemsEnabling) withObject:nil waitUntilDone:NO]; +} + - (NSMenu *)applicationDockMenu:(NSApplication *)sender { return mDockMenu; @@ -497,29 +521,65 @@ Otherwise, we return the URL we originally got. Right now this supports .url and -(IBAction) openFile:(id)aSender { - NSOpenPanel* openPanel = [[[NSOpenPanel alloc] init] autorelease]; - [openPanel setCanChooseFiles: YES]; - [openPanel setCanChooseDirectories: NO]; - [openPanel setAllowsMultipleSelection: NO]; - NSArray* array = [NSArray arrayWithObjects: @"htm",@"html",@"shtml",@"xhtml",@"xml", - @"txt",@"text", - @"gif",@"jpg",@"jpeg",@"png",@"bmp", - @"webloc",@"url", - nil]; - int result = [openPanel runModalForTypes: array]; - if (result == NSOKButton) { - NSArray* urlArray = [openPanel URLs]; - if ([urlArray count] == 0) - return; - NSURL* url = [urlArray objectAtIndex: 0]; - [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:url]; - url = [MainController decodeLocalFileURL:url]; - BrowserWindowController* browserController = [self getMainWindowBrowserController]; - if (browserController) - [browserController loadURL:[url absoluteString] referrer:nil activate:YES allowPopups:NO]; - else - [self openBrowserWindowWithURL:[url absoluteString] andReferrer:nil behind:nil allowPopups:NO]; - } + NSOpenPanel* openPanel = [NSOpenPanel openPanel]; + [openPanel setCanChooseFiles:YES]; + [openPanel setCanChooseDirectories:NO]; + [openPanel setAllowsMultipleSelection:YES]; + NSArray* fileTypes = [NSArray arrayWithObjects: @"htm",@"html",@"shtml",@"xhtml",@"xml", + @"txt",@"text", + @"gif",@"jpg",@"jpeg",@"png",@"bmp", + @"webloc",@"url", + nil]; + + BrowserWindowController* browserController = [self getMainWindowBrowserController]; + if (browserController) + { + [openPanel beginSheetForDirectory:nil + file:nil + types:fileTypes + modalForWindow:[browserController window] + modalDelegate:self + didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) + contextInfo:browserController]; + } + else + { + int result = [openPanel runModalForTypes:fileTypes]; + [self openPanelDidEnd:openPanel returnCode:result contextInfo:nil]; + } +} + +- (void)openPanelDidEnd:(NSOpenPanel*)inOpenPanel returnCode:(int)inReturnCode contextInfo:(void*)inContextInfo +{ + if (inReturnCode != NSOKButton) + return; + + BrowserWindowController* browserController = (BrowserWindowController*)inContextInfo; + + NSArray* urlArray = [inOpenPanel URLs]; + if ([urlArray count] == 0) + return; + + NSMutableArray* urlStringsArray = [NSMutableArray arrayWithCapacity:[urlArray count]]; + + // fix them up + NSEnumerator* urlsEnum = [urlArray objectEnumerator]; + NSURL* curURL; + while ((curURL = [urlsEnum nextObject])) + { + [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:curURL]; + curURL = [MainController decodeLocalFileURL:curURL]; + [urlStringsArray addObject:[curURL path]]; + } + + if (!browserController) + { + [self openBrowserWindowWithURLs:urlStringsArray behind:nil allowPopups:YES]; + } + else + { + [browserController openURLArray:urlStringsArray replaceExistingTabs:YES allowPopups:YES]; + } } -(IBAction) openLocation:(id)aSender @@ -713,34 +773,63 @@ Otherwise, we return the URL we originally got. Right now this supports .url and [[ProgressDlgController sharedDownloadController] showWindow:aSender]; } + +// super sekrit private API +extern "C" MenuRef _NSGetCarbonMenu(NSMenu* aMenu); + +static OSStatus MenuEventHandler(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void *inUserData) +{ + UInt32 eventKind = ::GetEventKind(inEvent); + switch (eventKind) + { + case kEventMenuOpening: + { + MainController* mainController = (MainController*)inUserData; + MenuRef theMenu; + OSStatus err = ::GetEventParameter(inEvent, kEventParamDirectObject, typeMenuRef, NULL, sizeof(MenuRef), NULL, &theMenu); + if ((err == noErr) && (theMenu == _NSGetCarbonMenu([mainController bookmarksMenu]))) + { + [mainController adjustBookmarkMenuItems]; + } + } + break; + } + + // always let the event propagate + return eventNotHandledErr; +} + +// install a carbon event handler so that we can tell when a menu is being opened +// on 10.3, we could use NSMenu delegate methods +- (void)installBookmarksMenuEnableHandler +{ + const EventTypeSpec menuEventList[] = { { kEventClassMenu, kEventMenuOpening } }; + + InstallApplicationEventHandler(NewEventHandlerUPP(MenuEventHandler), + GetEventTypeCount(menuEventList), + menuEventList, (void*)self, NULL); +} + // -// -adjustBookmarksMenuItemsEnabling: +// -adjustBookmarksMenuItemsEnabling // // We've turned off auto-enabling for the bookmarks menu because of the unknown // number of bookmarks in the list so we have to manage it manually. This routine // should be called whenever a window goes away, becomes main, or is no longer main. // -- (void)adjustBookmarksMenuItemsEnabling:(BOOL)inBrowserWindowFrontmost +- (void)adjustBookmarksMenuItemsEnabling { - [mAddBookmarkMenuItem setEnabled:inBrowserWindowFrontmost]; - [mCreateBookmarksFolderMenuItem setEnabled:inBrowserWindowFrontmost]; - [mCreateBookmarksSeparatorMenuItem setEnabled:YES]; + NSResponder* firstResponder = [[NSApp keyWindow] firstResponder]; + [mAddBookmarkMenuItem setEnabled:([firstResponder responderForAction:[mAddBookmarkMenuItem action]] != nil)]; + [mCreateBookmarksFolderMenuItem setEnabled:([firstResponder responderForAction:[mCreateBookmarksFolderMenuItem action]] != nil)]; + [mCreateBookmarksSeparatorMenuItem setEnabled:([firstResponder responderForAction:[mCreateBookmarksSeparatorMenuItem action]] != nil)]; - - // We need the frontmost browser for the case of the dl/about window - // is the main so we can ensure the "show/hide all bookmarks" has the correct - // state for that window. Unfortunately, we can't rely on |-getFrontmostBrowserWindow| in all - // cases, such as when a window has just been opened. As a result, first - // try |-getMainWindowBrowserController| and if that fails use fFBW as a fallback. - BrowserWindowController* browserController = [self getMainWindowBrowserController]; - if (!browserController) - browserController = (BrowserWindowController*)[[self getFrontmostBrowserWindow] windowController]; - - BOOL showBookmarksEnabled = YES; + BOOL browserWindowIsMain = [[[NSApp mainWindow] delegate] isMemberOfClass:[BrowserWindowController class]]; + BOOL showBookmarksEnabled = [self bookmarksItemsEnabled]; BOOL useShowLabel = YES; - - if (browserController) + if (browserWindowIsMain) { + BrowserWindowController* browserController = (BrowserWindowController*)[[NSApp mainWindow] delegate]; if ([browserController bookmarkManagerIsVisible]) { useShowLabel = NO; @@ -759,6 +848,51 @@ Otherwise, we return the URL we originally got. Right now this supports .url and [mShowAllBookmarksMenuItem setEnabled:showBookmarksEnabled]; } +- (NSMenu*)bookmarksMenu +{ + return mBookmarksMenu; +} + +- (BOOL)bookmarksItemsEnabled +{ + BOOL enableItems = YES; + + // NSLog(@"Main window %@, key window %@", [NSApp mainWindow], [NSApp keyWindow]); + + // I can't help thinking that there's an easier way, via NSResponder-type logic + // XXX this isn't quite right yet. It disables stuff when the toolbar customization + // sheet is up, which is unnecessary. + NSEnumerator* windowEnum = [[NSApp windows] objectEnumerator]; + NSWindow* curWindow; + while ((curWindow = [windowEnum nextObject])) + { + if (![curWindow isVisible]) + continue; + + if ([curWindow level] == NSModalPanelWindowLevel) + { + enableItems = NO; + break; + } + + if ([curWindow isSheet]) + { + enableItems = NO; + break; + } + } + + return enableItems; +} + +- (void)adjustBookmarkMenuItems +{ + BOOL enableItems = [self bookmarksItemsEnabled]; + + int firstBookmarkItem = [mBookmarksMenu indexOfItemWithTag:kBookmarksDividerTag] + 1; + [mBookmarksMenu setAllItemsEnabled:enableItems startingWithItemAtIndex:firstBookmarkItem includingSubmenus:YES]; +} + - (NSView*)getSavePanelView { if (!mFilterView) @@ -784,8 +918,8 @@ Otherwise, we return the URL we originally got. Right now this supports .url and unsigned int chromeMask = [[thisWindow windowController] chromeMask]; if (chromeMask == 0 || (chromeMask & nsIWebBrowserChrome::CHROME_TOOLBAR && - chromeMask & nsIWebBrowserChrome::CHROME_STATUSBAR && - chromeMask & nsIWebBrowserChrome::CHROME_WINDOW_RESIZE)) { + chromeMask & nsIWebBrowserChrome::CHROME_STATUSBAR && + chromeMask & nsIWebBrowserChrome::CHROME_WINDOW_RESIZE)) { foundWindow = thisWindow; break; } @@ -1501,18 +1635,6 @@ static int SortByProtocolAndName(NSDictionary* item1, NSDictionary* item2, void [self openNewWindowOrTabWithURL:pageToLoad andReferrer:nil]; } -// currently unused -- (void)pumpGeckoEventQueue -{ - nsCOMPtr service = do_GetService(NS_EVENTQUEUESERVICE_CONTRACTID); - if (!service) return; - - nsCOMPtr queue; - service->GetThreadEventQueue(NS_CURRENT_THREAD, getter_AddRefs(queue)); - if (queue) - queue->ProcessPendingEvents(); -} - // Reads the URL from a .webloc . Returns nil on failure. +(NSString*)urlStringFromWebloc:(NSString*)inFile { diff --git a/mozilla/camino/src/browser/BrowserWindowController.mm b/mozilla/camino/src/browser/BrowserWindowController.mm index 64db0f3f3b1..0c0252ab417 100644 --- a/mozilla/camino/src/browser/BrowserWindowController.mm +++ b/mozilla/camino/src/browser/BrowserWindowController.mm @@ -443,16 +443,14 @@ enum BWCOpenDest { - (void)windowDidBecomeMain:(NSNotification *)notification { - // we have to manually enable/disable the bookmarks menu items, because we - // turn autoenabling off for that menu - [[NSApp delegate] adjustBookmarksMenuItemsEnabling:YES]; + // MainController listens for window layering notifications and updates bookmarks, + // so we don't need to do anything here } - (void)windowDidResignMain:(NSNotification *)notification { - // we have to manually enable/disable the bookmarks menu items, because we - // turn autoenabling off for that menu - [[NSApp delegate] adjustBookmarksMenuItemsEnabling:NO]; + // MainController listens for window layering notifications and updates bookmarks, + // so we don't need to do anything here } -(void)mouseMoved:(NSEvent*)aEvent @@ -487,9 +485,6 @@ enum BWCOpenDest { { mClosingWindow = YES; -#if DEBUG - NSLog(@"Window will close notification."); -#endif [self autosaveWindowFrame]; // ensure that the URL auto-complete popup is closed before the mork @@ -507,10 +502,6 @@ enum BWCOpenDest { // Tell the BrowserTabView the window is closed [mTabBrowser windowClosed]; - // we have to manually enable/disable the bookmarks menu items, because we - // turn autoenabling off for that menu - [[NSApp delegate] adjustBookmarksMenuItemsEnabling:NO]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; // autorelease just in case we're here because of a window closing @@ -1319,7 +1310,7 @@ enum BWCOpenDest { - (void)contentViewChangedTo:(NSView*)inView forURL:(NSString*)inURL { // update bookmarks menu - [[NSApp delegate] adjustBookmarksMenuItemsEnabling:[[self window] isMainWindow]]; + [[NSApp delegate] adjustBookmarksMenuItemsEnabling]; } - (void)updateFromFrontmostTab @@ -1510,7 +1501,7 @@ enum BWCOpenDest { else [self loadURL:@"about:bookmarks" referrer:nil activate:YES allowPopups:NO]; - [[NSApp delegate] adjustBookmarksMenuItemsEnabling:[[self window] isMainWindow]]; + [[NSApp delegate] adjustBookmarksMenuItemsEnabling]; } // @@ -2322,9 +2313,12 @@ enum BWCOpenDest { -(IBAction)closeCurrentTab:(id)sender { - if ( [mTabBrowser numberOfTabViewItems] > 1 ) { + if ( [mTabBrowser numberOfTabViewItems] > 1 ) + { [[[mTabBrowser selectedTabViewItem] view] windowClosed]; [mTabBrowser removeTabViewItem:[mTabBrowser selectedTabViewItem]]; + + [[NSApp delegate] adjustBookmarksMenuItemsEnabling]; } }