Changeset 273

Show
Ignore:
Timestamp:
01/01/08 05:58:49 (1 year ago)
Author:
wolf
Message:

[NEW] JRShellView: can't type over immutable section.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/cocoa/JRShellView/JRShellView.m

    r272 r273  
    22 
    33#define PROMPT @">" 
    4 #define RETURN    0x0D 
    5 #define BACKSPACE 0x7F  // Note SHIFT + BACKSPACE gives 0x08 
    64 
    75@interface JRShellView (Private) 
     
    3533} 
    3634 
    37 /* 
    38 typedef struct { 
    39     int     key; 
    40     BOOL    ctl; 
    41     BOOL    opt; 
    42     BOOL    shift; 
    43     BOOL    cmd; 
    44 }   SynEvent; 
    45  
    46 #ifndef sizeofA 
    47 #define sizeofA(array)  (sizeof(array)/sizeof(array[0])) 
    48 #endif 
    49  
    5035- (void)keyDown:(NSEvent*)event_ { 
    51 #if 0 
    52     SynEvent events[] = { 
    53         {NSUpArrowFunctionKey,  NO,     NO,     NO,     NO}, 
    54         {NSUpArrowFunctionKey,  YES,    NO,     NO,     NO}, 
    55         {NSUpArrowFunctionKey,  NO,     YES,    NO,     NO}, 
    56         {NSUpArrowFunctionKey,  YES,    YES,    NO,     NO}, 
    57         {NSUpArrowFunctionKey,  NO,     NO,     YES,    NO}, 
    58         {NSUpArrowFunctionKey,  YES,    NO,     YES,    NO}, 
    59         {NSUpArrowFunctionKey,  NO,     YES,    YES,    NO}, 
    60         {NSUpArrowFunctionKey,  YES,    YES,    YES,    NO}, 
    61         {NSUpArrowFunctionKey,  NO,     NO,     NO,     YES}, 
    62         {NSUpArrowFunctionKey,  YES,    NO,     NO,     YES}, 
    63         {NSUpArrowFunctionKey,  NO,     YES,    NO,     YES}, 
    64         {NSUpArrowFunctionKey,  YES,    YES,    NO,     YES}, 
    65         {NSUpArrowFunctionKey,  NO,     NO,     YES,    YES}, 
    66         {NSUpArrowFunctionKey,  YES,    NO,     YES,    YES}, 
    67         {NSUpArrowFunctionKey,  NO,     YES,    YES,    YES}, 
    68         {NSUpArrowFunctionKey,  YES,    YES,    YES,    YES}, 
    69         {NSDownArrowFunctionKey,        NO,     NO,     NO,     NO}, 
    70         {NSDownArrowFunctionKey,        YES,    NO,     NO,     NO}, 
    71         {NSDownArrowFunctionKey,        NO,     YES,    NO,     NO}, 
    72         {NSDownArrowFunctionKey,        YES,    YES,    NO,     NO}, 
    73         {NSDownArrowFunctionKey,        NO,     NO,     YES,    NO}, 
    74         {NSDownArrowFunctionKey,        YES,    NO,     YES,    NO}, 
    75         {NSDownArrowFunctionKey,        NO,     YES,    YES,    NO}, 
    76         {NSDownArrowFunctionKey,        YES,    YES,    YES,    NO}, 
    77         {NSDownArrowFunctionKey,        NO,     NO,     NO,     YES}, 
    78         {NSDownArrowFunctionKey,        YES,    NO,     NO,     YES}, 
    79         {NSDownArrowFunctionKey,        NO,     YES,    NO,     YES}, 
    80         {NSDownArrowFunctionKey,        YES,    YES,    NO,     YES}, 
    81         {NSDownArrowFunctionKey,        NO,     NO,     YES,    YES}, 
    82         {NSDownArrowFunctionKey,        YES,    NO,     YES,    YES}, 
    83         {NSDownArrowFunctionKey,        NO,     YES,    YES,    YES}, 
    84         {NSDownArrowFunctionKey,        YES,    YES,    YES,    YES}, 
    85         {NSLeftArrowFunctionKey,        NO,     NO,     NO,     NO}, 
    86         {NSLeftArrowFunctionKey,        YES,    NO,     NO,     NO}, 
    87         {NSLeftArrowFunctionKey,        NO,     YES,    NO,     NO}, 
    88         {NSLeftArrowFunctionKey,        YES,    YES,    NO,     NO}, 
    89         {NSLeftArrowFunctionKey,        NO,     NO,     YES,    NO}, 
    90         {NSLeftArrowFunctionKey,        YES,    NO,     YES,    NO}, 
    91         {NSLeftArrowFunctionKey,        NO,     YES,    YES,    NO}, 
    92         {NSLeftArrowFunctionKey,        YES,    YES,    YES,    NO}, 
    93         {NSLeftArrowFunctionKey,        NO,     NO,     NO,     YES}, 
    94         {NSLeftArrowFunctionKey,        YES,    NO,     NO,     YES}, 
    95         {NSLeftArrowFunctionKey,        NO,     YES,    NO,     YES}, 
    96         {NSLeftArrowFunctionKey,        YES,    YES,    NO,     YES}, 
    97         {NSLeftArrowFunctionKey,        NO,     NO,     YES,    YES}, 
    98         {NSLeftArrowFunctionKey,        YES,    NO,     YES,    YES}, 
    99         {NSLeftArrowFunctionKey,        NO,     YES,    YES,    YES}, 
    100         {NSLeftArrowFunctionKey,        YES,    YES,    YES,    YES}, 
    101         {NSRightArrowFunctionKey,       NO,     NO,     NO,     NO}, 
    102         {NSRightArrowFunctionKey,       YES,    NO,     NO,     NO}, 
    103         {NSRightArrowFunctionKey,       NO,     YES,    NO,     NO}, 
    104         {NSRightArrowFunctionKey,       YES,    YES,    NO,     NO}, 
    105         {NSRightArrowFunctionKey,       NO,     NO,     YES,    NO}, 
    106         {NSRightArrowFunctionKey,       YES,    NO,     YES,    NO}, 
    107         {NSRightArrowFunctionKey,       NO,     YES,    YES,    NO}, 
    108         {NSRightArrowFunctionKey,       YES,    YES,    YES,    NO}, 
    109         {NSRightArrowFunctionKey,       NO,     NO,     NO,     YES}, 
    110         {NSRightArrowFunctionKey,       YES,    NO,     NO,     YES}, 
    111         {NSRightArrowFunctionKey,       NO,     YES,    NO,     YES}, 
    112         {NSRightArrowFunctionKey,       YES,    YES,    NO,     YES}, 
    113         {NSRightArrowFunctionKey,       NO,     NO,     YES,    YES}, 
    114         {NSRightArrowFunctionKey,       YES,    NO,     YES,    YES}, 
    115         {NSRightArrowFunctionKey,       NO,     YES,    YES,    YES}, 
    116         {NSRightArrowFunctionKey,       YES,    YES,    YES,    YES}, 
    117         {NSPageUpFunctionKey,   NO,     NO,     NO,     NO}, 
    118         {NSPageUpFunctionKey,   YES,    NO,     NO,     NO}, 
    119         {NSPageUpFunctionKey,   NO,     YES,    NO,     NO}, 
    120         {NSPageUpFunctionKey,   YES,    YES,    NO,     NO}, 
    121         {NSPageUpFunctionKey,   NO,     NO,     YES,    NO}, 
    122         {NSPageUpFunctionKey,   YES,    NO,     YES,    NO}, 
    123         {NSPageUpFunctionKey,   NO,     YES,    YES,    NO}, 
    124         {NSPageUpFunctionKey,   YES,    YES,    YES,    NO}, 
    125         {NSPageUpFunctionKey,   NO,     NO,     NO,     YES}, 
    126         {NSPageUpFunctionKey,   YES,    NO,     NO,     YES}, 
    127         {NSPageUpFunctionKey,   NO,     YES,    NO,     YES}, 
    128         {NSPageUpFunctionKey,   YES,    YES,    NO,     YES}, 
    129         {NSPageUpFunctionKey,   NO,     NO,     YES,    YES}, 
    130         {NSPageUpFunctionKey,   YES,    NO,     YES,    YES}, 
    131         {NSPageUpFunctionKey,   NO,     YES,    YES,    YES}, 
    132         {NSPageUpFunctionKey,   YES,    YES,    YES,    YES}, 
    133         {NSPageDownFunctionKey, NO,     NO,     NO,     NO}, 
    134         {NSPageDownFunctionKey, YES,    NO,     NO,     NO}, 
    135         {NSPageDownFunctionKey, NO,     YES,    NO,     NO}, 
    136         {NSPageDownFunctionKey, YES,    YES,    NO,     NO}, 
    137         {NSPageDownFunctionKey, NO,     NO,     YES,    NO}, 
    138         {NSPageDownFunctionKey, YES,    NO,     YES,    NO}, 
    139         {NSPageDownFunctionKey, NO,     YES,    YES,    NO}, 
    140         {NSPageDownFunctionKey, YES,    YES,    YES,    NO}, 
    141         {NSPageDownFunctionKey, NO,     NO,     NO,     YES}, 
    142         {NSPageDownFunctionKey, YES,    NO,     NO,     YES}, 
    143         {NSPageDownFunctionKey, NO,     YES,    NO,     YES}, 
    144         {NSPageDownFunctionKey, YES,    YES,    NO,     YES}, 
    145         {NSPageDownFunctionKey, NO,     NO,     YES,    YES}, 
    146         {NSPageDownFunctionKey, YES,    NO,     YES,    YES}, 
    147         {NSPageDownFunctionKey, NO,     YES,    YES,    YES}, 
    148         {NSPageDownFunctionKey, YES,    YES,    YES,    YES} 
    149     }; 
    150      
    151     unsigned    eventIndex = 0, eventCount = sizeofA(events); 
    152     for (; eventIndex < eventCount; eventIndex++) { 
    153         NSLog(@"%d", eventIndex); 
    154          
    155         SynEvent *event = &events[eventIndex]; 
    156          
    157         unichar c = event->key; 
    158         NSString *characters = [[[NSString alloc] initWithCharacters:&c length:1] autorelease]; 
    159         unsigned modifierFlags = 0L; 
    160         if (event->ctl) 
    161             modifierFlags |= NSControlKeyMask; 
    162         if (event->opt) 
    163             modifierFlags |= NSAlternateKeyMask; 
    164         if (event->shift) 
    165             modifierFlags |= NSShiftKeyMask; 
    166         if (event->cmd) 
    167             modifierFlags |= NSCommandKeyMask; 
    168          
    169         NSEvent *keyDownEvent = [NSEvent keyEventWithType:NSKeyDown 
    170                                                  location:NSZeroPoint 
    171                                             modifierFlags:modifierFlags 
    172                                                 timestamp:0 
    173                                              windowNumber:0 
    174                                                   context:[NSGraphicsContext currentContext] 
    175                                                characters:characters 
    176                               charactersIgnoringModifiers:[characters lowercaseString] 
    177                                                 isARepeat:NO 
    178                                                   keyCode:0]; 
    179         [super keyDown:keyDownEvent]; 
    180     } 
    181      
    182 #else 
    18336    if ([event_ type] != NSKeyDown || ![[event_ characters] length]) { 
    18437        [super keyDown:event_]; 
     
    18639    } 
    18740     
    188     unichar c = [[event_ characters] characterAtIndex:0]; 
    189     unsigned modifierFlags = [event_ modifierFlags]; 
     41    if ((([event_ modifierFlags] & NSFunctionKeyMask) != NSFunctionKeyMask) && [self selectedRange].location < commandStart) { 
     42        // User is typing while selection is in the immutable section of the text view. 
     43        // Cope by moving the selection to the end of the current command before letting the keyDown through. 
     44        [super setSelectedRange:NSMakeRange([[self string] length], 0)]; 
     45    } 
    19046     
    191     //  If the selection is before the command and shift key is down, then arrows extend selection (sans shift they just jump to the command's position). 
    192     if ([self selectedRange].location < start 
    193         && !(modifierFlags & NSShiftKeyMask 
    194              && (NSLeftArrowFunctionKey == c 
    195                  || NSRightArrowFunctionKey == c 
    196                  || NSUpArrowFunctionKey == c 
    197                  || NSDownArrowFunctionKey == c))) 
    198     { 
    199         if ([self selectedRange].location < start) 
    200             [self setSelectedRange:NSMakeRange(start,0)]; 
    201         [self scrollRangeToVisible:[self selectedRange]];   
    202     } 
    203      
    204     if (modifierFlags & NSControlKeyMask) { 
    205         switch (c) { 
    206             case BACKSPACE: 
    207                 [self setSelectedRange:NSMakeRange(start,[[self string] length])]; 
    208                 [self delete:self]; 
    209                 break; 
    210             default: 
    211                 [super keyDown:event_]; 
    212         } 
    213     } else { 
    214         switch (c) { 
    215             case RETURN: 
    216                 NSLog(@"executeCurrentCommand"); 
    217                 //[self executeCurrentCommand:self]; 
    218                 break; 
    219             default: 
    220                 [super keyDown:event_]; 
    221         } 
    222     } 
    223 #endif 
    224 }*/ 
     47    [super keyDown:event_]; 
     48
    22549 
    22650- (void)doCommandBySelector:(SEL)selector_ { 
     
    24367    // TODO output 
    24468    [self insertPrompt]; 
    245     commandStart = [[self string] length]; 
    24669} 
    24770 
     
    391214} 
    392215- (void)moveWordLeftAndModifySelection:(id)sender_ { // opt-shift-left 
    393         NSLog(@"TODO moveWordLeftAndModifySelection:"); 
    394        [super moveWordLeftAndModifySelection:sender_]; 
     216    if ([self selectedRange].location > commandStart) 
     217        [super moveWordLeftAndModifySelection:sender_]; 
    395218} 
    396219- (void)changeBaseWritingDirectionToRTL:(id)sender_ { // cmd-ctl-left, cmd-ctl-shift-left 
     
    517340    [[self textStorage] appendAttributedString:styledPrompt]; 
    518341    [[self textStorage] appendAttributedString:plainSpaceAfterPrompt]; 
     342    commandStart = [[self string] length]; 
    519343} 
    520344 
     
    523347    [super setString:@""]; 
    524348    [self insertPrompt]; 
    525     commandStart = [[self string] length]; 
    526349    [self setDelegate:self]; 
    527350    currentCommandHistoryIndex = NSNotFound;