|
|
1.1 ! root 1: // FindPanel.m ! 2: // ! 3: // Subclass of Object which implements find panel functionality. ! 4: // Works on Text objects automatically; pretty easily can be ! 5: // made to work on any text container which responds to a given protocol. ! 6: // ! 7: // You may freely copy, distribute, and reuse the code in this example. ! 8: // NeXT disclaims any warranty of any kind, expressed or implied, as to its ! 9: // fitness for any particular use. ! 10: ! 11: #import <appkit/appkit.h> ! 12: #import <libc.h> ! 13: #import <strings.h> ! 14: ! 15: #import "FindPanel.h" ! 16: ! 17: @implementation FindPanel ! 18: ! 19: // Allocate and initialize the object. If we already created an instance, return that one... ! 20: ! 21: ! 22: + sharedInstance ! 23: { ! 24: static id sharedFindObject = nil; ! 25: NXZone *zone = NXApp ? [NXApp zone] : NXDefaultMallocZone(); ! 26: ! 27: if (sharedFindObject) { ! 28: return sharedFindObject; ! 29: } ! 30: ! 31: self = [[super allocFromZone:zone] init]; ! 32: if (![NXApp loadNibSection:"FindPanel.nib" owner:self withNames:NO fromZone:zone]) { ! 33: NXLogError ("Can't find FindPanel.nib!"); ! 34: [self free]; ! 35: return nil; ! 36: } else { ! 37: sharedFindObject = self; ! 38: [[findText window] setFrameAutosaveName:"Find"]; ! 39: return self; ! 40: } ! 41: } ! 42: ! 43: + new ! 44: { ! 45: return [self sharedInstance]; ! 46: } ! 47: ! 48: // Because find panel is shared, only one instance is created, and it should be created ! 49: // with new rather than alloc/init. ! 50: ! 51: - allocFromZone:(NXZone *)zone ! 52: { ! 53: return [self notImplemented:_cmd]; ! 54: } ! 55: ! 56: - free ! 57: { ! 58: return self; ! 59: } ! 60: ! 61: - (const char *)findString ! 62: { ! 63: return [findText stringValue]; ! 64: } ! 65: ! 66: - (void)setFindString:(const char *)string ! 67: { ! 68: [findText setStringValue:string]; ! 69: [findText selectText:nil]; ! 70: } ! 71: ! 72: - (void)findIn:(Text *)textObject direction:(FindDirection)dir ! 73: { ! 74: if (!textObject || ! 75: ![textObject findText:[self findString] ! 76: ignoreCase:[ignoreCaseButton state] ! 77: backwards:(dir == FindBackward) ! 78: wrap:YES]) { ! 79: NXBeep (); ! 80: return; ! 81: } ! 82: } ! 83: ! 84: - firstResponderText ! 85: { ! 86: id obj = [[NXApp mainWindow] firstResponder]; ! 87: return (obj && [obj isKindOf:[Text class]]) ? obj : nil; ! 88: } ! 89: ! 90: - (void)findDirection:(FindDirection)dir ! 91: { ! 92: [self findIn:[self firstResponderText] direction:dir]; ! 93: } ! 94: ! 95: - findNextReturn:sender ! 96: { ! 97: [findNextButton performClick:sender]; ! 98: [self orderOut:sender]; ! 99: return self; ! 100: } ! 101: ! 102: - makeKeyAndOrderFront:sender ! 103: { ! 104: id retval = [[findText window] makeKeyAndOrderFront:sender]; ! 105: [findText selectText:nil]; ! 106: return retval; ! 107: } ! 108: ! 109: - orderOut:sender ! 110: { ! 111: return [[findText window] orderOut:sender]; ! 112: } ! 113: ! 114: // Called to find the next occurrence of the search string. ! 115: ! 116: - findNext:sender ! 117: { ! 118: [self findDirection:FindForward]; ! 119: return self; ! 120: } ! 121: ! 122: // Called to find the previous occurrence of the search string. ! 123: ! 124: - findPrevious:sender ! 125: { ! 126: [self findDirection:FindBackward]; ! 127: return self; ! 128: } ! 129: ! 130: // In case the selection is shorter than this amount, we use a local buffer ! 131: // (on the stack) rather than bothering with allocating it. ! 132: ! 133: #define LOCALBUFFERLEN 100 ! 134: ! 135: - enterSelection:sender ! 136: { ! 137: id obj = [self firstResponderText]; ! 138: ! 139: if (!obj) { ! 140: NXBeep(); ! 141: } else { ! 142: char localBuffer[LOCALBUFFERLEN+1], *str; ! 143: NXSelPt from, to; ! 144: int bufLen; ! 145: ! 146: [obj getSel:&from :&to]; ! 147: bufLen = to.cp - from.cp; ! 148: str = (bufLen <= LOCALBUFFERLEN) ? localBuffer : NXZoneMalloc(NXDefaultMallocZone(), bufLen+1); ! 149: ! 150: [obj getSubstring:str start:from.cp length:bufLen]; ! 151: str[bufLen] = '\0'; ! 152: [self setFindString:str]; ! 153: if (str != localBuffer) free(str); ! 154: } ! 155: ! 156: return self; ! 157: } ! 158: ! 159: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.