implement "use selection for find" and move more of the find code into

the CHBrowserView and change it to using the firstResponder. (bug 157051)
This commit is contained in:
pinkerton%aol.net 2005-08-08 02:59:20 +00:00
parent 20e13b89b5
commit 6c4bf40715
6 changed files with 65 additions and 39 deletions

View File

@ -7,7 +7,7 @@
<key>IBEditorPositions</key>
<dict>
<key>29</key>
<string>44 952 453 44 0 0 1600 1002 </string>
<string>32 783 453 44 0 0 1280 832 </string>
<key>494</key>
<string>726 607 116 61 0 0 1600 1002 </string>
<key>670</key>

View File

@ -118,9 +118,7 @@ typedef enum EBookmarkOpenBehavior
// Edit menu actions.
-(IBAction) findInPage:(id)aSender;
-(IBAction) findAgain:(id)aSender;
-(IBAction) getInfo:(id)aSender;
-(IBAction) findPrevious:(id)aSender;
// Go menu actions.
-(IBAction) goBack:(id)aSender;

View File

@ -757,31 +757,6 @@ Otherwise, we return the URL we originally got. Right now this supports .url and
}
//
// -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
{
BrowserWindowController* browserController = [self getMainWindowBrowserController];
if (browserController)
[browserController findInPage:NO];
else
NSBeep();
}
// Called in response to "Find Previous" in edit menu.
-(IBAction) findPrevious:(id)aSender
{
BrowserWindowController* browserController = [self getMainWindowBrowserController];
if (browserController)
[browserController findInPage:YES];
else
NSBeep();
}
-(IBAction) getInfo:(id)aSender
{
BrowserWindowController* browserController = [self getMainWindowBrowserController];
@ -1292,10 +1267,6 @@ Otherwise, we return the URL we originally got. Right now this supports .url and
return NO;
}
// check if someone has previously done a find before allowing findAgain to be enabled
if (action == @selector(findAgain:) || action == @selector(findPrevious:))
return (browserController && [[browserController lastFindText] length] > 0);
// check what the state of the personal toolbar should be, but only if there is a browser
// window open. Popup windows that have the personal toolbar removed should always gray
// out this menu.

View File

@ -118,6 +118,10 @@ const char kDirServiceContractID[] = "@mozilla.org/file/directory_service;1";
- (BOOL)needsToDrawRect:(NSRect)aRect;
- (BOOL)wantsDefaultClipping;
@end
const long NSFindPanelActionNext = 2;
const long NSFindPanelActionPrevious = 3;
const long NSFindPanelActionSetFindString = 7;
#endif
@ -128,6 +132,7 @@ const char kDirServiceContractID[] = "@mozilla.org/file/directory_service;1";
- (float)getTextZoom;
- (void)incrementTextZoom:(float)increment min:(float)min max:(float)max;
- (nsIDocShell*)getDocShell;
- (NSString*)getSelection;
- (void)ensurePrintSettings;
- (void)savePrintSettings;
@ -653,6 +658,42 @@ const char kDirServiceContractID[] = "@mozilla.org/file/directory_service;1";
}
}
//
// -performFindPanelAction:
//
// Called on the first responder when the user executes one of the find commands. The
// tag is the action to perform.
//
- (IBAction)performFindPanelAction:(id)inSender
{
switch ([inSender tag]) {
case NSFindPanelActionSetFindString:
{
// set the selected text on the find pasteboard so it's usable from other apps
NSString* selectedText = [self getSelection];
NSPasteboard* pboard = [NSPasteboard pasteboardWithName:NSFindPboard];
[pboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
[pboard setString:selectedText forType:NSStringPboardType];
// set gecko's search string
nsCOMPtr<nsIWebBrowserFind> webFind = do_GetInterface(_webBrowser);
if (webFind) {
nsAutoString sel;
[selectedText assignTo_nsAString:sel];
webFind->SetSearchString(sel.get());
}
break;
}
case NSFindPanelActionNext:
[self findInPage:NO];
break;
case NSFindPanelActionPrevious:
[self findInPage:YES];
break;
}
}
- (BOOL)findInPageWithPattern:(NSString*)inText caseSensitive:(BOOL)inCaseSensitive
wrap:(BOOL)inWrap backwards:(BOOL)inBackwards
@ -1229,6 +1270,12 @@ const char kDirServiceContractID[] = "@mozilla.org/file/directory_service;1";
return [self canRedo];
else if (action == @selector(selectAll:))
return YES;
else if (action == @selector(performFindPanelAction:)) {
long tag = [aMenuItem tag];
if (tag == NSFindPanelActionNext || tag == NSFindPanelActionPrevious)
return ([[self lastFindText] length] > 0);
return YES;
}
return NO;
}
@ -1263,11 +1310,13 @@ const char kDirServiceContractID[] = "@mozilla.org/file/directory_service;1";
return [super validRequestorForSendType:sendType returnType:returnType];
}
- (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard types:(NSArray *)types
//
// -getSelection
//
// Returns the currently selected text as a NSString.
//
- (NSString*)getSelection
{
if ([types containsObject:NSStringPboardType] == NO)
return NO;
nsCOMPtr<nsICommandManager> cmdManager = do_GetInterface(_webBrowser);
if (!cmdManager) return NO;
@ -1284,12 +1333,20 @@ const char kDirServiceContractID[] = "@mozilla.org/file/directory_service;1";
nsAutoString selectedText;
params->GetStringValue("result", selectedText);
NSString* seletedText = [NSString stringWith_nsAString:selectedText];
return [NSString stringWith_nsAString:selectedText];
}
- (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard types:(NSArray *)types
{
if ([types containsObject:NSStringPboardType] == NO)
return NO;
NSString* selectedText = [self getSelection];
NSArray* typesDeclared = [NSArray arrayWithObject:NSStringPboardType];
[pboard declareTypes:typesDeclared owner:nil];
return [pboard setString:seletedText forType:NSStringPboardType];
return [pboard setString:selectedText forType:NSStringPboardType];
}
- (BOOL)readSelectionFromPasteboard:(NSPasteboard *)pboard

View File

@ -160,7 +160,7 @@
searchText = [NSString string];
if (outIsNew)
*outIsNew = mLastFindString && ![mLastFindString isEqualToString:searchText];
*outIsNew = !mLastFindString || (mLastFindString && ![mLastFindString isEqualToString:searchText]);
// remember the last pasteboard string that we saw
[mLastFindString release];