celestia/macosx/MacInputWatcher.mm

186 lines
5.7 KiB
Plaintext

//
// MacInputWatcher.mm
// celestia
//
// Created by Da Woon Jung on 2007-06-15.
// Copyright 2007 Da Woon Jung. All rights reserved.
//
#import "MacInputWatcher.h"
#import "CelestiaAppCore.h"
#import "CelestiaController.h"
#import "celestiacore.h"
@interface MacInputWatcher(Private)
- (id) watched;
@end
class _MacInputWatcher : public CelestiaWatcher
{
private:
MacInputWatcher *watcherWrapper;
public:
_MacInputWatcher(CelestiaAppCore *_appCore, MacInputWatcher *_watcherWrapper) :
CelestiaWatcher(*[_appCore appCore]), watcherWrapper(_watcherWrapper)
{};
void notifyChange(CelestiaCore *, int flags)
{
if ( 0 != (flags & CelestiaCore::TextEnterModeChanged) )
{
id watched = [watcherWrapper watched];
if ([watched respondsToSelector: @selector(textEnterModeChanged)])
[watched performSelector: @selector(textEnterModeChanged)];
}
};
};
@implementation MacInputWatcher
- (id)initWithWatched: (id)aWatched;
{
self = [super init];
if (self)
{
watcher = new _MacInputWatcher([CelestiaAppCore sharedAppCore], self);
watched = aWatched;
}
return self;
}
- (void)dealloc
{
if (watcher) delete watcher;
[super dealloc];
}
- (id) watched
{
return watched;
}
- (BOOL) control: (NSControl *)aControl textShouldBeginEditing: (NSText *)aTextObject
{
BOOL hasMarkedText = NO;
if ([aTextObject respondsToSelector: @selector(hasMarkedText)])
{
SEL sel = @selector(hasMarkedText);
NSInvocation *invoc = [NSInvocation invocationWithMethodSignature:
[aTextObject methodSignatureForSelector: sel]];
if (invoc)
{
[invoc setSelector: sel];
[invoc invokeWithTarget: aTextObject];
[invoc getReturnValue: &hasMarkedText];
}
}
[[aTextObject window] makeKeyAndOrderFront: nil];
if (hasMarkedText)
{
[[aTextObject window] setAlphaValue: 1.0f];
}
else
{
[[aTextObject window] setAlphaValue: 0.0f];
}
return YES;
}
-(void) stringEntered: (NSString *)aString
{
[[CelestiaAppCore sharedAppCore] charEntered: aString];
}
- (void) controlTextDidChange: (NSNotification *)aNotification
{
id fieldEditor = [[aNotification userInfo] objectForKey: @"NSFieldEditor"];
NSString *changedText = [fieldEditor string];
[[[aNotification object] window] setAlphaValue: 0.0f];
[self stringEntered: changedText];
if ([fieldEditor shouldChangeTextInRange: NSMakeRange(NSNotFound, 0)
replacementString: nil])
{
[fieldEditor setString: @""];
// Make sure textShouldBeginEditing gets reinvoked
[[[aNotification object] window] makeFirstResponder: [aNotification object]];
}
}
- (BOOL) control: (NSControl *)aControl textView: (NSTextView *)aTextView doCommandBySelector: (SEL)aCommand
{
CelestiaAppCore *appCore = [CelestiaAppCore sharedAppCore];
unichar key = 0;
int modifiers = 0;
if (@selector(insertNewline:) == aCommand)
key = NSNewlineCharacter;
else if (@selector(deleteBackward:) == aCommand)
key = NSBackspaceCharacter;
else if (@selector(insertTab:) == aCommand)
key = NSTabCharacter;
else if (@selector(insertBacktab:) == aCommand)
key = 127;
else if (@selector(cancelOperation:) == aCommand)
key = '\033';
else
{
// Allow zoom/pan etc during console input
if (@selector(scrollToBeginningOfDocument:) == aCommand)
key = CelestiaCore::Key_Home;
else if (@selector(scrollToEndOfDocument:) == aCommand)
key = CelestiaCore::Key_End;
else if (@selector(scrollPageUp:) == aCommand)
key = CelestiaCore::Key_PageUp;
else if (@selector(scrollPageDown:) == aCommand)
key = CelestiaCore::Key_PageDown;
else if (@selector(moveLeft:) == aCommand)
key = CelestiaCore::Key_Left;
else if (@selector(moveLeftAndModifySelection:) == aCommand)
{ key = CelestiaCore::Key_Left;
modifiers = [appCore toCelestiaModifiers: NSShiftKeyMask buttons: 0]; }
else if (@selector(moveRight:) == aCommand)
key = CelestiaCore::Key_Right;
else if (@selector(moveRightAndModifySelection:) == aCommand)
{ key = CelestiaCore::Key_Right;
modifiers = [appCore toCelestiaModifiers: NSShiftKeyMask buttons: 0]; }
else if (@selector(moveUp:) == aCommand)
key = CelestiaCore::Key_Up;
else if (@selector(moveUpAndModifySelection:) == aCommand)
{ key = CelestiaCore::Key_Up;
modifiers = [appCore toCelestiaModifiers: NSShiftKeyMask buttons: 0]; }
else if (@selector(moveDown:) == aCommand)
key = CelestiaCore::Key_Down;
else if (@selector(moveDownAndModifySelection:) == aCommand)
{ key = CelestiaCore::Key_Down;
modifiers = [appCore toCelestiaModifiers: NSShiftKeyMask buttons: 0]; }
else
{
NSEvent *currEvent = [[aTextView window] currentEvent];
if (currEvent && [currEvent type] == NSKeyDown)
{
NSString *eventChars = [currEvent charactersIgnoringModifiers];
if (eventChars && [eventChars length])
{
key = [eventChars characterAtIndex: 0];
modifiers = [appCore toCelestiaModifiers: [currEvent modifierFlags] buttons: 0];
}
}
else
return NO;
}
[appCore keyDown: key withModifiers: modifiers];
return YES;
}
[appCore charEntered: key withModifiers: modifiers];
return YES;
}
@end