ftp.nice.ch/pub/next/developer/resources/classes/misckit/MiscKit.1.10.0.s.gnutar.gz#/MiscKit/Source/MiscKit/MiscSearcher.m

This is MiscSearcher.m in view mode; [Download] [Up]

//
//	Hugh Ashton - hugh@furuike.twics.com - Feb 95
// Copyright under the terms and conditions of the MiscKit
//				Version 1.1.  All rights reserved.
//
//		This notice may not be removed from this source code.
//
//	This object is included in the MiscKit by permission from the author
//	and its use is governed by the MiscKit license, found in the file
//	"LICENSE.rtf" in the MiscKit distribution.  Please refer to that file
//	for a list of all applicable permissions and restrictions.
//
// This object allows a search to take place in more than one Text object
// simultaneously.  It also allows searching without having to press the 
// Return key after each search string.
//
// It is inited with the initWithField:anObject andTarget:anotherObject
// method, where anObject is Text (not a TextField) and anotherObject is
// a List of Text objects.
//
// Added dynamic sizing to the original[Start|End] arrays, minor tweaks
//		-- Don Yacktman 4/13/95
//


#import <misckit/MiscSearcher.h>

@implementation MiscSearcher

- initWithField:anObject andList:anotherObject
{
	int i;
	[super init];
	
	theSearcher=anObject;
	[theSearcher setDelegate:self];
	theList=anotherObject;
	if (![theList isKindOfClassNamed:"List"] ||
			![theSearcher isKindOfClassNamed:"Text"]) {
		[self free];
		return nil;
	}
	areWeSearching=NO;
	if (originalStart) free(originalStart);
	if (originalEnd) free(originalEnd);
	originalStart = (int *)malloc(sizeof(int) * [theList count]);
	originalEnd = (int *)malloc(sizeof(int) * [theList count]);
	for (i=0;i<=[theList count];i++) {
		originalStart[i]=0;
		originalEnd[i]=0;
	}
	return self;
}

// delegate methods for theSearcher

- textDidGetKeys:sender isEmpty:(BOOL)flag
{
	int i;
	NXSelPt start,end;
	char theString[MAXPATHLEN-1]="";
	areWeSearching=YES;
	
	for(i=0;i<=[theList count];i++)
	{
		theTarget=[theList objectAt:i];
		if(flag)
		{
			[theTarget setSel:originalStart[i] :originalEnd[i]];
			[theTarget setSelGray:NX_BLACK];
			[theSearcher setSel:[theSearcher byteLength] :[theSearcher byteLength]];
			areWeSearching=NO;
			return self;
		}
		[theSearcher getSubstring:theString start:0 length:[theSearcher byteLength]];
		if([theTarget findText:theString ignoreCase:NO backwards:NO wrap:YES])
		{
			[theTarget getSel:&start :&end];
			[theTarget setSel:originalStart[i] :originalEnd[i]];
			[theTarget setSelGray:NX_BLACK];
			[theTarget setSel:start.cp :end.cp];
			[theTarget setSelGray:NX_DKGRAY];
			originalStart[i]=start.cp;
			originalEnd[i]=end.cp;
			[theTarget setSel:originalStart[i] :originalEnd[i]];
		}
		[theSearcher setSel:[theSearcher byteLength] :[theSearcher byteLength]];
	}
	areWeSearching=NO;
	return self;
}


- forward:sender
{
	int i;
	NXSelPt start,end;
	char theString[MAXPATHLEN-1]="";
	areWeSearching=YES;

	[theSearcher getSubstring:theString start:0 length:[theSearcher byteLength]];
	for(i=0;i<=[theList count];i++)
	{
		theTarget=[theList objectAt:i];
		if((strlen(theString))==0)
		{
			[theTarget setSel:originalStart[i] :originalEnd[i]];
			[theTarget setSelGray:NX_BLACK];
			[theSearcher setSel:[theSearcher byteLength] :[theSearcher byteLength]];
			areWeSearching=NO;
			return self;
		}
		[theTarget setSel:originalEnd[i] :originalEnd[i]];
		if([theTarget findText:theString ignoreCase:NO backwards:NO wrap:YES])
		{
			[theTarget getSel:&start :&end];
			[theTarget setSel:originalStart[i] :originalEnd[i]];
			[theTarget setSelGray:NX_BLACK];
			[theTarget setSel:start.cp :end.cp];
			[theTarget setSelGray:NX_DKGRAY];
			originalStart[i]=start.cp;
			originalEnd[i]=end.cp;
			[theTarget setSel:end.cp :end.cp];
		}
		[theSearcher setSel:[theSearcher byteLength] :[theSearcher byteLength]];
	}
	areWeSearching=NO;
	return self;
}

- textDidEnd:sender endChar:(unsigned short)theChar
{
	int i;
	if(!areWeSearching)
	{
		[theSearcher setDelegate:nil];
// this stops us being interrupted while we clean up the target
		for(i=0;i<=[theList count];i++)
		{
			theTarget=[theList objectAt:i];
			[theTarget setSel:originalStart[i] :originalEnd[i]];
			[theTarget setSelGray:NX_BLACK];
			[theTarget setSel:originalStart[i]:originalEnd[i]];
		}
//	go back to being a good delegate
		[theSearcher setDelegate:self];
//		NXRunAlertPanel("We've set the SEL",NULL,"OK",NULL,NULL);
		areWeSearching=YES;
	}
	return self;
}

- setTheField:anObject
{
	theSearcher=anObject;
	if(![theSearcher isKindOfClassNamed:"Text"]) 
	{
		return nil;
	}
	[theSearcher setDelegate:self];
	areWeSearching=NO;
	return self;
}

- setTheList:anObject
{
	int i;
	
	if(![theList isKindOfClassNamed:"List"]) 
	{
		return nil;
	}
	theList=anObject;
	if (originalStart) free(originalStart);
	if (originalEnd) free(originalEnd);
	originalStart = (int *)malloc(sizeof(int) * [theList count]);
	originalEnd = (int *)malloc(sizeof(int) * [theList count]);
	for(i=0;i<=[theList count];i++)
	{
		originalStart[i]=0;
		originalEnd[i]=0;
	}
	areWeSearching=NO;
	return self;
}

// wrapper methods

- theList
{
	return theList;
}

- theField
{
	return theSearcher;
}

@end

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.