From 90774053bf03e31d7b9f80cede1dd9234b051f0e Mon Sep 17 00:00:00 2001 From: "stuart.morgan%alumni.case.edu" Date: Fri, 17 Aug 2007 17:25:01 +0000 Subject: [PATCH] Camino only - Bug 330666: Switch to using NSSearchField in the toolbar and search sheet. r=hwaara sr=pink git-svn-id: svn://10.0.0.236/trunk@232272 18797224-902f-48f8-a5cc-f745e15eee43 --- .../camino/Camino.xcodeproj/project.pbxproj | 14 +- .../BrowserWindow.nib/classes.nib | 18 +- .../English.lproj/BrowserWindow.nib/info.nib | 12 +- .../BrowserWindow.nib/keyedobjects.nib | Bin 32530 -> 32228 bytes mozilla/camino/src/browser/BrowserWindow.h | 2 - .../src/browser/BrowserWindowController.h | 8 +- .../src/browser/BrowserWindowController.mm | 181 ++++++++++-------- mozilla/camino/src/extensions/NSMenu+Utils.h | 3 + mozilla/camino/src/extensions/NSMenu+Utils.m | 11 ++ 9 files changed, 149 insertions(+), 100 deletions(-) diff --git a/mozilla/camino/Camino.xcodeproj/project.pbxproj b/mozilla/camino/Camino.xcodeproj/project.pbxproj index c3d481d9234..acca053650c 100644 --- a/mozilla/camino/Camino.xcodeproj/project.pbxproj +++ b/mozilla/camino/Camino.xcodeproj/project.pbxproj @@ -7,6 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + 00335B8D0C655ABC00A607F2 /* WebSearchField.h in Headers */ = {isa = PBXBuildFile; fileRef = 00335B8B0C655ABC00A607F2 /* WebSearchField.h */; }; + 00335B8E0C655ABC00A607F2 /* WebSearchField.mm in Sources */ = {isa = PBXBuildFile; fileRef = 00335B8C0C655ABC00A607F2 /* WebSearchField.mm */; }; + 00335B8F0C655ABC00A607F2 /* WebSearchField.h in Headers */ = {isa = PBXBuildFile; fileRef = 00335B8B0C655ABC00A607F2 /* WebSearchField.h */; }; + 00335B900C655ABC00A607F2 /* WebSearchField.mm in Sources */ = {isa = PBXBuildFile; fileRef = 00335B8C0C655ABC00A607F2 /* WebSearchField.mm */; }; 0081150B0B180DDE001CB3F0 /* libthebes.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0081150A0B180DDE001CB3F0 /* libthebes.a */; }; 0081150D0B180DFA001CB3F0 /* libgkgfxthebes.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0081150C0B180DFA001CB3F0 /* libgkgfxthebes.a */; }; 008115430B180F35001CB3F0 /* libthebes.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 008115420B180F35001CB3F0 /* libthebes.dylib */; }; @@ -2318,6 +2322,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 00335B8B0C655ABC00A607F2 /* WebSearchField.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = WebSearchField.h; path = src/browser/WebSearchField.h; sourceTree = ""; }; + 00335B8C0C655ABC00A607F2 /* WebSearchField.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; name = WebSearchField.mm; path = src/browser/WebSearchField.mm; sourceTree = ""; }; 0081150A0B180DDE001CB3F0 /* libthebes.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libthebes.a; path = ../staticlib/libthebes.a; sourceTree = SOURCE_ROOT; }; 0081150C0B180DFA001CB3F0 /* libgkgfxthebes.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgkgfxthebes.a; path = ../gfx/src/thebes/libgkgfxthebes.a; sourceTree = SOURCE_ROOT; }; 008115420B180F35001CB3F0 /* libthebes.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libthebes.dylib; path = ../dist/Embed/libthebes.dylib; sourceTree = SOURCE_ROOT; }; @@ -2496,7 +2502,7 @@ 3F42EFAC05EC13F90045A30C /* throbber-11.tif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; name = "throbber-11.tif"; path = "resources/images/throbber/throbber-11.tif"; sourceTree = SOURCE_ROOT; }; 3F42EFAD05EC13F90045A30C /* throbber-12.tif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; name = "throbber-12.tif"; path = "resources/images/throbber/throbber-12.tif"; sourceTree = SOURCE_ROOT; }; 3F44AD8705BDFB9F00CB4B08 /* Info-Camino.plist */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "Info-Camino.plist"; sourceTree = ""; }; - 3F44AD8805BDFB9F00CB4B08 /* Camino.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Camino.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 3F44AD8805BDFB9F00CB4B08 /* Camino.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Camino.app; sourceTree = BUILT_PRODUCTS_DIR; }; 3F44AD9E05BDFB9F00CB4B08 /* Info-AppearancePrefPane.plist */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "Info-AppearancePrefPane.plist"; sourceTree = ""; }; 3F44AD9F05BDFB9F00CB4B08 /* Appearance.prefPane */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Appearance.prefPane; sourceTree = BUILT_PRODUCTS_DIR; }; 3F44ADB205BDFBA000CB4B08 /* Info-NavigationPrefPane.plist */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "Info-NavigationPrefPane.plist"; sourceTree = ""; }; @@ -3890,6 +3896,8 @@ 1F8407030C5705CC007B893D /* TabThumbnailGridView.mm */, 1F8407050C5705CC007B893D /* ThumbnailView.h */, 1F8407060C5705CC007B893D /* ThumbnailView.m */, + 00335B8B0C655ABC00A607F2 /* WebSearchField.h */, + 00335B8C0C655ABC00A607F2 /* WebSearchField.mm */, 3003B8890445124400B85BF3 /* SearchTextField */, F558137B030AEF9B0176F207 /* Site icons */, ); @@ -4735,6 +4743,7 @@ DE6D27E50C1A013800292043 /* CHPermissionManager.h in Headers */, 1F8407080C5705CC007B893D /* TabThumbnailGridView.h in Headers */, 1F8407090C5705CC007B893D /* ThumbnailView.h in Headers */, + 00335B8D0C655ABC00A607F2 /* WebSearchField.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4892,6 +4901,7 @@ DE6D27E40C1A013800292043 /* CHPermissionManager.h in Headers */, 1F840B2B0C57D807007B893D /* TabThumbnailGridView.h in Headers */, 1F840B2D0C57D807007B893D /* ThumbnailView.h in Headers */, + 00335B8F0C655ABC00A607F2 /* WebSearchField.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5743,6 +5753,7 @@ 1F8407070C5705CC007B893D /* TabThumbnailGridView.mm in Sources */, 1F84070A0C5705CC007B893D /* ThumbnailView.m in Sources */, 33F3B70B0C63F5F7007DFBD0 /* ScriptingSupport.mm in Sources */, + 00335B8E0C655ABC00A607F2 /* WebSearchField.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5913,6 +5924,7 @@ 1F840B2C0C57D807007B893D /* TabThumbnailGridView.mm in Sources */, 1F840B2E0C57D807007B893D /* ThumbnailView.m in Sources */, 33F3B70C0C63F5F7007DFBD0 /* ScriptingSupport.mm in Sources */, + 00335B900C655ABC00A607F2 /* WebSearchField.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/classes.nib b/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/classes.nib index 69123c69d15..79ec9a4eff1 100644 --- a/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/classes.nib +++ b/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/classes.nib @@ -85,12 +85,7 @@ SUPERCLASS = NSTabView; }, {CLASS = BrowserTabViewItem; LANGUAGE = ObjC; SUPERCLASS = IconTabViewItem; }, - { - CLASS = BrowserWindow; - LANGUAGE = ObjC; - OUTLETS = {mAutoCompleteTextField = id; }; - SUPERCLASS = NSWindow; - }, + {CLASS = BrowserWindow; LANGUAGE = ObjC; SUPERCLASS = NSWindow; }, { ACTIONS = { addBookmark = id; @@ -98,6 +93,7 @@ addBookmarkForLink = id; addBookmarkSeparator = id; addBookmarkWithoutPrompt = id; + addTabGroup = id; addTabGroupWithoutPrompt = id; addToAddressBook = id; back = id; @@ -131,7 +127,6 @@ openLinkInNewTab = id; openLinkInNewWindow = id; pageSetup = id; - performSearch = id; previousTab = id; printDocument = id; reload = id; @@ -142,6 +137,7 @@ saveImageAs = id; saveLinkAs = id; savePageAs = id; + searchFieldTriggered = id; searchForSelection = id; sendURL = id; sendURLFromLink = id; @@ -149,6 +145,7 @@ showPageInfo = id; showSiteCertificate = id; stop = id; + toggleStatusBar = id; viewOnlyThisImage = id; viewPageSource = id; viewSource = id; @@ -173,8 +170,8 @@ mPersonalToolbar = BookmarkToolbar; mProgress = NSProgressIndicator; mProxyIcon = PageProxyIcon; - mSearchBar = SearchTextField; - mSearchSheetTextField = SearchTextField; + mSearchBar = NSSearchField; + mSearchSheetTextField = NSSearchField; mSearchSheetWindow = NSWindow; mStatus = NSTextField; mStatusBar = NSView; @@ -288,7 +285,8 @@ {CLASS = StatusBarView; LANGUAGE = ObjC; SUPERCLASS = NSView; }, {CLASS = TabButtonCell; LANGUAGE = ObjC; SUPERCLASS = RolloverTrackingCell; }, {CLASS = ThrobberHandler; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, - {CLASS = TruncatingTextAndImageCell; LANGUAGE = ObjC; SUPERCLASS = NSCell; } + {CLASS = TruncatingTextAndImageCell; LANGUAGE = ObjC; SUPERCLASS = NSCell; }, + {CLASS = WebSearchField; LANGUAGE = ObjC; SUPERCLASS = NSSearchField; } ); IBVersion = 1; } \ No newline at end of file diff --git a/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/info.nib b/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/info.nib index a89de086947..732b5aa47f2 100644 --- a/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/info.nib +++ b/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/info.nib @@ -3,12 +3,20 @@ IBDocumentLocation - 60 58 356 240 0 0 1680 1028 + 67 57 356 240 0 0 1680 1028 + IBEditorPositions + + 1066 + 679 653 370 64 0 0 1680 1028 + 297 + 67 302 226 337 0 0 1680 1028 + IBFramework Version 446.1 IBOpenObjects - 10 + 806 + 1066 IBSystem Version 8P2137 diff --git a/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/keyedobjects.nib b/mozilla/camino/resources/localized/English.lproj/BrowserWindow.nib/keyedobjects.nib index c7749afd0d66ab9c9c359c4ebccac598e0f3d1dc..5b834e38735ab5b93791112b551c424b3c719271 100644 GIT binary patch literal 32228 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 z @@ -123,8 +123,8 @@ typedef enum IBOutlet BookmarkToolbar* mPersonalToolbar; - IBOutlet SearchTextField* mSearchBar; - IBOutlet SearchTextField* mSearchSheetTextField; + IBOutlet WebSearchField* mSearchBar; + IBOutlet WebSearchField* mSearchSheetTextField; IBOutlet NSWindow* mSearchSheetWindow; // Context menu outlets. @@ -215,7 +215,7 @@ typedef enum - (IBAction)printDocument:(id)aSender; - (IBAction)pageSetup:(id)aSender; -- (IBAction)performSearch:(id)aSender; +- (IBAction)searchFieldTriggered:(id)aSender; - (IBAction)searchForSelection:(id)aSender; - (IBAction)sendURL:(id)aSender; - (IBAction)sendURLFromLink:(id)aSender; diff --git a/mozilla/camino/src/browser/BrowserWindowController.mm b/mozilla/camino/src/browser/BrowserWindowController.mm index a26aed04c1a..0dfff67e9de 100644 --- a/mozilla/camino/src/browser/BrowserWindowController.mm +++ b/mozilla/camino/src/browser/BrowserWindowController.mm @@ -67,13 +67,11 @@ #import "UserDefaults.h" #import "PageProxyIcon.h" #import "AutoCompleteTextField.h" -#import "SearchTextField.h" -#import "SearchTextFieldCell.h" -#import "STFPopUpButtonCell.h" #import "DraggableImageAndTextCell.h" #import "MVPreferencesController.h" #import "ViewCertificateDialogController.h" #import "ExtendedSplitView.h" +#import "WebSearchField.h" #import "wallet.h" #include "nsString.h" @@ -540,7 +538,7 @@ enum BWCOpenDest { - (void)openNewWindowWithDescriptor:(nsISupports*)aDesc displayType:(PRUint32)aDisplayType loadInBackground:(BOOL)aLoadInBG; - (void)openNewTabWithDescriptor:(nsISupports*)aDesc displayType:(PRUint32)aDisplayType loadInBackground:(BOOL)aLoadInBG; - (BOOL)isPageTextFieldFocused; -- (void)performSearch:(SearchTextField *)inSearchField inView:(BWCOpenDest)inDest inBackground:(BOOL)inLoadInBG; +- (void)performSearch:(WebSearchField*)inSearchField inView:(BWCOpenDest)inDest inBackground:(BOOL)inLoadInBG; - (int)historyIndexOfPageBeforeBookmarkManager; - (void)goToLocationFromToolbarURLField:(AutoCompleteTextField *)inURLField inView:(BWCOpenDest)inDest inBackground:(BOOL)inLoadInBG; @@ -578,6 +576,8 @@ enum BWCOpenDest { - (void)focusedElement:(nsIDOMElement**)outElement; - (void)focusController:(nsIFocusController**)outController; +- (void)setUpSearchFields; + @end #pragma mark - @@ -870,20 +870,8 @@ enum BWCOpenDest { [mStatus setBackgroundColor:[NSColor windowBackgroundColor]]; [mStatus setDrawsBackground:YES]; - // Set up the toolbar's search text field - NSMutableArray *searchTitles = - [NSMutableArray arrayWithArray:[[[BrowserWindowController searchURLDictionary] allKeys] sortedArrayUsingSelector:@selector(compare:)]]; - - [searchTitles removeObject:@"PreferredSearchEngine"]; - - [mSearchBar addPopUpMenuItemsWithTitles:searchTitles]; - [[[mSearchBar cell] popUpButtonCell] selectItemWithTitle: - [[BrowserWindowController searchURLDictionary] objectForKey:@"PreferredSearchEngine"]]; - - // Set the sheet's search text field - [mSearchSheetTextField addPopUpMenuItemsWithTitles:searchTitles]; - [[[mSearchSheetTextField cell] popUpButtonCell] selectItemWithTitle: - [[BrowserWindowController searchURLDictionary] objectForKey:@"PreferredSearchEngine"]]; + // Set up the menus in the search fields + [self setUpSearchFields]; // Get our saved dimensions. NSRect oldFrame = [[self window] frame]; @@ -1399,9 +1387,6 @@ enum BWCOpenDest { [toolbarItem setMinSize:NSMakeSize(kMinimumLocationBarWidth, NSHeight([mLocationToolbarView frame]))]; [toolbarItem setMaxSize:NSMakeSize(FLT_MAX, NSHeight([mLocationToolbarView frame]))]; - [mSearchBar setTarget:self]; - [mSearchBar setAction:@selector(performSearch:)]; - [menuFormRep setTarget:self]; [menuFormRep setAction:@selector(performAppropriateLocationAction)]; [menuFormRep setTitle:[toolbarItem label]]; @@ -1676,6 +1661,10 @@ enum BWCOpenDest { { SEL action = [aMenuItem action]; + // Always allow the search engine menu to work + if (action == @selector(searchEngineChanged:)) + return YES; + // Disable all window-specific menu items while a sheet is showing. // We don't do this in validateActionBySelector: because toolbar items shouldn't // suddenly get a disabled look when a sheet appears (they aren't clickable anyway). @@ -2261,7 +2250,7 @@ enum BWCOpenDest { { [mSearchSheetWindow orderOut:self]; [NSApp endSheet:mSearchSheetWindow returnCode:1]; - [self performSearch:mSearchSheetTextField]; + [self performSearch:mSearchSheetTextField inView:kDestinationCurrentView inBackground:NO]; } - (IBAction)cancelSearchSheet:(id)sender @@ -2524,11 +2513,36 @@ enum BWCOpenDest { [[mBrowserView getBrowserView] pageSetup]; } -- (IBAction)performSearch:(id)aSender +// -searchFieldTriggered: +// +// This should be used *only* as an action method for a WebSearchField, and +// never invoked programatically. +- (IBAction)searchFieldTriggered:(id)aSender { - // If we have a valid SearchTextField, perform a search using its contents - if ([aSender isKindOfClass:[SearchTextField class]]) - [self performSearch:(SearchTextField *)aSender inView:kDestinationCurrentView inBackground:NO]; + // WebSearchField sends an action on clearing the search field, which isn't + // distinguishable from submitting an empty search, so we make sure the + // trigger was someone hitting return/enter if it's empty. + BOOL performSearch = NO; + if ([[aSender stringValue] length] > 0) { + performSearch = YES; + } + else { + NSEvent* currentEvent = [NSApp currentEvent]; + if (([currentEvent type] == NSKeyDown) && [[currentEvent characters] length] > 0) { + unichar character = [[currentEvent characters] characterAtIndex:0]; + if ((character == NSCarriageReturnCharacter) || (character == NSEnterCharacter)) + performSearch = YES; + } + } + + if (performSearch) { + // If it came from the search sheet, dismiss the sheet now + if (aSender == mSearchSheetTextField) { + [mSearchSheetWindow orderOut:self]; + [NSApp endSheet:mSearchSheetWindow returnCode:1]; + } + [self performSearch:aSender inView:kDestinationCurrentView inBackground:NO]; + } } // @@ -2554,7 +2568,7 @@ enum BWCOpenDest { [self performSearch:mSearchBar inView:destination inBackground:[BrowserWindowController shouldLoadInBackground:nil]]; } else - [self performSearch:mSearchBar]; + [self performSearch:mSearchBar inView:kDestinationCurrentView inBackground:NO]; } // @@ -2563,25 +2577,16 @@ enum BWCOpenDest { // performs a search using searchField and opens either in the current view, a new tab, or a new // window. If it's a new tab or window, loadInBG determines whether the window/tab is opened in the background // --(void)performSearch:(SearchTextField *)inSearchField inView:(BWCOpenDest)inDest inBackground:(BOOL)inLoadInBG +-(void)performSearch:(WebSearchField*)inSearchField inView:(BWCOpenDest)inDest inBackground:(BOOL)inLoadInBG { - // Get the search URL from our dictionary of sites and search urls - NSMutableString *searchURL = [NSMutableString stringWithString: - [[BrowserWindowController searchURLDictionary] objectForKey: - [inSearchField titleOfSelectedPopUpItem]]]; - NSString *currentURL = [[self getBrowserWrapper] currentURI]; NSString *searchString = [inSearchField stringValue]; - - const char *aURLSpec = [currentURL lossyCString]; - NSString *aDomain = @""; - nsCOMPtr aURI; + NSMutableString *searchURL = [[[inSearchField currentSearchURL] mutableCopy] autorelease]; // If we have an about: type URL, remove " site:%d" from the search string // This is a fix to deal with Google's Search this Site feature // If other sites use %d to search the site, we'll have to have specific rules // for those sites. - - if ([currentURL hasPrefix:@"about:"]) { + if ([[[self getBrowserWrapper] currentURI] hasPrefix:@"about:"]) { NSRange domainStringRange = [searchURL rangeOfString:@" site:%d" options:NSBackwardsSearch]; @@ -2592,31 +2597,34 @@ enum BWCOpenDest { // If they didn't type anything in the search field, visit the domain of // the search site, i.e. www.google.com for the Google site - if ([[inSearchField stringValue] isEqualToString:@""]) { - aURLSpec = [searchURL lossyCString]; + if ([searchString isEqualToString:@""]) { + const char *urlSpec = [searchURL lossyCString]; - if (NS_NewURI(getter_AddRefs(aURI), aURLSpec) == NS_OK) { + nsCOMPtr searchURI; + if (NS_NewURI(getter_AddRefs(searchURI), urlSpec) == NS_OK) { nsCAutoString spec; - aURI->GetHost(spec); + searchURI->GetHost(spec); - aDomain = [NSString stringWithUTF8String:spec.get()]; + NSString *searchDomain = [NSString stringWithUTF8String:spec.get()]; if (inDest == kDestinationNewTab) - [self openNewTabWithURL:aDomain referrer:nil loadInBackground:inLoadInBG allowPopups:NO setJumpback:NO]; + [self openNewTabWithURL:searchDomain referrer:nil loadInBackground:inLoadInBG allowPopups:NO setJumpback:NO]; else if (inDest == kDestinationNewWindow) - [self openNewWindowWithURL:aDomain referrer:nil loadInBackground:inLoadInBG allowPopups:NO]; + [self openNewWindowWithURL:searchDomain referrer:nil loadInBackground:inLoadInBG allowPopups:NO]; else // if it's not a new window or a new tab, load into the current view - [self loadURL:aDomain]; + [self loadURL:searchDomain]; } } else { - aURLSpec = [[[self getBrowserWrapper] currentURI] UTF8String]; + const char *urlSpec = [[[self getBrowserWrapper] currentURI] UTF8String]; // Get the domain so that we can replace %d in our searchURL - if (NS_NewURI(getter_AddRefs(aURI), aURLSpec) == NS_OK) { + NSString *currentDomain = @""; + nsCOMPtr currentURI; + if (NS_NewURI(getter_AddRefs(currentURI), urlSpec) == NS_OK) { nsCAutoString spec; - aURI->GetHost(spec); + currentURI->GetHost(spec); - aDomain = [NSString stringWithUTF8String:spec.get()]; + currentDomain = [NSString stringWithUTF8String:spec.get()]; } // Escape the search string so the user can search for strings with @@ -2624,7 +2632,7 @@ enum BWCOpenDest { NSString *escapedSearchString = (NSString *) CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)searchString, NULL, CFSTR(";?:@&=+$,"), kCFStringEncodingUTF8); // replace the conversion specifiers (%d, %s) in the search string - [self transformFormatString:searchURL domain:aDomain search:escapedSearchString]; + [self transformFormatString:searchURL domain:currentDomain search:escapedSearchString]; [escapedSearchString release]; if (inDest == kDestinationNewTab) @@ -4672,6 +4680,31 @@ enum BWCOpenDest { return sBrokenIcon; } +- (void)setUpSearchFields +{ + NSDictionary* searchEngines = [BrowserWindowController searchURLDictionary]; + NSArray* engineNames = [[searchEngines allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; + + NSMutableArray* engineList = [NSMutableArray arrayWithCapacity:([engineNames count] - 1)]; + NSEnumerator* engineEnumerator = [engineNames objectEnumerator]; + NSString* engineName; + while ((engineName = [engineEnumerator nextObject])) { + if ([engineName isEqualToString:@"PreferredSearchEngine"]) + continue; + [engineList addObject:[NSDictionary dictionaryWithObjectsAndKeys:engineName, + kWebSearchEngineNameKey, + [searchEngines objectForKey:engineName], + kWebSearchEngineURLKey, + nil]]; + } + + [mSearchBar setSearchEngines:engineList]; + [mSearchSheetTextField setSearchEngines:engineList]; + NSString* defaultEngine = [searchEngines objectForKey:@"PreferredSearchEngine"]; + [mSearchBar setCurrentSearchEngine:defaultEngine]; + [mSearchSheetTextField setCurrentSearchEngine:defaultEngine]; +} + + (NSDictionary *)searchURLDictionary { static NSDictionary *searchURLDictionary = nil; @@ -4680,42 +4713,27 @@ enum BWCOpenDest { NSString *defaultSearchEngineList = [[NSBundle mainBundle] pathForResource:@"SearchURLList" ofType:@"plist"]; - // - // We haven't read the search engine list yet attempt to read from user's profile directory - // - nsCOMPtr aDir; - NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(aDir)); - if (aDir) { - nsCAutoString aDirPath; - nsresult rv = aDir->GetNativePath(aDirPath); - if (NS_SUCCEEDED(rv)) { - NSString *profileDir = [NSString stringWithUTF8String:aDirPath.get()]; + // We haven't read the search engine list yet; attempt to read from user's profile directory + NSString *profileDir = [[PreferenceManager sharedInstance] profilePath]; + if (profileDir) { + // If the file exists we read it from the profile directory + // If it doesn't we attempt to copy it there from our app bundle first + // (so that the user has something to edit in future) + NSString *searchEngineListPath = [profileDir stringByAppendingPathComponent:@"SearchURLList.plist"]; - // - // If the file exists we read it from the profile directory - // If it doesn't we attempt to copy it there from our app bundle first - // (so that the user has something to edit in future) - // - NSString *searchEngineListPath = [profileDir stringByAppendingPathComponent:@"SearchURLList.plist"]; - NSFileManager *fileManager = [NSFileManager defaultManager]; - if ( [fileManager isReadableFileAtPath:searchEngineListPath] || - [fileManager copyPath:defaultSearchEngineList toPath:searchEngineListPath handler:nil] ) - searchURLDictionary = [[NSDictionary alloc] initWithContentsOfFile:searchEngineListPath]; - else { -#if DEBUG - NSLog(@"Unable to copy search engine list to user profile directory"); -#endif - } - } + NSFileManager *fileManager = [NSFileManager defaultManager]; + if ([fileManager isReadableFileAtPath:searchEngineListPath] || + [fileManager copyPath:defaultSearchEngineList toPath:searchEngineListPath handler:nil]) + searchURLDictionary = [[NSDictionary alloc] initWithContentsOfFile:searchEngineListPath]; else { #if DEBUG - NSLog(@"Unable to get profile directory"); + NSLog(@"Unable to copy search engine list to user profile directory"); #endif } } else { #if DEBUG - NSLog(@"Unable to determine profile directory"); + NSLog(@"Unable to get profile directory"); #endif } @@ -4875,7 +4893,8 @@ enum BWCOpenDest { [self updateLocationFields:[mBrowserView currentURI] ignoreTyping:YES]; // see if command-return came in the search field - } else if ([mSearchBar isFirstResponder]) { + } else if ([[[self window] firstResponder] isKindOfClass:[NSView class]] && + [(NSView*)[[self window] firstResponder] isDescendantOf:mSearchBar]) { handled = YES; [self performSearch:mSearchBar inView:destination inBackground:loadInBG]; } diff --git a/mozilla/camino/src/extensions/NSMenu+Utils.h b/mozilla/camino/src/extensions/NSMenu+Utils.h index 63b11dc15b6..be7871bfc30 100644 --- a/mozilla/camino/src/extensions/NSMenu+Utils.h +++ b/mozilla/camino/src/extensions/NSMenu+Utils.h @@ -55,6 +55,9 @@ extern NSString* const NSMenuClosedNotification; // turning on the one with the given unmasked tag value. - (void)checkItemWithTag:(int)unmaskedTag inGroupWithMask:(int)tagMask; +// gets the first checked item in the menu, or nil if none are checked. +- (NSMenuItem*)firstCheckedItem; + // enable or disable all items in the menu including and after inFirstItem, // optionally recursing into submenus. - (void)setAllItemsEnabled:(BOOL)inEnable startingWithItemAtIndex:(int)inFirstItem includingSubmenus:(BOOL)includeSubmenus; diff --git a/mozilla/camino/src/extensions/NSMenu+Utils.m b/mozilla/camino/src/extensions/NSMenu+Utils.m index f00de9416e9..140206f094b 100644 --- a/mozilla/camino/src/extensions/NSMenu+Utils.m +++ b/mozilla/camino/src/extensions/NSMenu+Utils.m @@ -133,6 +133,17 @@ static OSStatus MenuEventHandler(EventHandlerCallRef inHandlerCallRef, EventRef } } +- (NSMenuItem*)firstCheckedItem +{ + NSEnumerator* itemsEnumerator = [[self itemArray] objectEnumerator]; + NSMenuItem* currentItem; + while ((currentItem = [itemsEnumerator nextObject])) { + if ([currentItem state] == NSOnState) + return currentItem; + } + return nil; +} + - (void)setAllItemsEnabled:(BOOL)inEnable startingWithItemAtIndex:(int)inFirstItem includingSubmenus:(BOOL)includeSubmenus { NSArray* menuItems = [self itemArray];