This is Text_MiscExtensions.m in view mode; [Download] [Up]
/* Text_MiscExtensions.m * * This category makes dealing with the Text object easier. * See the docu for details. * * For interface-info see the header file. The comments in this file mostly * cover only the real implementation details. * * Written by: Thomas Engel * Created: 30.01.1995 (Copyleft) * Last modified: 30.01.1995 */ // The following define is a fake. Looks like NeXT...but it is a cheatmode // action. // We don't have a RTFD paste type. But I really need one ! #define NXRTFDPboardType NXUniqueString("NeXT RTFD pasteboard type") #import "Text_MiscExtensions.h" #import <misckit/MiscTextExtensions.h> @implementation Text(MoreMiscExtensions) - copyTo:aPasteboard { NXAtom textTypes[5]; if( [self isMonoFont] ) { textTypes[0] = NXAsciiPboardType; textTypes[1] = NULL; } // In the other case we will cheat. The RTFD type was NEVER defined by // NeXT. But we will use it...it works. (see the define) else { textTypes[0] = NXRTFDPboardType; textTypes[1] = NXTIFFPboardType; textTypes[2] = NXRTFPboardType; textTypes[3] = NXAsciiPboardType; textTypes[4] = NULL; } [self writeSelectionToPasteboard:aPasteboard types:textTypes]; return self; } - cutTo:aPasteboard { [self copyTo:aPasteboard]; [self delete:self]; return self; } - pasteFrom:aPasteboard { NXSelPt start; NXSelPt end; if( [self hasInvalidSelection] ) [self setSelToEnd]; [self readSelectionFromPasteboard:aPasteboard]; // Now set the cursor to the last char of the current paste. [self getSel:&start :&end]; [self setSel:end.cp :end.cp]; return self; } - (BOOL)hasEmptySelection { NXSelPt start; NXSelPt end; [self getSel:&start :&end]; if( start.cp == end.cp || start.cp < 0 ) return YES; return NO; } - (BOOL)hasInvalidSelection { NXSelPt start; NXSelPt end; [self getSel:&start :&end]; if( start.cp < 0 || end.cp < 0 ) return YES; return NO; } - setSelToStart { return [self setSel:0 :0]; } - setSelToEnd { return [self setSel:[self textLength] :[self textLength]]; } - selectTrueLine:(int)line; { int start; int stop; // To be if( line < 1 ) { [self setSelToStart]; return nil; } start = [self positionFromLine:line]; stop = [self positionFromLine:line+1]; if( stop < start ) stop = [self textLength]; [self setSel: start :stop]; return self; } - findPerviousWord { return self; } - findNextWord { return self; } - (BOOL)findText:(const char *)string ignoreCase:(BOOL)ignoreCaseflag backwards:(BOOL)backwardsflag wrap:(BOOL)wrapflag font:aSharedFont { BOOL gotIt; NXSelPt fromPos; NXSelPt toPos; int firstHit; firstHit = -2; gotIt = NO; while( !gotIt ) { gotIt = [self findText:string ignoreCase:ignoreCaseflag backwards:NO wrap:NO]; // Now we should get the position of the found seleection. // we have to remember the first place where we have found something to // trace down inf-loops when we are allowed to do wraps! [self getSel:&fromPos :&toPos]; if( !gotIt || fromPos.cp == firstHit ) return NO; firstHit = fromPos.cp; // Now it seems like we have found the right string but // still this does not have to be the right font if( [self fontAtPosition:fromPos.cp] != aSharedFont ) gotIt = NO; } return YES; } - substringFromLine:(int)line { int from; int length; from = [self positionFromLine:line]; length = [self positionFromLine:line+1] - from; return [self getSubstringStringStart:from length:length]; } // Working with Text runs and their information - (NXRun *)textRunForPosition:(int)position { BOOL found; int i; int currentOffset; currentOffset = 0; found = NO; for( i=0; i<theRuns->chunk.used; i++ ) { if( currentOffset >= position ) { found = YES; break; } currentOffset += theRuns->runs[i].chars; } return &(theRuns->runs[i]); } - fontsInsideSelection { return self; } - fontAtPosition:(int)position { NXRun *aRun; aRun = [self textRunForPosition:position]; return aRun->font; } @end /* * History: 30.01.95 Buh * * * Bugs: - ... */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.