File: GBCheatTextFieldCell.m

package info (click to toggle)
sameboy 1.0.2%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 10,632 kB
  • sloc: ansic: 29,954; objc: 22,249; asm: 1,424; pascal: 1,373; makefile: 1,064; xml: 111
file content (123 lines) | stat: -rw-r--r-- 4,620 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#import "GBCheatTextFieldCell.h"

@interface GBCheatTextView : NSTextView
@property bool usesAddressFormat;
@end

@implementation GBCheatTextView

- (bool)_internalInsertText:(NSString *)string replacementRange:(NSRange)range
{
    if (range.location == NSNotFound) {
        range = self.selectedRange;
    }
    
    NSString *new = [self.string stringByReplacingCharactersInRange:range withString:string];
    if (!self.usesAddressFormat) {
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^(\\$[0-9A-Fa-f]{1,2}|[0-9]{1,3})$" options:0 error:NULL];
        if ([regex numberOfMatchesInString:new options:0 range:NSMakeRange(0, new.length)]) {
            [super insertText:string replacementRange:range];
            return true;
        }
        if ([regex numberOfMatchesInString:[@"$" stringByAppendingString:new] options:0 range:NSMakeRange(0, new.length + 1)]) {
            [super insertText:string replacementRange:range];
            [super insertText:@"$" replacementRange:NSMakeRange(0, 0)];
            return true;
        }
        if ([new isEqualToString:@"$"] || [string length] == 0) {
            self.string = @"$00";
            self.selectedRange = NSMakeRange(1, 2);
            return true;
        }
    }
    else {
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^(\\$[0-9A-Fa-f]{1,3}:)?\\$[0-9a-fA-F]{1,4}$" options:0 error:NULL];
        if ([regex numberOfMatchesInString:new options:0 range:NSMakeRange(0, new.length)]) {
            [super insertText:string replacementRange:range];
            return true;
        }
        if ([string length] == 0) {
            NSUInteger index = [new rangeOfString:@":"].location;
            if (index != NSNotFound) {
                if (range.location > index) {
                    self.string = [[new componentsSeparatedByString:@":"] firstObject];
                    self.selectedRange = NSMakeRange(self.string.length, 0);
                    return true;
                }
                self.string = [[new componentsSeparatedByString:@":"] lastObject];
                self.selectedRange = NSMakeRange(0, 0);
                return true;
            }
            else if ([[self.string substringWithRange:range] isEqualToString:@":"]) {
                self.string = [[self.string componentsSeparatedByString:@":"] lastObject];
                self.selectedRange = NSMakeRange(0, 0);
                return true;
            }
        }
        if ([new isEqualToString:@"$"] || [string length] == 0) {
            self.string = @"$0000";
            self.selectedRange = NSMakeRange(1, 4);
            return true;
        }
        if (([string isEqualToString:@"$"] || [string isEqualToString:@":"]) && range.length == 0 && range.location == 0) {
            if ([self _internalInsertText:@"$00:" replacementRange:range]) {
                self.selectedRange = NSMakeRange(1, 2);
                return true;
            }
        }
        if ([string isEqualToString:@":"] && range.length + range.location == self.string.length) {
            if ([self _internalInsertText:@":$0" replacementRange:range]) {
                self.selectedRange = NSMakeRange(self.string.length - 2, 2);
                return true;
            }
        }
        if ([string isEqualToString:@"$"]) {
            if ([self _internalInsertText:@"$0" replacementRange:range]) {
                self.selectedRange = NSMakeRange(range.location + 1, 1);
                return true;
            }
        }
    }
    return false;
}

- (NSUndoManager *)undoManager
{
    return nil;
}

- (void)insertText:(id)string replacementRange:(NSRange)replacementRange
{
    if (![self _internalInsertText:string replacementRange:replacementRange]) {
        if (![self _internalInsertText:[@"$" stringByAppendingString:string] replacementRange:replacementRange]) {
            NSBeep();
        }
    }
}

/* Private API, don't tell the police! */
- (void)_userReplaceRange:(NSRange)range withString:(NSString *)string
{
    [self insertText:string replacementRange:range];
}

@end

@implementation GBCheatTextFieldCell
{
    bool _drawing, _editing;
    GBCheatTextView *_fieldEditor;
}

- (NSTextView *)fieldEditorForView:(NSView *)controlView
{
    if (_fieldEditor) {
        _fieldEditor.usesAddressFormat = self.usesAddressFormat;
        return _fieldEditor;
    }
    _fieldEditor = [[GBCheatTextView alloc] initWithFrame:controlView.frame];
    _fieldEditor.fieldEditor = true;
    _fieldEditor.usesAddressFormat = self.usesAddressFormat;
    return _fieldEditor;
}
@end