summaryrefslogtreecommitdiff
path: root/spinbox_darwin.m
blob: 58145f3efe002bf5a0a7ee4c62f0dec24e75405d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// 29 october 2014

#include "objc_darwin.h"
#include "_cgo_export.h"
#import <Cocoa/Cocoa.h>

#define togoSpinbox(x) ((goSpinbox *) (x))

@interface goSpinbox : NSObject {
@public
	void *gospinbox;
	NSTextField *textfield;
	NSNumberFormatter *formatter;
	NSStepper *stepper;

	NSInteger value;
	NSInteger minimum;
	NSInteger maximum;
}
@end

@implementation goSpinbox

- (id)init
{
	self = [super init];
	if (self == nil)
		return nil;

	self->textfield = (NSTextField *) newTextField();

	self->formatter = [NSNumberFormatter new];
	[self->formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
	[self->formatter setLocalizesFormat:NO];
	[self->formatter setUsesGroupingSeparator:NO];
	[self->formatter setHasThousandSeparators:NO];
	[self->formatter setAllowsFloats:NO];
	// TODO partial string validation?
	[self->textfield setFormatter:self->formatter];

	self->stepper = [[NSStepper alloc] initWithFrame:NSZeroRect];
	[self->stepper setIncrement:1];
	[self->stepper setAutorepeat:YES];		// hold mouse button to step repeatedly

	// TODO how SHOULD the formatter treat invald input?

	[self setMinimum:0];
	[self setMaximum:100];
	[self setValue:0];

	[self->textfield setDelegate:self];
	[self->stepper setTarget:self];
	[self->stepper setAction:@selector(stepperClicked:)];

	return self;
}

- (void)setValue:(NSInteger)value
{
	self->value = value;
	[self->textfield setIntegerValue:value];
	[self->stepper setIntegerValue:value];
}

- (void)setMinimum:(NSInteger)min
{
	self->minimum = min;
	[self->formatter setMinimum:[NSNumber numberWithInteger:min]];
	[self->stepper setMinValue:((double) min)];
}

- (void)setMaximum:(NSInteger)max
{
	self->maximum = max;
	[self->formatter setMaximum:[NSNumber numberWithInteger:max]];
	[self->stepper setMaxValue:((double) max)];
}

- (IBAction)stepperClicked:(id)sender
{
	[self setValue:[self->stepper integerValue]];
}

- (void)controlTextDidChange:(NSNotification *)note
{
	[self setValue:[self->textfield integerValue]];
}

@end

id newSpinbox(void *gospinbox)
{
	goSpinbox *s;

	s = [goSpinbox new];
	s->gospinbox = gospinbox;
	return s;
}

id spinboxTextField(id spinbox)
{
	return (id) (togoSpinbox(spinbox)->textfield);
}

id spinboxStepper(id spinbox)
{
	return (id) (togoSpinbox(spinbox)->stepper);
}