comparison mac/dw.m @ 678:0ec8edbb82cf

Basic spinbutton implementation, something isn't quite working right but I would guess it is something minor.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Tue, 01 Mar 2011 14:56:48 +0000
parents 99002595f549
children d2d7d1802af4
comparison
equal deleted inserted replaced
677:99002595f549 678:0ec8edbb82cf
62 62
63 } SignalHandler; 63 } SignalHandler;
64 64
65 SignalHandler *Root = NULL; 65 SignalHandler *Root = NULL;
66 66
67 /* Some internal prototypes */
67 static void _do_resize(Box *thisbox, int x, int y); 68 static void _do_resize(Box *thisbox, int x, int y);
69 int _remove_userdata(UserData **root, char *varname, int all);
70
68 SignalHandler *_get_handler(HWND window, int messageid) 71 SignalHandler *_get_handler(HWND window, int messageid)
69 { 72 {
70 SignalHandler *tmp = Root; 73 SignalHandler *tmp = Root;
71 74
72 /* Find any callbacks for this function */ 75 /* Find any callbacks for this function */
225 { 228 {
226 Box *box; 229 Box *box;
227 void *userdata; 230 void *userdata;
228 NSColor *bgcolor; 231 NSColor *bgcolor;
229 } 232 }
230 - (id)init; 233 -(id)init;
231 -(void) dealloc; 234 -(void)dealloc;
232 -(Box *)box; 235 -(Box *)box;
233 -(void *)userdata; 236 -(void *)userdata;
234 -(void)setUserdata:(void *)input; 237 -(void)setUserdata:(void *)input;
235 -(void)drawRect:(NSRect)rect; 238 -(void)drawRect:(NSRect)rect;
236 -(BOOL)isFlipped; 239 -(BOOL)isFlipped;
238 -(void)mouseUp:(NSEvent *)theEvent; 241 -(void)mouseUp:(NSEvent *)theEvent;
239 -(void)setColor:(unsigned long)input; 242 -(void)setColor:(unsigned long)input;
240 @end 243 @end
241 244
242 @implementation DWBox 245 @implementation DWBox
243 - (id)init 246 -(id)init
244 { 247 {
245 self = [super init]; 248 self = [super init];
246 249
247 if (self) 250 if (self)
248 { 251 {
249 box = calloc(1, sizeof(Box)); 252 box = calloc(1, sizeof(Box));
250 } 253 }
251 return self; 254 return self;
252 } 255 }
253 -(void) dealloc 256 -(void)dealloc
254 { 257 {
258 UserData *root = userdata;
255 free(box); 259 free(box);
260 _remove_userdata(&root, NULL, TRUE);
256 [super dealloc]; 261 [super dealloc];
257 } 262 }
258 -(Box *)box { return box; } 263 -(Box *)box { return box; }
259 -(void *)userdata { return userdata; } 264 -(void *)userdata { return userdata; }
260 -(void)setUserdata:(void *)input { userdata = input; } 265 -(void)setUserdata:(void *)input { userdata = input; }
344 349
345 @implementation DWButton 350 @implementation DWButton
346 -(void *)userdata { return userdata; } 351 -(void *)userdata { return userdata; }
347 -(void)setUserdata:(void *)input { userdata = input; } 352 -(void)setUserdata:(void *)input { userdata = input; }
348 -(void)buttonClicked:(id)sender { _event_handler(self, nil, 8); } 353 -(void)buttonClicked:(id)sender { _event_handler(self, nil, 8); }
354 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
349 @end 355 @end
350 356
351 /* Subclass for a progress type */ 357 /* Subclass for a progress type */
352 @interface DWPercent : NSProgressIndicator 358 @interface DWPercent : NSProgressIndicator
353 { 359 {
358 @end 364 @end
359 365
360 @implementation DWPercent 366 @implementation DWPercent
361 -(void *)userdata { return userdata; } 367 -(void *)userdata { return userdata; }
362 -(void)setUserdata:(void *)input { userdata = input; } 368 -(void)setUserdata:(void *)input { userdata = input; }
369 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
363 @end 370 @end
364 371
365 /* Subclass for a entryfield type */ 372 /* Subclass for a entryfield type */
366 @interface DWEntryField : NSTextField 373 @interface DWEntryField : NSTextField
367 { 374 {
372 @end 379 @end
373 380
374 @implementation DWEntryField 381 @implementation DWEntryField
375 -(void *)userdata { return userdata; } 382 -(void *)userdata { return userdata; }
376 -(void)setUserdata:(void *)input { userdata = input; } 383 -(void)setUserdata:(void *)input { userdata = input; }
384 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
377 @end 385 @end
378 386
379 /* Subclass for a entryfield password type */ 387 /* Subclass for a entryfield password type */
380 @interface DWEntryFieldPassword : NSSecureTextField 388 @interface DWEntryFieldPassword : NSSecureTextField
381 { 389 {
386 @end 394 @end
387 395
388 @implementation DWEntryFieldPassword 396 @implementation DWEntryFieldPassword
389 -(void *)userdata { return userdata; } 397 -(void *)userdata { return userdata; }
390 -(void)setUserdata:(void *)input { userdata = input; } 398 -(void)setUserdata:(void *)input { userdata = input; }
399 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
391 @end 400 @end
392 401
393 /* Subclass for a Notebook control type */ 402 /* Subclass for a Notebook control type */
394 @interface DWNotebook : NSTabView <NSTabViewDelegate> 403 @interface DWNotebook : NSTabView <NSTabViewDelegate>
395 { 404 {
418 Box *box = [view box]; 427 Box *box = [view box];
419 NSSize size = [view frame].size; 428 NSSize size = [view frame].size;
420 _do_resize(box, size.width, size.height); 429 _do_resize(box, size.width, size.height);
421 } 430 }
422 } 431 }
432 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
423 @end 433 @end
424 434
425 /* Subclass for a Notebook page type */ 435 /* Subclass for a Notebook page type */
426 @interface DWNotebookPage : NSTabViewItem 436 @interface DWNotebookPage : NSTabViewItem
427 { 437 {
437 @implementation DWNotebookPage 447 @implementation DWNotebookPage
438 -(void *)userdata { return userdata; } 448 -(void *)userdata { return userdata; }
439 -(void)setUserdata:(void *)input { userdata = input; } 449 -(void)setUserdata:(void *)input { userdata = input; }
440 -(int)pageid { return pageid; } 450 -(int)pageid { return pageid; }
441 -(void)setPageid:(int)input { pageid = input; } 451 -(void)setPageid:(int)input { pageid = input; }
452 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
442 @end 453 @end
443 454
444 /* Subclass for a color chooser type */ 455 /* Subclass for a color chooser type */
445 @interface DWColorChoose : NSColorPanel 456 @interface DWColorChoose : NSColorPanel
446 { 457 {
490 } 501 }
491 -(void *)userdata { return userdata; } 502 -(void *)userdata { return userdata; }
492 -(void)setUserdata:(void *)input { userdata = input; } 503 -(void)setUserdata:(void *)input { userdata = input; }
493 -(float)percent { return percent; } 504 -(float)percent { return percent; }
494 -(void)setPercent:(float)input { percent = input; } 505 -(void)setPercent:(float)input { percent = input; }
506 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
495 @end 507 @end
496 508
497 /* Subclass for a slider type */ 509 /* Subclass for a slider type */
498 @interface DWSlider : NSSlider 510 @interface DWSlider : NSSlider
499 { 511 {
504 @end 516 @end
505 517
506 @implementation DWSlider 518 @implementation DWSlider
507 -(void *)userdata { return userdata; } 519 -(void *)userdata { return userdata; }
508 -(void)setUserdata:(void *)input { userdata = input; } 520 -(void)setUserdata:(void *)input { userdata = input; }
521 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
509 @end 522 @end
510 523
511 /* Subclass for a slider type */ 524 /* Subclass for a slider type */
512 @interface DWScrollbar : NSScroller 525 @interface DWScrollbar : NSScroller
513 { 526 {
528 -(void)setUserdata:(void *)input { userdata = input; } 541 -(void)setUserdata:(void *)input { userdata = input; }
529 -(float)range { return range; } 542 -(float)range { return range; }
530 -(float)visible { return visible; } 543 -(float)visible { return visible; }
531 -(void)setRange:(float)input1 andVisible:(float)input2 { range = input1; visible = input2; } 544 -(void)setRange:(float)input1 andVisible:(float)input2 { range = input1; visible = input2; }
532 -(void)changed:(id)sender { /*NSNumber *num = [NSNumber numberWithDouble:[scroller floatValue]]; NSLog([num stringValue]);*/ } 545 -(void)changed:(id)sender { /*NSNumber *num = [NSNumber numberWithDouble:[scroller floatValue]]; NSLog([num stringValue]);*/ }
546 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
533 @end 547 @end
534 548
535 /* Subclass for a render area type */ 549 /* Subclass for a render area type */
536 @interface DWRender : NSView 550 @interface DWRender : NSView
537 { 551 {
550 -(void)setUserdata:(void *)input { userdata = input; } 564 -(void)setUserdata:(void *)input { userdata = input; }
551 -(void)drawRect:(NSRect)rect { _event_handler(self, nil, 7); } 565 -(void)drawRect:(NSRect)rect { _event_handler(self, nil, 7); }
552 -(void)mouseDown:(NSEvent *)theEvent { _event_handler(self, theEvent, 3); } 566 -(void)mouseDown:(NSEvent *)theEvent { _event_handler(self, theEvent, 3); }
553 -(void)mouseUp:(NSEvent *)theEvent { _event_handler(self, theEvent, 4); } 567 -(void)mouseUp:(NSEvent *)theEvent { _event_handler(self, theEvent, 4); }
554 -(BOOL)isFlipped { return NO; } 568 -(BOOL)isFlipped { return NO; }
569 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
555 @end 570 @end
556 571
557 /* Subclass for a MLE type */ 572 /* Subclass for a MLE type */
558 @interface DWMLE : NSTextView 573 @interface DWMLE : NSTextView
559 { 574 {
564 @end 579 @end
565 580
566 @implementation DWMLE 581 @implementation DWMLE
567 -(void *)userdata { return userdata; } 582 -(void *)userdata { return userdata; }
568 -(void)setUserdata:(void *)input { userdata = input; } 583 -(void)setUserdata:(void *)input { userdata = input; }
584 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
569 @end 585 @end
570 586
571 /* Subclass for a Container/List type */ 587 /* Subclass for a Container/List type */
572 @interface DWContainer : NSTableView <NSTableViewDataSource> 588 @interface DWContainer : NSTableView <NSTableViewDataSource>
573 { 589 {
747 NSPoint where = [self convertPoint:[event locationInWindow] fromView:nil]; 763 NSPoint where = [self convertPoint:[event locationInWindow] fromView:nil];
748 row = (int)[self rowAtPoint:where]; 764 row = (int)[self rowAtPoint:where];
749 _event_handler(self, (NSEvent *)[self getRowTitle:row], 10); 765 _event_handler(self, (NSEvent *)[self getRowTitle:row], 10);
750 return nil; 766 return nil;
751 } 767 }
768 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
752 @end 769 @end
753 770
754 /* Subclass for a Calendar type */ 771 /* Subclass for a Calendar type */
755 @interface DWCalendar : NSDatePicker 772 @interface DWCalendar : NSDatePicker
756 { 773 {
761 @end 778 @end
762 779
763 @implementation DWCalendar 780 @implementation DWCalendar
764 -(void *)userdata { return userdata; } 781 -(void *)userdata { return userdata; }
765 -(void)setUserdata:(void *)input { userdata = input; } 782 -(void)setUserdata:(void *)input { userdata = input; }
783 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
766 @end 784 @end
767 785
768 /* Subclass for a Combobox type */ 786 /* Subclass for a Combobox type */
769 @interface DWComboBox : NSComboBox 787 @interface DWComboBox : NSComboBox
770 { 788 {
775 @end 793 @end
776 794
777 @implementation DWComboBox 795 @implementation DWComboBox
778 -(void *)userdata { return userdata; } 796 -(void *)userdata { return userdata; }
779 -(void)setUserdata:(void *)input { userdata = input; } 797 -(void)setUserdata:(void *)input { userdata = input; }
798 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
799 @end
800
801 /* Subclass for a Spinbutton type */
802 @interface DWSpinButton : NSView{
803 void *userdata;
804 NSTextField *textfield;
805 NSStepper *stepper;
806 }
807 -(id)init;
808 -(void *)userdata;
809 -(void)setUserdata:(void *)input;
810 -(NSTextField *)textfield;
811 -(NSStepper *)stepper;
812 @end
813
814 @implementation DWSpinButton
815 -(id)init
816 {
817 self = [super init];
818
819 if (self)
820 {
821 textfield = [[NSTextField alloc] init];
822 [self addSubview:textfield];
823 stepper = [[NSStepper alloc] init];
824 [self addSubview:stepper];
825 [textfield takeIntValueFrom:stepper];
826 [stepper takeIntValueFrom:textfield];
827 }
828 return self;
829 }
830 -(void *)userdata { return userdata; }
831 -(void)setUserdata:(void *)input { userdata = input; }
832 -(NSTextField *)textfield { return textfield; }
833 -(NSStepper *)stepper { return stepper; }
834 -(void)dealloc { UserData *root = userdata; _remove_userdata(&root, NULL, TRUE); [super dealloc]; }
780 @end 835 @end
781 836
782 /* Subclass for a test object type */ 837 /* Subclass for a test object type */
783 @interface DWObject : NSObject {} 838 @interface DWObject : NSObject {}
784 -(void)uselessThread:(id)sender; 839 -(void)uselessThread:(id)sender;
1192 Box *box = [view box]; 1247 Box *box = [view box];
1193 NSSize size = [view frame].size; 1248 NSSize size = [view frame].size;
1194 _do_resize(box, size.width, size.height); 1249 _do_resize(box, size.width, size.height);
1195 } 1250 }
1196 } 1251 }
1252 /* Special handling for spinbutton controls */
1253 else if([handle isMemberOfClass:[DWSpinButton class]])
1254 {
1255 DWSpinButton *spinbutton = (DWSpinButton *)handle;
1256 NSTextField *textfield = [spinbutton textfield];
1257 NSStepper *stepper = [spinbutton stepper];
1258 [textfield setFrameOrigin:NSMakePoint(0,0)];
1259 [textfield setFrameSize:NSMakeSize(size.width-20,size.height)];
1260 [stepper setFrameOrigin:NSMakePoint(size.width-20,0)];
1261 [stepper setFrameSize:NSMakeSize(20,size.height)];
1262 }
1197 else if([handle isMemberOfClass:[DWRender class]]) 1263 else if([handle isMemberOfClass:[DWRender class]])
1198 { 1264 {
1199 _event_handler(handle, nil, 1); 1265 _event_handler(handle, nil, 1);
1200 } 1266 }
1201 else if([handle isMemberOfClass:[DWSplitBar class]] && size.width > 20 && size.height > 20) 1267 else if([handle isMemberOfClass:[DWSplitBar class]] && size.width > 20 && size.height > 20)
1978 * text: The text to be display by the static text widget. 2044 * text: The text to be display by the static text widget.
1979 * id: An ID to be used with dw_window_from_id() or 0L. 2045 * id: An ID to be used with dw_window_from_id() or 0L.
1980 */ 2046 */
1981 HWND API dw_spinbutton_new(char *text, ULONG id) 2047 HWND API dw_spinbutton_new(char *text, ULONG id)
1982 { 2048 {
1983 NSLog(@"dw_spinbutton_new() unimplemented\n"); 2049 DWSpinButton *spinbutton = [[DWSpinButton alloc] init];
1984 return HWND_DESKTOP; 2050 NSStepper *stepper = [spinbutton stepper];
2051 [stepper setIncrement:1];
2052 return spinbutton;
1985 } 2053 }
1986 2054
1987 /* 2055 /*
1988 * Sets the spinbutton value. 2056 * Sets the spinbutton value.
1989 * Parameters: 2057 * Parameters:
1990 * handle: Handle to the spinbutton to be set. 2058 * handle: Handle to the spinbutton to be set.
1991 * position: Current value of the spinbutton. 2059 * position: Current value of the spinbutton.
1992 */ 2060 */
1993 void API dw_spinbutton_set_pos(HWND handle, long position) 2061 void API dw_spinbutton_set_pos(HWND handle, long position)
1994 { 2062 {
1995 NSLog(@"dw_spinbutton_set_pos() unimplemented\n"); 2063 DWSpinButton *spinbutton = handle;
2064 NSStepper *stepper = [spinbutton stepper];
2065 [stepper setIntValue:(int)position];
1996 } 2066 }
1997 2067
1998 /* 2068 /*
1999 * Sets the spinbutton limits. 2069 * Sets the spinbutton limits.
2000 * Parameters: 2070 * Parameters:
2002 * upper: Upper limit. 2072 * upper: Upper limit.
2003 * lower: Lower limit. 2073 * lower: Lower limit.
2004 */ 2074 */
2005 void API dw_spinbutton_set_limits(HWND handle, long upper, long lower) 2075 void API dw_spinbutton_set_limits(HWND handle, long upper, long lower)
2006 { 2076 {
2007 NSLog(@"dw_spinbutton_set_limits() unimplemented\n"); 2077 DWSpinButton *spinbutton = handle;
2078 NSStepper *stepper = [spinbutton stepper];
2079 [stepper setMinValue:(double)lower];
2080 [stepper setMaxValue:(double)upper];
2008 } 2081 }
2009 2082
2010 /* 2083 /*
2011 * Returns the current value of the spinbutton. 2084 * Returns the current value of the spinbutton.
2012 * Parameters: 2085 * Parameters:
2013 * handle: Handle to the spinbutton to be queried. 2086 * handle: Handle to the spinbutton to be queried.
2014 */ 2087 */
2015 long API dw_spinbutton_get_pos(HWND handle) 2088 long API dw_spinbutton_get_pos(HWND handle)
2016 { 2089 {
2017 NSLog(@"dw_spinbutton_get_pos() unimplemented\n"); 2090 DWSpinButton *spinbutton = handle;
2018 return 0; 2091 NSStepper *stepper = [spinbutton stepper];
2092 return (long)[stepper integerValue];
2019 } 2093 }
2020 2094
2021 /* 2095 /*
2022 * Create a new radiobutton window (widget) to be packed. 2096 * Create a new radiobutton window (widget) to be packed.
2023 * Parameters: 2097 * Parameters: