# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1298991408 0 # Node ID 0ec8edbb82cf7cc7e48bf5aa4cc5e95ed17e942a # Parent 99002595f549d1e2f6f541f46acfa12268bda368 Basic spinbutton implementation, something isn't quite working right but I would guess it is something minor. diff -r 99002595f549 -r 0ec8edbb82cf mac/dw.m --- a/mac/dw.m Tue Mar 01 13:32:40 2011 +0000 +++ b/mac/dw.m Tue Mar 01 14:56:48 2011 +0000 @@ -64,7 +64,10 @@ SignalHandler *Root = NULL; +/* Some internal prototypes */ static void _do_resize(Box *thisbox, int x, int y); +int _remove_userdata(UserData **root, char *varname, int all); + SignalHandler *_get_handler(HWND window, int messageid) { SignalHandler *tmp = Root; @@ -227,8 +230,8 @@ void *userdata; NSColor *bgcolor; } -- (id)init; --(void) dealloc; +-(id)init; +-(void)dealloc; -(Box *)box; -(void *)userdata; -(void)setUserdata:(void *)input; @@ -240,7 +243,7 @@ @end @implementation DWBox -- (id)init +-(id)init { self = [super init]; @@ -250,9 +253,11 @@ } return self; } --(void) dealloc -{ +-(void)dealloc +{ + UserData *root = userdata; free(box); + _remove_userdata(&root, NULL, TRUE); [super dealloc]; } -(Box *)box { return box; } @@ -346,6 +351,7 @@ -(void *)userdata { return userdata; } -(void)setUserdata:(void *)input { userdata = input; } -(void)buttonClicked:(id)sender { _event_handler(self, nil, 8); } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end /* Subclass for a progress type */ @@ -360,6 +366,7 @@ @implementation DWPercent -(void *)userdata { return userdata; } -(void)setUserdata:(void *)input { userdata = input; } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end /* Subclass for a entryfield type */ @@ -374,6 +381,7 @@ @implementation DWEntryField -(void *)userdata { return userdata; } -(void)setUserdata:(void *)input { userdata = input; } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end /* Subclass for a entryfield password type */ @@ -388,6 +396,7 @@ @implementation DWEntryFieldPassword -(void *)userdata { return userdata; } -(void)setUserdata:(void *)input { userdata = input; } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end /* Subclass for a Notebook control type */ @@ -420,6 +429,7 @@ _do_resize(box, size.width, size.height); } } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end /* Subclass for a Notebook page type */ @@ -439,6 +449,7 @@ -(void)setUserdata:(void *)input { userdata = input; } -(int)pageid { return pageid; } -(void)setPageid:(int)input { pageid = input; } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end /* Subclass for a color chooser type */ @@ -492,6 +503,7 @@ -(void)setUserdata:(void *)input { userdata = input; } -(float)percent { return percent; } -(void)setPercent:(float)input { percent = input; } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end /* Subclass for a slider type */ @@ -506,6 +518,7 @@ @implementation DWSlider -(void *)userdata { return userdata; } -(void)setUserdata:(void *)input { userdata = input; } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end /* Subclass for a slider type */ @@ -530,6 +543,7 @@ -(float)visible { return visible; } -(void)setRange:(float)input1 andVisible:(float)input2 { range = input1; visible = input2; } -(void)changed:(id)sender { /*NSNumber *num = [NSNumber numberWithDouble:[scroller floatValue]]; NSLog([num stringValue]);*/ } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end /* Subclass for a render area type */ @@ -552,6 +566,7 @@ -(void)mouseDown:(NSEvent *)theEvent { _event_handler(self, theEvent, 3); } -(void)mouseUp:(NSEvent *)theEvent { _event_handler(self, theEvent, 4); } -(BOOL)isFlipped { return NO; } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end /* Subclass for a MLE type */ @@ -566,6 +581,7 @@ @implementation DWMLE -(void *)userdata { return userdata; } -(void)setUserdata:(void *)input { userdata = input; } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end /* Subclass for a Container/List type */ @@ -749,6 +765,7 @@ _event_handler(self, (NSEvent *)[self getRowTitle:row], 10); return nil; } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end /* Subclass for a Calendar type */ @@ -763,6 +780,7 @@ @implementation DWCalendar -(void *)userdata { return userdata; } -(void)setUserdata:(void *)input { userdata = input; } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end /* Subclass for a Combobox type */ @@ -777,6 +795,43 @@ @implementation DWComboBox -(void *)userdata { return userdata; } -(void)setUserdata:(void *)input { userdata = input; } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } +@end + +/* Subclass for a Spinbutton type */ +@interface DWSpinButton : NSView{ + void *userdata; + NSTextField *textfield; + NSStepper *stepper; +} +-(id)init; +-(void *)userdata; +-(void)setUserdata:(void *)input; +-(NSTextField *)textfield; +-(NSStepper *)stepper; +@end + +@implementation DWSpinButton +-(id)init +{ + self = [super init]; + + if (self) + { + textfield = [[NSTextField alloc] init]; + [self addSubview:textfield]; + stepper = [[NSStepper alloc] init]; + [self addSubview:stepper]; + [textfield takeIntValueFrom:stepper]; + [stepper takeIntValueFrom:textfield]; + } + return self; +} +-(void *)userdata { return userdata; } +-(void)setUserdata:(void *)input { userdata = input; } +-(NSTextField *)textfield { return textfield; } +-(NSStepper *)stepper { return stepper; } +-(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; } @end /* Subclass for a test object type */ @@ -1194,6 +1249,17 @@ _do_resize(box, size.width, size.height); } } + /* Special handling for spinbutton controls */ + else if([handle isMemberOfClass:[DWSpinButton class]]) + { + DWSpinButton *spinbutton = (DWSpinButton *)handle; + NSTextField *textfield = [spinbutton textfield]; + NSStepper *stepper = [spinbutton stepper]; + [textfield setFrameOrigin:NSMakePoint(0,0)]; + [textfield setFrameSize:NSMakeSize(size.width-20,size.height)]; + [stepper setFrameOrigin:NSMakePoint(size.width-20,0)]; + [stepper setFrameSize:NSMakeSize(20,size.height)]; + } else if([handle isMemberOfClass:[DWRender class]]) { _event_handler(handle, nil, 1); @@ -1980,8 +2046,10 @@ */ HWND API dw_spinbutton_new(char *text, ULONG id) { - NSLog(@"dw_spinbutton_new() unimplemented\n"); - return HWND_DESKTOP; + DWSpinButton *spinbutton = [[DWSpinButton alloc] init]; + NSStepper *stepper = [spinbutton stepper]; + [stepper setIncrement:1]; + return spinbutton; } /* @@ -1992,7 +2060,9 @@ */ void API dw_spinbutton_set_pos(HWND handle, long position) { - NSLog(@"dw_spinbutton_set_pos() unimplemented\n"); + DWSpinButton *spinbutton = handle; + NSStepper *stepper = [spinbutton stepper]; + [stepper setIntValue:(int)position]; } /* @@ -2004,7 +2074,10 @@ */ void API dw_spinbutton_set_limits(HWND handle, long upper, long lower) { - NSLog(@"dw_spinbutton_set_limits() unimplemented\n"); + DWSpinButton *spinbutton = handle; + NSStepper *stepper = [spinbutton stepper]; + [stepper setMinValue:(double)lower]; + [stepper setMaxValue:(double)upper]; } /* @@ -2014,8 +2087,9 @@ */ long API dw_spinbutton_get_pos(HWND handle) { - NSLog(@"dw_spinbutton_get_pos() unimplemented\n"); - return 0; + DWSpinButton *spinbutton = handle; + NSStepper *stepper = [spinbutton stepper]; + return (long)[stepper integerValue]; } /*