MacInputWatcher.mm
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:6k
源码类别:

OpenGL

开发平台:

Visual C++

  1. //
  2. //  MacInputWatcher.mm
  3. //  celestia
  4. //
  5. //  Created by Da Woon Jung on 2007-06-15.
  6. //  Copyright 2007 Da Woon Jung. All rights reserved.
  7. //
  8. #import "MacInputWatcher.h"
  9. #import "CelestiaAppCore.h"
  10. #import "CelestiaController.h"
  11. #import "celestiacore.h"
  12. @interface MacInputWatcher(Private)
  13. - (id) watched;
  14. @end
  15. class _MacInputWatcher : public CelestiaWatcher
  16. {
  17. private:
  18.     MacInputWatcher *watcherWrapper;
  19.     
  20. public:
  21.     _MacInputWatcher(CelestiaAppCore *_appCore, MacInputWatcher *_watcherWrapper) :
  22.         CelestiaWatcher(*[_appCore appCore]), watcherWrapper(_watcherWrapper)
  23.     {};
  24.     
  25.     void notifyChange(CelestiaCore *, int flags)
  26.     {
  27.         if ( 0 != (flags & CelestiaCore::TextEnterModeChanged) )
  28.         {
  29.             id watched = [watcherWrapper watched];
  30.             if ([watched respondsToSelector: @selector(textEnterModeChanged)])
  31.                 [watched performSelector: @selector(textEnterModeChanged)];
  32.         }
  33.     };
  34. };
  35. @implementation MacInputWatcher
  36. - (id)initWithWatched: (id)aWatched;
  37. {
  38.     self = [super init];
  39.     if (self)
  40.     {
  41.         watcher = new _MacInputWatcher([CelestiaAppCore sharedAppCore], self);
  42.         watched = aWatched;
  43.     }
  44.     return self;
  45. }
  46. - (void)dealloc
  47. {
  48.     if (watcher) delete watcher;
  49.     [super dealloc];
  50. }
  51. - (id) watched
  52. {
  53.     return watched;
  54. }
  55. - (BOOL) control: (NSControl *)aControl textShouldBeginEditing: (NSText *)aTextObject
  56. {
  57.     BOOL hasMarkedText = NO;
  58.     if ([aTextObject respondsToSelector: @selector(hasMarkedText)])
  59.     {
  60.         SEL sel = @selector(hasMarkedText);
  61.         NSInvocation *invoc = [NSInvocation invocationWithMethodSignature:
  62.             [aTextObject methodSignatureForSelector: sel]];
  63.         if (invoc)
  64.         {
  65.             [invoc setSelector:      sel];
  66.             [invoc invokeWithTarget: aTextObject];
  67.             [invoc getReturnValue:   &hasMarkedText];
  68.         }
  69.     }
  70.     
  71.     [[aTextObject window] makeKeyAndOrderFront: nil];
  72.     if (hasMarkedText)
  73.     {
  74.         [[aTextObject window] setAlphaValue: 1.0f];
  75.     }
  76.     else
  77.     {
  78.         [[aTextObject window] setAlphaValue: 0.0f];
  79.     }
  80.     return YES;
  81. }
  82. -(void) stringEntered: (NSString *)aString
  83. {
  84.     [[CelestiaAppCore sharedAppCore] charEntered: aString];
  85. }
  86. - (void) controlTextDidChange: (NSNotification *)aNotification
  87. {
  88.     id fieldEditor = [[aNotification userInfo] objectForKey: @"NSFieldEditor"];
  89.     NSString *changedText = [fieldEditor string];
  90.     [[[aNotification object] window] setAlphaValue: 0.0f];
  91.     [self stringEntered: changedText];
  92.     if ([fieldEditor shouldChangeTextInRange: NSMakeRange(NSNotFound, 0)
  93.                            replacementString: nil])
  94.     {
  95.         [fieldEditor setString: @""];
  96.         // Make sure textShouldBeginEditing gets reinvoked
  97.         [[[aNotification object] window] makeFirstResponder: [aNotification object]];
  98.     }
  99. }
  100. - (BOOL) control: (NSControl *)aControl textView: (NSTextView *)aTextView doCommandBySelector: (SEL)aCommand
  101. {
  102.     CelestiaAppCore *appCore = [CelestiaAppCore sharedAppCore];
  103.     unichar key = 0;
  104.     int modifiers = 0;
  105.     
  106.     if (@selector(insertNewline:) == aCommand)
  107.         key = NSNewlineCharacter;
  108.     else if (@selector(deleteBackward:) == aCommand)
  109.         key = NSBackspaceCharacter;
  110.     else if (@selector(insertTab:) == aCommand)
  111.         key = NSTabCharacter;
  112.     else if (@selector(insertBacktab:) == aCommand)
  113.         key = 127;
  114.     else if (@selector(cancelOperation:) == aCommand)
  115.         key = '33';
  116.     else
  117.     {
  118.         // Allow zoom/pan etc during console input
  119.         if (@selector(scrollToBeginningOfDocument:) == aCommand)
  120.             key = CelestiaCore::Key_Home;
  121.         else if (@selector(scrollToEndOfDocument:) == aCommand)
  122.             key = CelestiaCore::Key_End;
  123.         else if (@selector(scrollPageUp:) == aCommand)
  124.             key = CelestiaCore::Key_PageUp;
  125.         else if (@selector(scrollPageDown:) == aCommand)
  126.             key = CelestiaCore::Key_PageDown;
  127.         else if (@selector(moveLeft:) == aCommand)
  128.             key = CelestiaCore::Key_Left;
  129.         else if (@selector(moveLeftAndModifySelection:) == aCommand)
  130.         {   key = CelestiaCore::Key_Left;
  131.             modifiers = [appCore toCelestiaModifiers: NSShiftKeyMask buttons: 0]; }
  132.         else if (@selector(moveRight:) == aCommand)
  133.             key = CelestiaCore::Key_Right;
  134.         else if (@selector(moveRightAndModifySelection:) == aCommand)
  135.         {   key = CelestiaCore::Key_Right;
  136.             modifiers = [appCore toCelestiaModifiers: NSShiftKeyMask buttons: 0]; }
  137.         else if (@selector(moveUp:) == aCommand)
  138.             key = CelestiaCore::Key_Up;
  139.         else if (@selector(moveUpAndModifySelection:) == aCommand)
  140.         {   key = CelestiaCore::Key_Up;
  141.             modifiers = [appCore toCelestiaModifiers: NSShiftKeyMask buttons: 0]; }
  142.         else if (@selector(moveDown:) == aCommand)
  143.             key = CelestiaCore::Key_Down;
  144.         else if (@selector(moveDownAndModifySelection:) == aCommand)
  145.         {   key = CelestiaCore::Key_Down;
  146.             modifiers = [appCore toCelestiaModifiers: NSShiftKeyMask buttons: 0]; }
  147.         else
  148.         {
  149.             NSEvent *currEvent = [[aTextView window] currentEvent];
  150.             if (currEvent && [currEvent type] == NSKeyDown)
  151.             {
  152.                 NSString *eventChars = [currEvent charactersIgnoringModifiers];
  153.                 if (eventChars && [eventChars length])
  154.                 {
  155.                     key = [eventChars characterAtIndex: 0];
  156.                     modifiers = [appCore toCelestiaModifiers: [currEvent modifierFlags] buttons: 0];
  157.                 }
  158.             }
  159.             else
  160.                 return NO;
  161.         }
  162.         [appCore keyDown: key withModifiers: modifiers];
  163.         return YES;
  164.     }
  165.     
  166.     [appCore charEntered: key withModifiers: modifiers];
  167.     return YES;
  168. }
  169. @end