diff options
Diffstat (limited to 'prev/basicctrls_darwin.m')
| -rw-r--r-- | prev/basicctrls_darwin.m | 314 |
1 files changed, 314 insertions, 0 deletions
diff --git a/prev/basicctrls_darwin.m b/prev/basicctrls_darwin.m new file mode 100644 index 0000000..b91862e --- /dev/null +++ b/prev/basicctrls_darwin.m @@ -0,0 +1,314 @@ +// 16 july 2014 + +#import "objc_darwin.h" +#import "_cgo_export.h" +#import <Cocoa/Cocoa.h> + +#define toNSButton(x) ((NSButton *) (x)) +#define toNSTextField(x) ((NSTextField *) (x)) +#define toNSView(x) ((NSView *) (x)) +#define toNSWindow(x) ((NSWindow *) (x)) +#define toNSBox(x) ((NSBox *) (x)) +#define toNSTextView(x) ((NSTextView *) (x)) +#define toNSProgressIndicator(x) ((NSProgressIndicator *) (x)) + +@interface goControlDelegate : NSObject <NSTextFieldDelegate> { +@public + void *gocontrol; +} +@end + +@implementation goControlDelegate + +- (IBAction)buttonClicked:(id)sender +{ + buttonClicked(self->gocontrol); +} + +- (IBAction)checkboxToggled:(id)sender +{ + checkboxToggled(self->gocontrol); +} + +- (void)controlTextDidChange:(NSNotification *)note +{ + textfieldChanged(self->gocontrol); +} + +@end + +id newButton(void) +{ + NSButton *b; + + b = [[NSButton alloc] initWithFrame:NSZeroRect]; + [b setButtonType:NSMomentaryPushInButton]; + [b setBordered:YES]; + [b setBezelStyle:NSRoundedBezelStyle]; + setStandardControlFont((id) b); + return (id) b; +} + +void buttonSetDelegate(id button, void *b) +{ + goControlDelegate *d; + + d = [goControlDelegate new]; + d->gocontrol = b; + [toNSButton(button) setTarget:d]; + [toNSButton(button) setAction:@selector(buttonClicked:)]; +} + +const char *buttonText(id button) +{ + return [[toNSButton(button) title] UTF8String]; +} + +void buttonSetText(id button, char *text) +{ + [toNSButton(button) setTitle:[NSString stringWithUTF8String:text]]; +} + +id newCheckbox(void) +{ + NSButton *c; + + c = [[NSButton alloc] initWithFrame:NSZeroRect]; + [c setButtonType:NSSwitchButton]; + [c setBordered:NO]; + setStandardControlFont((id) c); + return (id) c; +} + +void checkboxSetDelegate(id checkbox, void *b) +{ + goControlDelegate *d; + + d = [goControlDelegate new]; + d->gocontrol = b; + [toNSButton(checkbox) setTarget:d]; + [toNSButton(checkbox) setAction:@selector(checkboxToggled:)]; +} + +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]; +} + +// also good for labels +// not static because area_darwin.m uses it +id finishNewTextField(id _t, BOOL bordered) +{ + NSTextField *t = toNSTextField(_t); + + // same for text fields, password fields, and labels + setStandardControlFont((id) t); + // 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 + // THE ORDER OF THESE CALLS IS IMPORTANT; CHANGE IT AND THE BORDERS WILL DISAPPEAR + [t setBordered:NO]; + [t setBezelStyle:NSTextFieldSquareBezel]; + [t setBezeled:bordered]; + // smart quotes and other autocorrect features are handled by the window; see newWindow() in window_darwin.m for details + // 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 + // it also sets this for labels, despite those not being scrollable + [[t cell] setScrollable:YES]; + return (id) t; +} + +id newTextField(void) +{ + NSTextField *t; + + t = [[NSTextField alloc] initWithFrame:NSZeroRect]; + [t setSelectable:YES]; // otherwise the setting is masked by the editable default of YES + return finishNewTextField((id) t, YES); +} + +id newPasswordField(void) +{ + NSSecureTextField *t; + + t = [[NSSecureTextField alloc] initWithFrame:NSZeroRect]; + [t setSelectable:YES]; // otherwise the setting is masked by the editable default of YES + return finishNewTextField((id) t, YES); +} + +void textfieldSetDelegate(id textfield, void *t) +{ + goControlDelegate *d; + + d = [goControlDelegate new]; + d->gocontrol = t; + [toNSTextField(textfield) setDelegate:d]; +} + +// also good for labels +const char *textfieldText(id t) +{ + return [[toNSTextField(t) stringValue] UTF8String]; +} + +// also good for labels +void textfieldSetText(id t, char *text) +{ + [toNSTextField(t) setStringValue:[NSString stringWithUTF8String:text]]; +} + +id textfieldOpenInvalidPopover(id textfield, char *reason) +{ + id popover; + + popover = newWarningPopover(reason); + warningPopoverShow(popover, textfield); + NSBeep(); + return (id) popover; +} + +void textfieldCloseInvalidPopover(id popover) +{ + [toNSWindow(popover) close]; + // don't release; close does that already +} + +BOOL textfieldEditable(id textfield) +{ + return [toNSTextField(textfield) isEditable]; +} + +void textfieldSetEditable(id textfield, BOOL editable) +{ + [toNSTextField(textfield) setEditable:editable]; +} + +id newLabel(void) +{ + NSTextField *l; + + l = [[NSTextField alloc] initWithFrame:NSZeroRect]; + [l setEditable:NO]; + [l setSelectable:NO]; + [l setDrawsBackground:NO]; + return finishNewTextField((id) l, NO); +} + +id newGroup(id container) +{ + NSBox *group; + + group = [[NSBox alloc] initWithFrame:NSZeroRect]; + [group setBorderType:NSLineBorder]; + [group setBoxType:NSBoxPrimary]; + [group setTransparent:NO]; + // can't use setSmallControlFont() here because the selector is different + [group setTitleFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]]; + [group setTitlePosition:NSAtTop]; + [group setContentView:toNSView(container)]; + return (id) group; +} + +const char *groupText(id group) +{ + return [[toNSBox(group) title] UTF8String]; +} + +void groupSetText(id group, char *text) +{ + [toNSBox(group) setTitle:[NSString stringWithUTF8String:text]]; +} + +id newTextbox(void) +{ + NSTextView *tv; + + tv = [[NSTextView alloc] initWithFrame:NSZeroRect]; + // verified against Interface Builder, except for rich text options + [tv setAllowsDocumentBackgroundColorChange:NO]; + [tv setBackgroundColor:[NSColor textBackgroundColor]]; + [tv setTextColor:[NSColor textColor]]; + [tv setAllowsUndo:YES]; + [tv setEditable:YES]; + [tv setSelectable:YES]; + [tv setRichText:NO]; + [tv setImportsGraphics:NO]; + [tv setBaseWritingDirection:NSWritingDirectionNatural]; + // TODO default paragraph format + [tv setAllowsImageEditing:NO]; + [tv setAutomaticQuoteSubstitutionEnabled:NO]; + [tv setAutomaticLinkDetectionEnabled:NO]; + [tv setUsesRuler:NO]; + [tv setRulerVisible:NO]; + [tv setUsesInspectorBar:NO]; + [tv setSelectionGranularity:NSSelectByCharacter]; +//TODO [tv setInsertionPointColor:[NSColor insertionColor]]; + [tv setContinuousSpellCheckingEnabled:NO]; + [tv setGrammarCheckingEnabled:NO]; + [tv setUsesFontPanel:NO]; + [tv setEnabledTextCheckingTypes:0]; + [tv setAutomaticDashSubstitutionEnabled:NO]; + [tv setAutomaticSpellingCorrectionEnabled:NO]; + [tv setAutomaticTextReplacementEnabled:NO]; + [tv setSmartInsertDeleteEnabled:NO]; + [tv setLayoutOrientation:NSTextLayoutOrientationHorizontal]; + // TODO default find panel behavior + // now just to be safe; this will do some of the above but whatever + disableAutocorrect((id) tv); + // this option is complex; just set it to the Interface Builder default + [[tv layoutManager] setAllowsNonContiguousLayout:YES]; + // this will work because it's the same selector + setStandardControlFont((id) tv); + return (id) tv; +} + +char *textboxText(id tv) +{ + return [[toNSTextView(tv) string] UTF8String]; +} + +void textboxSetText(id tv, char *text) +{ + [toNSTextView(tv) setString:[NSString stringWithUTF8String:text]]; +} + +id newProgressBar(void) +{ + NSProgressIndicator *pi; + + pi = [[NSProgressIndicator alloc] initWithFrame:NSZeroRect]; + [pi setStyle:NSProgressIndicatorBarStyle]; + [pi setControlSize:NSRegularControlSize]; + [pi setControlTint:NSDefaultControlTint]; + [pi setBezeled:YES]; + [pi setDisplayedWhenStopped:YES]; + [pi setUsesThreadedAnimation:YES]; + [pi setIndeterminate:NO]; + [pi setMinValue:0]; + [pi setMaxValue:100]; + [pi setDoubleValue:0]; + return (id) pi; +} + +intmax_t progressbarPercent(id pbar) +{ + return (intmax_t) [toNSProgressIndicator(pbar) doubleValue]; +} + +void progressbarSetPercent(id pbar, intmax_t percent) +{ + [toNSProgressIndicator(pbar) setDoubleValue:((double) percent)]; +} |
