2014-07-16 12:25:09 -05:00
|
|
|
// 16 july 2014
|
|
|
|
|
|
|
|
#import "objc_darwin.h"
|
|
|
|
#import "_cgo_export.h"
|
|
|
|
#import <Cocoa/Cocoa.h>
|
|
|
|
|
|
|
|
#define toNSButton(x) ((NSButton *) (x))
|
2014-07-26 08:20:33 -05:00
|
|
|
#define toNSTextField(x) ((NSTextField *) (x))
|
2014-07-16 12:25:09 -05:00
|
|
|
|
2014-07-17 11:02:39 -05:00
|
|
|
@interface goControlDelegate : NSObject {
|
|
|
|
@public
|
|
|
|
void *gocontrol;
|
|
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
|
|
@implementation goControlDelegate
|
|
|
|
|
|
|
|
- (IBAction)buttonClicked:(id)sender
|
|
|
|
{
|
|
|
|
buttonClicked(self->gocontrol);
|
|
|
|
}
|
|
|
|
|
2014-08-03 19:08:25 -05:00
|
|
|
- (IBAction)checkboxToggled:(id)sender
|
|
|
|
{
|
2014-08-04 12:44:48 -05:00
|
|
|
checkboxToggled(self->gocontrol);
|
2014-08-03 19:08:25 -05:00
|
|
|
}
|
|
|
|
|
2014-07-17 11:02:39 -05:00
|
|
|
@end
|
|
|
|
|
2014-07-22 22:32:32 -05:00
|
|
|
id newButton(void)
|
2014-07-16 12:25:09 -05:00
|
|
|
{
|
|
|
|
NSButton *b;
|
|
|
|
|
2014-08-05 21:02:57 -05:00
|
|
|
b = [[NSButton alloc] initWithFrame:NSZeroRect];
|
2014-07-26 09:05:18 -05:00
|
|
|
[b setButtonType:NSMomentaryPushInButton];
|
2014-07-16 12:25:09 -05:00
|
|
|
[b setBordered:YES];
|
|
|
|
[b setBezelStyle:NSRoundedBezelStyle];
|
2014-07-26 09:05:18 -05:00
|
|
|
setStandardControlFont((id) b);
|
2014-07-22 22:32:32 -05:00
|
|
|
return (id) b;
|
2014-07-16 12:25:09 -05:00
|
|
|
}
|
|
|
|
|
2014-07-17 11:02:39 -05:00
|
|
|
void buttonSetDelegate(id button, void *b)
|
|
|
|
{
|
|
|
|
goControlDelegate *d;
|
|
|
|
|
|
|
|
d = [goControlDelegate new];
|
|
|
|
d->gocontrol = b;
|
|
|
|
[toNSButton(button) setTarget:d];
|
|
|
|
[toNSButton(button) setAction:@selector(buttonClicked:)];
|
|
|
|
}
|
|
|
|
|
2014-07-16 12:25:09 -05:00
|
|
|
const char *buttonText(id button)
|
|
|
|
{
|
|
|
|
return [[toNSButton(button) title] UTF8String];
|
|
|
|
}
|
|
|
|
|
|
|
|
void buttonSetText(id button, char *text)
|
|
|
|
{
|
|
|
|
[toNSButton(button) setTitle:[NSString stringWithUTF8String:text]];
|
|
|
|
}
|
2014-07-22 22:32:32 -05:00
|
|
|
|
|
|
|
id newCheckbox(void)
|
|
|
|
{
|
|
|
|
NSButton *c;
|
|
|
|
|
2014-08-05 21:02:57 -05:00
|
|
|
c = [[NSButton alloc] initWithFrame:NSZeroRect];
|
2014-07-22 22:32:32 -05:00
|
|
|
[c setButtonType:NSSwitchButton];
|
|
|
|
[c setBordered:NO];
|
2014-07-26 09:05:18 -05:00
|
|
|
setStandardControlFont((id) c);
|
2014-07-22 22:32:32 -05:00
|
|
|
return (id) c;
|
|
|
|
}
|
|
|
|
|
2014-08-03 19:08:25 -05:00
|
|
|
void checkboxSetDelegate(id checkbox, void *b)
|
|
|
|
{
|
|
|
|
goControlDelegate *d;
|
|
|
|
|
|
|
|
d = [goControlDelegate new];
|
|
|
|
d->gocontrol = b;
|
|
|
|
[toNSButton(checkbox) setTarget:d];
|
|
|
|
[toNSButton(checkbox) setAction:@selector(checkboxToggled:)];
|
|
|
|
}
|
|
|
|
|
2014-07-22 22:32:32 -05:00
|
|
|
BOOL checkboxChecked(id c)
|
|
|
|
{
|
|
|
|
if ([toNSButton(c) state] == NSOnState)
|
|
|
|
return YES;
|
|
|
|
return NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
void checkboxSetChecked(id c, BOOL checked)
|
|
|
|
{
|
|
|
|
NSInteger state;
|
|
|
|
|
|
|
|
state = NSOnState;
|
|
|
|
if (checked == NO)
|
|
|
|
state = NSOffState;
|
|
|
|
[toNSButton(c) setState:state];
|
|
|
|
}
|
2014-07-26 08:20:33 -05:00
|
|
|
|
2014-08-03 19:08:25 -05:00
|
|
|
// also good for labels
|
2014-07-29 12:48:31 -05:00
|
|
|
static id finishNewTextField(NSTextField *t, BOOL bordered)
|
2014-07-26 08:20:33 -05:00
|
|
|
{
|
2014-07-29 12:48:31 -05:00
|
|
|
// same for text fields, password fields, and labels
|
2014-07-26 09:05:18 -05:00
|
|
|
setStandardControlFont((id) t);
|
2014-08-10 12:55:46 -05:00
|
|
|
// these three are the same across text fields, password fields, and labels; the only difference is the setBezeled: value, and it's only different on labels
|
2014-08-10 13:15:59 -05:00
|
|
|
// THE ORDER OF THESE CALLS IS IMPORTANT; CHANGE IT AND THE BORDERS WILL DISAPPEAR
|
|
|
|
[t setBordered:NO];
|
2014-08-10 12:55:46 -05:00
|
|
|
[t setBezelStyle:NSTextFieldSquareBezel];
|
|
|
|
[t setBezeled:bordered];
|
2014-07-26 10:18:34 -05:00
|
|
|
// smart quotes and other autocorrect features are handled by the window; see newWindow() in window_darwin.m for details
|
2014-07-26 08:20:33 -05:00
|
|
|
// Interface Builder does this to make the text box behave properly
|
|
|
|
// this disables both word wrap AND ellipsizing in one fell swoop
|
|
|
|
// however, we need to send it to the control's cell, not to the control directly
|
|
|
|
[[t cell] setLineBreakMode:NSLineBreakByClipping];
|
|
|
|
// Interface Builder also sets this to allow horizontal scrolling
|
2014-07-29 12:48:31 -05:00
|
|
|
// it also sets this for labels, despite those not being scrollable
|
2014-07-26 08:20:33 -05:00
|
|
|
[[t cell] setScrollable:YES];
|
|
|
|
return (id) t;
|
|
|
|
}
|
|
|
|
|
|
|
|
id newTextField(void)
|
|
|
|
{
|
|
|
|
NSTextField *t;
|
|
|
|
|
2014-08-05 21:02:57 -05:00
|
|
|
t = [[NSTextField alloc] initWithFrame:NSZeroRect];
|
2014-07-29 12:48:31 -05:00
|
|
|
return finishNewTextField(t, YES);
|
2014-07-26 08:20:33 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
id newPasswordField(void)
|
|
|
|
{
|
|
|
|
NSSecureTextField *t;
|
|
|
|
|
2014-08-05 21:02:57 -05:00
|
|
|
t = [[NSSecureTextField alloc] initWithFrame:NSZeroRect];
|
2014-07-29 12:48:31 -05:00
|
|
|
return finishNewTextField(toNSTextField(t), YES);
|
2014-07-26 08:20:33 -05:00
|
|
|
}
|
|
|
|
|
2014-08-03 19:08:25 -05:00
|
|
|
// also good for labels
|
2014-07-26 08:20:33 -05:00
|
|
|
const char *textFieldText(id t)
|
|
|
|
{
|
|
|
|
return [[toNSTextField(t) stringValue] UTF8String];
|
|
|
|
}
|
|
|
|
|
2014-08-03 19:08:25 -05:00
|
|
|
// also good for labels
|
2014-07-26 08:20:33 -05:00
|
|
|
void textFieldSetText(id t, char *text)
|
|
|
|
{
|
|
|
|
[toNSTextField(t) setStringValue:[NSString stringWithUTF8String:text]];
|
|
|
|
}
|
2014-07-29 12:48:31 -05:00
|
|
|
|
|
|
|
id newLabel(void)
|
|
|
|
{
|
|
|
|
NSTextField *l;
|
|
|
|
|
2014-08-05 21:02:57 -05:00
|
|
|
l = [[NSTextField alloc] initWithFrame:NSZeroRect];
|
2014-07-29 12:48:31 -05:00
|
|
|
[l setEditable:NO];
|
|
|
|
[l setSelectable:NO];
|
|
|
|
[l setDrawsBackground:NO];
|
|
|
|
return finishNewTextField(l, NO);
|
|
|
|
}
|