ftp.nice.ch/pub/next/text/apps/eText5.0.93.s.tar.gz#/eText5/Kludges.subproj/MiscFindPanel.m

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.