|
|
1.1 root 1: /*
2: QueryFieldEditor.m - Copyright (c) 1992 NeXT Computer, Inc.
3:
4: You may freely copy, distribute and reuse the code in this example.
5: NeXT Computer, Inc. disclaims any warranty of any kind, expressed or implied,
6: as to its fitness for any particular use.
7: */
8:
9: #define ESCAPE 0x1B
10: #define SPACE 0x20
11:
12: #import <appkit/NXCType.h>
13: #import "QueryFieldEditor.h"
14:
15: @implementation QueryFieldEditor
16:
17: static unsigned short
18: QueryFilter(register unsigned short theChar, int flags, unsigned short charSet)
19: {
20: if (theChar == ESCAPE) return 0;
21: if (theChar == SPACE && (flags & NX_COMMANDMASK)) return 0;
22: return NXFieldFilter(theChar, flags, charSet);
23: }
24:
25: - initFrame:(NXRect *)frameRect text:(char *)theText alignment:(int)mode
26: {
27: [super initFrame:frameRect text:theText alignment:mode];
28: charFilterFunc = QueryFilter;
29: return self;
30: }
31:
32: - setCursor:(id <IXCursorPositioning>)aCursor
33: {
34: cursor = aCursor;
35: return self;
36: }
37:
38: - complete
39: {
40: char word[1024];
41: char *key;
42: unsigned keyLength;
43: int len;
44: NXSelPt start, end;
45:
46: /* Check for error conditions */
47: if (cursor == nil)
48: {
49: NXBeep();
50: return nil;
51: }
52:
53: len = [self textLength];
54: [self getSubstring:word start:0 length:len];
55: word[len] = '\0';
56: for (key = word; *key; ++key)
57: if (NXIsUpper(*key)) *key = NXToLower(*key);
58:
59: /* Probe for the word -- if it exists take the next word */
60: if ([cursor setKey:(const void *)word andLength:len])
61: [cursor setNext];
62:
63: /* Check for suffix selection */
64: [self getSel:&start :&end];
65: if ((end.cp != len) || (start.cp == 0))
66: {
67: [self setSel:len :len];
68: [self getSel:&start :&end];
69: } else
70: len = start.cp;
71:
72: /* Cycle through keys */
73: [cursor getKey:(void **)&key andLength:&keyLength];
74: if (len < keyLength && !strncmp(word, key, len))
75: {
76: [self replaceSel:key + len length:keyLength - len];
77: [self setSel:len :[self textLength]];
78: } else
79: {
80: if (len == end.cp)
81: {
82: NXBeep();
83: return self;
84: }
85:
86: [self replaceSel:""];
87: return [self complete];
88: }
89:
90: return self;
91: }
92:
93: - keyDown:(NXEvent *)theEvent
94: {
95: if (theEvent->data.key.charCode == ESCAPE
96: || (theEvent->data.key.charCode == ' ' && (theEvent->flags & NX_COMMANDMASK)))
97: return[self complete];
98:
99: return [super keyDown:theEvent];
100: }
101:
102: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.