Mercurial > dwindows
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: |