This is MiscFindPanel.m in view mode; [Download] [Up]
{\rtf0\ansi{\fonttbl\f3\fmodern Ohlfs;\f0\fmodern Courier;} \margl40 \margr40 {\colortbl;\red0\green0\blue0;} \pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\f3\b0\i0\ulnone\fs20\fc1\cf1 /*\ * Copyright (c) 1993 Christopher J. Kane. All rights reserved.\ *\ * This software is subject to the terms of the MiscKit license\ * agreement. Refer to the license document included with the\ * MiscKit distribution for these terms.\ *\ * Version: 1.1.1 (14 December 1993)\ *\ * Incorporates a bug-fix by Annard Brouwer <annard@stack.urc.tue.nl>.\ * The nextText outlet of the findTextField was remaining set to the\ * replaceTextField. When the replace controls were hidden, this\ * caused the Tab key in the findTextField to appear to do nothing.\ * The text in the field is now correctly selected when the Tab key\ * is pressed.\ *\ \f0\b * Rohit Khare: 10/29/94: rangePanel added\ * Added a line/character count panel as in Edit. This is a local hack that\ * relies on talking to a Text, not a searchableText, so I don't know how\ * generic it is. The code is almost completely borrowed from: \f3\b0 \ \f0\i Find Manager\ \ copyright: NOT! Feel free to use any of the source to Find Manager.\ \ David Holscher\ Box #727\ Rose-Hulman Institute of Technology\ Terre Haute, IN 47803 \ \ e-mail: holschdm@next-work.rose-hulman.edu\ \f3\i0 */\ \ #import "MiscFindPanel.h"\ #import "SearchableText.h"\ \ #define DURING NX_DURING\ #define HANDLER NX_HANDLER switch (NXLocalHandler.code) \{\ #define ENDHANDLER default: NXLogError("Uncaught exception: %d," \\\ " in %s:%s.\\n", NXLocalHandler.code, __FILE__, \\\ sel_getName(_cmd)); abort();\} NX_ENDHANDLER\ #define IGNORE(E) case E: NXLogError("%s exception in %s:%s. " \\\ "Ignored.\\n", #E, __FILE__, sel_getName(_cmd)); break\ \ #define LocalString(K) NXLoadLocalizedStringFromTableInBundle(NULL, \\\ [NXBundle bundleForClass:[self class]], K, "")\ \ static MiscFindPanel *_sharedFindPanel=nil;\ static Pasteboard *_findPb=nil;\ static Object *_firstConformer=nil;\ static int _pbChangeCount=0;\ static BOOL _replEnabled=YES;\ static BOOL _useFindPb=YES;\ static BOOL _allocationOK=NO;\ static BOOL _resizeOK=NO;\ static BOOL _fpLoaded=NO;\ \ @implementation MiscFindPanel\ \ - _calcFindPanelTarget\ \{\ id i;\ if (_firstConformer!=nil)\ return _firstConformer;\ if (self!=[NXApp keyWindow])\ \{\ for(i=[[NXApp keyWindow] firstResponder]; i; i = [i nextResponder])\ if ([i conformsTo:@protocol(SearchableText)])\ return i;\ i = [[NXApp keyWindow] delegate];\ if ([i conformsTo:@protocol(SearchableText)])\ return i;\ \}\ if ([NXApp keyWindow]!=[NXApp mainWindow])\ \{\ for(i=[[NXApp mainWindow] firstResponder]; i; i = [i nextResponder])\ if ([i conformsTo:@protocol(SearchableText)])\ return i;\ i = [[NXApp mainWindow] delegate];\ if ([i conformsTo:@protocol(SearchableText)])\ return i;\ \}\ i = NXApp;\ if ([i conformsTo:@protocol(SearchableText)])\ return i;\ i = [NXApp delegate];\ if ([i conformsTo:@protocol(SearchableText)])\ return i;\ return nil;\ \}\ \ - (void)_getFindPbData\ \{\ if (_pbChangeCount==[_findPb changeCount])\ return;\ DURING\ if ([_findPb findAvailableTypeFrom:&NXAsciiPboardType num:1])\ \{\ char *text;\ int len;\ if ([_findPb readType:NXAsciiPboardType data:&text length:&len])\ \{\ [findTextField setStringValue:text];\ [_findPb deallocatePasteboardData:text length:len];\ \}\ \}\ HANDLER\ IGNORE(NX_pasteboardComm);\ IGNORE(NX_appkitVMError);\ ENDHANDLER\ _pbChangeCount = [_findPb changeCount];\ \}\ \ - (void)_modifyFindPanel\ \{\ NXRect r;\ [contentView getBounds:&r];\ [self disableFlushWindow];\ if (_replEnabled)\ \{\ _resizeOK = YES;\ [super sizeWindow:NX_WIDTH(&r) :NX_HEIGHT(&r)+25.0];\ _resizeOK = NO;\ [[[findTextField superview] superview] moveBy:0.0 :25.0];\ [contentView addSubview:_replBox :NX_BELOW relativeTo:nil];\ [findTextField setNextText:replaceTextField]; /* added by Annard */\ \}\ else\ \{\ [_replBox removeFromSuperview];\ [[[findTextField superview] superview] moveBy:0.0 :-25.0];\ _resizeOK = YES;\ [super sizeWindow:NX_WIDTH(&r) :NX_HEIGHT(&r)-25.0];\ _resizeOK = NO;\ [findTextField setNextText:findTextField]; /* added by Annard */\ \}\ [self display];\ [[self reenableFlushWindow] flushWindowIfNeeded];\ \}\ \ - (void)_resetFindPanel\ \{\ [messageTextField setStringValue:""];\ [findTextField selectText:nil];\ \}\ \ - (void)_setFindPbData\ \{\ const char *text;\ if (_pbChangeCount==[_findPb changeCount])\ return;\ text = [findTextField stringValue];\ if (*text=='\\0')\ return;\ DURING\ _pbChangeCount = [_findPb declareTypes:&NXAsciiPboardType num:1 owner:NULL];\ [_findPb writeType:NXAsciiPboardType data:text length:(int)strlen(text)];\ HANDLER\ IGNORE(NX_pasteboardComm);\ ENDHANDLER\ \}\ \ + setFindPbEnabled:(BOOL)aBool\ \{\ _useFindPb = aBool;\ return self;\ \}\ \ + setFirstConformer:aConformer\ \{\ id formerConformer = _firstConformer;\ if (aConformer==nil || [aConformer conformsTo:@protocol(SearchableText)])\ _firstConformer = aConformer;\ return formerConformer;\ \}\ \ + setReplacementEnabled:(BOOL)aBool\ \{\ if (aBool!=_replEnabled)\ \{\ _replEnabled = aBool;\ [_sharedFindPanel _modifyFindPanel];\ \}\ return self;\ \}\ \ \f0\b\fs24 + sharedInstance\ \f3\b0\fs20 \{\ if (_sharedFindPanel==nil && !_fpLoaded)\ \{\ char path[MAXPATHLEN+16];\ _fpLoaded = YES;\ _findPb = [Pasteboard newName:NXFindPboard];\ _allocationOK = YES;\ if ([[NXBundle bundleForClass:self] getPath:path forResource:"FindPanel.nib" ofType:NULL]) \ \f0\b\fs24 \{\ \f3\b0\fs20 // \f0\b\fs24 NXLogError \f3\b0\fs20 ("About to loadNibFile %s", path);\ \f0\b\fs24 [NXApp loadNibFile:path owner:NXApp withNames:YES];\ _sharedFindPanel = self = NXGetNamedObject("sharedFindPanel", NXApp);\ // The above is undocumented behavior and may go haywire.\ \} \f3\b0\fs20 \ _allocationOK = NO;\ if (_sharedFindPanel==nil) \{\ // \f0\b\fs24 NXLogError \f3\b0\fs20 ("About to run alert");\ //NXRunAlertPanel(LocalString("LOAD_ERR"), LocalString("LOAD_ERR_MSG"), NULL, NULL, NULL);\ \f0\b\fs24 NXRunAlertPanel \f3\b0\fs20 ("LOAD_ERR", "LOAD_ERR_MSG", NULL, NULL, NULL);\ \} else \{\ if (!_replEnabled)\ [_sharedFindPanel _modifyFindPanel];\ \f0\b\fs24 [_sharedFindPanel setExcludedFromWindowsMenu:YES];\ [rangePanel setExcludedFromWindowsMenu:YES];\ [_sharedFindPanel useOptimizedDrawing:YES];\ \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\b0\fc0\cf0 [ \pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\b\fc1\cf1 _sharedFindPanel \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\b0\fc0\cf0 setFrameAutosaveName:"et \pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\fc0\cf0 Find \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\fc0\cf0 Panel"];\ [ \b\fc1\cf1 _sharedFindPanel \b0\fc0\cf0 \b setFrameUsingName \b0 :"etFindPanel"];\ \pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\b\fc1\cf1 \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\b0\fc0\cf0 [ \pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\b\fc1\cf1 rangePanel \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\b0\fc0\cf0 setFrameAutosaveName:"et \pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\fc0\cf0 Range \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\fc0\cf0 Panel"];\ [ \b\fc1\cf1 rangePanel \b0\fc0\cf0 \b setFrameUsingName \b0 :"etRangePanel"];\ \pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\f3\fs20\fc1\cf1 [self \f0\b\fs24 _resetFindPanel \f3\b0\fs20 ];\ \}\ \}\ return _sharedFindPanel;\ \}\ \ - enterSelection:sender\ \{\ [[self _calcFindPanelTarget] \f0\b\fs24 writeSearchableSelectionToPasteboard \f3\b0\fs20 :_findPb asType:NXAsciiPboardType];\ [self _getFindPbData];\ [self _resetFindPanel];\ return self;\ \}\ \ - findBackward:sender\ \{\ [self _resetFindPanel];\ if (*[findTextField stringValue]=='\\0' && _useFindPb)\ [self _getFindPbData];\ if (*[findTextField stringValue]=='\\0')\ [self makeKeyAndOrderFront:nil];\ else\ \{\ int pos, size, result;\ id target = [self _calcFindPanelTarget];\ if (_useFindPb)\ [self _setFindPbData];\ result = [target searchFor:[findTextField stringValue] mode:SelStartToSelEnd reverse:YES regexpr:[regExprButton state] cases:![ignoreCaseButton state] position:&pos size:&size];\ if (target==nil || result<0)\ \{\ [messageTextField setStringValue:LocalString("INVALID_OP")];\ NXBeep();\ \}\ else if (result==0)\ \{\ [messageTextField setStringValue:LocalString("NOT_FOUND")];\ NXBeep();\ \}\ else\ \{\ [target selectTextFrom:pos to:pos+size];\ [target makeSelectionVisible];\ \}\ \}\ return self;\ \}\ \ - findForward:sender\ \{\ [self _resetFindPanel];\ if (*[findTextField stringValue]=='\\0' && _useFindPb)\ [self _getFindPbData];\ if (*[findTextField stringValue]=='\\0')\ [self makeKeyAndOrderFront:nil];\ else\ \{\ int pos, size, result;\ id target = [self _calcFindPanelTarget];\ if (_useFindPb)\ [self _setFindPbData];\ result = [target searchFor:[findTextField stringValue] mode:SelEndToSelStart reverse:NO regexpr:[regExprButton state] cases:![ignoreCaseButton state] position:&pos size:&size];\ if (target==nil || result<0)\ \{\ [messageTextField setStringValue:LocalString("INVALID_OP")];\ NXBeep();\ \}\ else if (result==0)\ \{\ [messageTextField setStringValue:LocalString("NOT_FOUND")];\ NXBeep();\ \}\ else\ \{\ [target selectTextFrom:pos to:pos+size];\ [target makeSelectionVisible];\ \}\ \}\ return self;\ \}\ \ - jumpToSelection:sender\ \{\ [[self _calcFindPanelTarget] makeSelectionVisible];\ return self;\ \}\ \ - replace:sender\ \{\ [self _resetFindPanel];\ [[self _calcFindPanelTarget] replaceSelection:[replaceTextField stringValue]];\ return self;\ \}\ \ - replaceAll:sender\ \{\ id target;\ int count;\ [self _resetFindPanel];\ if (*[findTextField stringValue]=='\\0')\ return self;\ target = [self _calcFindPanelTarget];\ count = [target replaceAll:[findTextField stringValue] with:[replaceTextField stringValue] mode:([scopeMatrix selectedRow]?SelStartToSelEnd:TextEdgeToTextEdge) regexpr:[regExprButton state] cases:![ignoreCaseButton state]];\ if (count<0 || target==nil)\ \{\ [messageTextField setStringValue:LocalString("INVALID_OP")];\ NXBeep();\ \}\ else\ \{\ char buffer[256];\ sprintf(buffer, LocalString("N_REPLACED"), count);\ [messageTextField setStringValue:buffer];\ [target makeSelectionVisible];\ \}\ return self;\ \}\ \ - replaceAndFind:sender\ \{\ [[self replace:sender] findForward:sender];\ return self;\ \}\ \ \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\f0\b\fs24\fc1\cf1 - orderFrontRangePanel \b0 :sender \{\ id \b text \b0 ;\ [ \b rangePanel \b0 makeKeyAndOrderFront:self];\ \ if ((( \b text \b0 = \f3\fs20 [self \f0\b\fs24 _calcFindPanelTarget \f3\b0\fs20 ] \f0\fs24 ) == \b nil \b0 ) || \ (![ \b text \b0 \b isKindOf: \b0 [ \b Text \b0 class]]))\ return self;\ else \{ \ \b NXSelPt \b0 \b start \b0 , \b end \b0 ;\ char \b buf \b0 [20];\ \ [text \b getSel \b0 :& \b start \b0 :& \b end \b0 ];\ \ switch( \b rangeType \b0 )\ \{\ case \b line \b0 :\ sprintf(buf, " \b %d \b0 ", [text \b lineFromPosition \b0 : \b start \b0 .c1st]);\ if( \b start \b0 .c1st \b != \b0 \b end \b0 .c1st)\ \{\ sprintf((buf + strlen(buf)), " \b :%d \b0 ",\ [text lineFromPosition: \b end \b0 . \b c1st \b0 ]);\ \}\ break;\ case \b character \b0 :\ sprintf(buf, " \b %d \b0 ", \b start.cp \b0 );\ if( \b start \b0 .cp \b != \b0 \b end \b0 .cp)\ \{\ sprintf((buf + strlen(buf)), " \b :%d \b0 ", \b end.cp \b0 );\ \}\ break;\ \}\ [rangeField \b setStringValue \b0 : \b buf \b0 ];\ [rangeField \b selectText \b0 :self];\ \}\ \ return self;\ \}\ \pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\b\fc1\cf1 \ \pard\tx520\tx1060\tx1600\tx2120\tx2660\tx3200\tx3720\tx4260\tx4800\tx5320\fc1\cf1 - jumpToRange \b0 :sender \{\ id \b text \b0 ;\ [ \b rangePanel \b0 makeKeyAndOrderFront:self];\ \ if ((( \b text \b0 = \f3\fs20 [self \f0\b\fs24 _calcFindPanelTarget \f3\b0\fs20 ] \f0\fs24 ) == \b nil \b0 ) || \ (![ \b text \b0 \b isKindOf: \b0 [ \b Text \b0 class]]))\ return self;\ else \{ \ \b char \b0 \b *test \b0 ;\ int \b end \b0 ;\ const char \b *buf \b0 = [rangeField \b stringValue \b0 ];\ int \b start \b0 = \b atoi \b0 ( \b buf \b0 );\ if(( \b test \b0 = \b strchr \b0 ( \b buf \b0 , ' \b : \b0 ')) != NULL)\ \b end \b0 = \b atoi \b0 ( \b test + 1 \b0 );\ else\ \b end \b0 = \b start \b0 ;\ \ switch( \b rangeType \b0 )\ \{\ case \b line \b0 :\ \{\ [text \b setSel \b0 :[text \b positionFromLine \b0 : \b start \b0 ]\ :[text \b positionFromLine \b0 : \b end + 1 \b0 ]];\ break;\ \}\ case \b character \b0 :\ \{\ [text \b setSel \b0 : \b start \b0 : \b end \b0 ];\ break;\ \}\ \}\ \}\ [ \b rangePanel \b0 \b orderOut \b0 :self];\ [ \b text \b0 \b scrollSelToVisible \b0 ];\ \ return self;\ \} \b \ \pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\fc1\cf1 - setRangeType \b0 :sender \{\ \b rangeType \b0 = [sender \b selectedTag \b0 ];\ return [self \b orderFrontRangePanel \b0 :sender];\ \} \b \ \f3\b0\fs20 \ - (TextField *)findTextField\ \{\ return findTextField;\ \}\ \ - (Button *)ignoreCaseButton\ \{\ return ignoreCaseButton;\ \}\ \ - (TextField *)messageTextField\ \{\ return messageTextField;\ \}\ \ - (Button *)regExprButton\ \{\ return regExprButton;\ \}\ \ - (TextField *)replaceTextField\ \{\ return replaceTextField;\ \}\ \ - (Matrix *)scopeMatrix\ \{\ return scopeMatrix;\ \}\ \f0\b\fs24 \ - rangePanel \{return rangePanel;\}\ \f3\b0\fs20 \ - textDidEnd:sender endChar:(unsigned short)theChar\ \{\ if (theChar==NX_RETURN)\ [self orderOut:nil];\ return self;\ \}\ \ - (BOOL)textWillChange:sender\ \{\ return NO;\ \}\ \ - (BOOL)textWillEnd:sender\ \{\ return NO;\ \}\ \ + (BOOL)_canAlloc\ \{\ return _allocationOK;\ \}\ \ + alloc\ \{\ if (!_allocationOK)\ return [self doesNotRecognize:_cmd];\ return class_createInstanceFromZone(self, 0, NXDefaultMallocZone());\ \}\ \ + allocFromZone:(NXZone *)zone\ \{\ if (!_allocationOK)\ return [self doesNotRecognize:_cmd];\ if (zone!=NX_NOZONE)\ return class_createInstanceFromZone(self, 0, zone);\ return nil;\ \}\ \ + (BOOL)instancesRespondTo:(SEL)aSel\ \{\ if (aSel==@selector(copy) ||\ aSel==@selector(copyFromZone:) ||\ aSel==@selector(free) ||\ aSel==@selector(init) ||\ aSel==@selector(initContent:style:backing:buttonMask:defer:) ||\ aSel==@selector(initContent:style:backing:buttonMask:defer:screen:) ||\ aSel==@selector(miniaturize:) ||\ aSel==@selector(placeWindow:) ||\ aSel==@selector(placeWindow:screen:) ||\ aSel==@selector(placeWindowAndDisplay:) ||\ aSel==@selector(setDocEdited:) ||\ aSel==@selector(sizeWindow::))\ return NO;\ return [super instancesRespondTo:aSel];\ \}\ \ + new\ \{\ return [self doesNotRecognize:_cmd];\ \}\ \ + newContent:(const NXRect *)contentRect style:(int)aStyle backing:(int)bufferingType buttonMask:(int)mask defer:(BOOL)flag\ \{\ return [self doesNotRecognize:_cmd];\ \}\ \ + newContent:(const NXRect *)contentRect style:(int)aStyle backing:(int)bufferingType buttonMask:(int)mask defer:(BOOL)flag screen:(const NXScreen *)screen\ \{\ return [self doesNotRecognize:_cmd];\ \}\ \ - copyFromZone:(NXZone *)zone\ \{\ return self;\ \}\ \ - free\ \{\ return self;\ \}\ \ - init\ \{\ return [self doesNotRecognize:_cmd];\ \}\ \ - initContent:(const NXRect *)contentRect style:(int)aStyle backing:(int)bufferingType buttonMask:(int)mask defer:(BOOL)flag\ \{\ if (!_allocationOK)\ return [self doesNotRecognize:_cmd];\ \f0\b\fs24 rangeType = line;\ \f3\b0\fs20 return [super initContent:contentRect style:aStyle backing:bufferingType buttonMask:mask defer:flag];\ \}\ \ - initContent:(const NXRect *)contentRect style:(int)aStyle backing:(int)bufferingType buttonMask:(int)mask defer:(BOOL)flag screen:(const NXScreen *)screen\ \{\ return [self doesNotRecognize:_cmd];\ \}\ \ - miniaturize:sender\ \{\ return self;\ \}\ \ - orderWindow:(int)place relativeTo:(int)otherWin\ \{\ if (place!=NX_OUT)\ \{\ if (_useFindPb)\ [self _getFindPbData];\ [self _resetFindPanel];\ \}\ return [super orderWindow:place relativeTo:otherWin];\ \}\ \ - placeWindow:(const NXRect *)aRect\ \{\ if (_resizeOK)\ return [super placeWindow:aRect];\ return [self moveTo:NX_X(aRect) :NX_Y(aRect)];\ \}\ \ - placeWindow:(const NXRect *)aRect screen:(const NXScreen *)aScreen\ \{\ if (_resizeOK)\ return [super placeWindow:aRect screen:aScreen];\ return [self moveTo:NX_X(aRect) :NX_Y(aRect) screen:aScreen];\ \}\ \ - placeWindowAndDisplay:(const NXRect *)aRect\ \{\ if (_resizeOK)\ return [super placeWindowAndDisplay:aRect];\ return [[self moveTo:NX_X(aRect) :NX_Y(aRect)] display];\ \}\ \ - read:(NXTypedStream *)stream\ \{\ [super read:stream];\ findTextField = NXReadObject(stream);\ replaceTextField = NXReadObject(stream);\ messageTextField = NXReadObject(stream);\ ignoreCaseButton = NXReadObject(stream);\ regExprButton = NXReadObject(stream);\ scopeMatrix = NXReadObject(stream);\ _replBox = NXReadObject(stream);\ return self;\ \}\ \ - (BOOL)respondsTo:(SEL)aSel\ \{\ if (aSel==@selector(alloc) ||\ aSel==@selector(allocFromZone:) ||\ aSel==@selector(new) ||\ aSel==@selector(newContent:style:backing:buttonMask:defer:) ||\ aSel==@selector(newContent:style:backing:buttonMask:defer:screen:) ||\ aSel==@selector(copy) ||\ aSel==@selector(copyFromZone:) ||\ aSel==@selector(free) ||\ aSel==@selector(init) ||\ aSel==@selector(initContent:style:backing:buttonMask:defer:) ||\ aSel==@selector(initContent:style:backing:buttonMask:defer:screen:) ||\ aSel==@selector(miniaturize:) ||\ aSel==@selector(placeWindow:) ||\ aSel==@selector(placeWindow:screen:) ||\ aSel==@selector(placeWindowAndDisplay:) ||\ aSel==@selector(setDocEdited:) ||\ aSel==@selector(sizeWindow::))\ return NO;\ return [super respondsTo:aSel];\ \}\ \ - setDocEdited:(BOOL)aBool\ \{\ return self;\ \}\ \ - sizeWindow:(float)x :(float)y\ \{\ return self;\ \}\ \ - write:(NXTypedStream *)stream\ \{\ [super write:stream];\ NXWriteObjectReference(stream, findTextField);\ NXWriteObjectReference(stream, replaceTextField);\ NXWriteObjectReference(stream, messageTextField);\ NXWriteObjectReference(stream, ignoreCaseButton);\ NXWriteObjectReference(stream, regExprButton);\ NXWriteObjectReference(stream, scopeMatrix);\ NXWriteObjectReference(stream, _replBox);\ return self;\ \}\ \ @end\ }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.