changeset 1806:eecf0eb609d8

Added keyboard handling for (check/radio/spin)buttons, containers, trees, lists on Mac.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Fri, 05 Oct 2012 20:17:14 +0000
parents 2bcdc3cfffa7
children d7447c814f8b
files mac/dw.m
diffstat 1 files changed, 52 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mac/dw.m	Sat Sep 29 00:21:21 2012 +0000
+++ b/mac/dw.m	Fri Oct 05 20:17:14 2012 +0000
@@ -1024,6 +1024,23 @@
 -(NSButtonType)buttonType { return buttonType; }
 -(void)setParent:(DWBox *)input { parent = input; }
 -(DWBox *)parent { return parent; }
+-(void)keyDown:(NSEvent *)theEvent
+{
+    unichar vk = [[theEvent charactersIgnoringModifiers] characterAtIndex:0];
+    if(vk == VK_RETURN || vk == VK_SPACE)
+    {
+        if(buttonType == NSSwitchButton)
+            [self setState:([self state] ? NSOffState : NSOnState)];
+        [self buttonClicked:self];
+    }
+    else
+    {
+        [self interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
+        [super keyDown:theEvent];
+    }
+}
+-(void)insertTab:(id)sender { if([[self window] firstResponder] == self) [[self window] selectNextKeyView:self]; }
+-(void)insertBacktab:(id)sender { if([[self window] firstResponder] == self) [[self window] selectPreviousKeyView:self]; }
 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); dw_signal_disconnect_by_window(self); [super dealloc]; }
 @end
 
@@ -2079,6 +2096,14 @@
     _event_handler(self, (NSEvent *)[self getRowTitle:row], 10);
     return nil;
 }
+-(void)keyDown:(NSEvent *)theEvent
+{
+    if([[theEvent charactersIgnoringModifiers] characterAtIndex:0] == VK_TAB)
+        [self interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
+    [super keyDown:theEvent];
+}
+-(void)insertTab:(id)sender { if([[self window] firstResponder] == self) [[self window] selectNextKeyView:self]; }
+-(void)insertBacktab:(id)sender { if([[self window] firstResponder] == self) [[self window] selectPreviousKeyView:self]; }
 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); dw_signal_disconnect_by_window(self); [super dealloc]; }
 @end
 
@@ -2314,6 +2339,14 @@
     [cell setTextColor:fgcolor];
 }
 -(void)clear { NSMutableArray *toclear = data; data = nil; _free_tree_recurse(toclear, NULL); [self reloadData]; }
+-(void)keyDown:(NSEvent *)theEvent
+{
+    if([[theEvent charactersIgnoringModifiers] characterAtIndex:0] == VK_TAB)
+        [self interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
+    [super keyDown:theEvent];
+}
+-(void)insertTab:(id)sender { if([[self window] firstResponder] == self) [[self window] selectNextKeyView:self]; }
+-(void)insertBacktab:(id)sender { if([[self window] firstResponder] == self) [[self window] selectPreviousKeyView:self]; }
 -(void)dealloc
 {
     UserData *root = userdata;
@@ -2404,6 +2437,25 @@
     [textfield takeIntValueFrom:self];
     _event_handler(parent, (void *)[self integerValue], 14);
 }
+-(void)keyDown:(NSEvent *)theEvent
+{
+    unichar vk = [[theEvent charactersIgnoringModifiers] characterAtIndex:0];
+    if(vk == VK_UP || vk == VK_DOWN)
+    {
+        if(vk == VK_UP)
+            [self setIntegerValue:([self integerValue]+[self increment])];
+        else
+            [self setIntegerValue:([self integerValue]-[self increment])];
+        [self mouseUp:theEvent];
+    }
+    else
+    {
+        [self interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
+        [super keyDown:theEvent];
+    }
+}
+-(void)insertTab:(id)sender { if([[self window] firstResponder] == self) [[self window] selectNextKeyView:self]; }
+-(void)insertBacktab:(id)sender { if([[self window] firstResponder] == self) [[self window] selectPreviousKeyView:self]; }
 @end
 
 /* Subclass for a Spinbutton type */