summaryrefslogtreecommitdiff
path: root/control_darwin.m
diff options
context:
space:
mode:
Diffstat (limited to 'control_darwin.m')
-rw-r--r--control_darwin.m98
1 files changed, 98 insertions, 0 deletions
diff --git a/control_darwin.m b/control_darwin.m
new file mode 100644
index 0000000..816085b
--- /dev/null
+++ b/control_darwin.m
@@ -0,0 +1,98 @@
+// 30 july 2014
+
+#import "objc_darwin.h"
+#import <Cocoa/Cocoa.h>
+
+#define toNSView(x) ((NSView *) (x))
+#define toNSControl(x) ((NSControl *) (x))
+
+void parent(id control, id parentid)
+{
+ [toNSView(parentid) addSubview:toNSView(control)];
+}
+
+void controlSetHidden(id control, BOOL hidden)
+{
+ [toNSView(control) setHidden:hidden];
+}
+
+// also fine for NSCells
+void setStandardControlFont(id control)
+{
+ [toNSControl(control) setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSRegularControlSize]]];
+}
+
+// also fine for NSCells
+void setSmallControlFont(id control)
+{
+ [toNSControl(control) setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
+}
+
+// also good for NSBox and NSProgressIndicator
+struct xsize controlPreferredSize(id control)
+{
+ NSControl *c;
+ NSRect r;
+ struct xsize s;
+
+ c = toNSControl(control);
+ [c sizeToFit];
+ r = [c frame];
+ s.width = (intptr_t) r.size.width;
+ s.height = (intptr_t) r.size.height;
+ return s;
+}
+
+id newScrollView(id content, BOOL bordered)
+{
+ NSScrollView *sv;
+
+ sv = [[NSScrollView alloc] initWithFrame:NSZeroRect];
+ [sv setDocumentView:toNSView(content)];
+ [sv setHasHorizontalScroller:YES];
+ [sv setHasVerticalScroller:YES];
+ [sv setAutohidesScrollers:YES];
+ if (bordered)
+ [sv setBorderType:NSBezelBorder];
+ else
+ [sv setBorderType:NSNoBorder];
+ return (id) sv;
+}
+
+// these function are safe to call on Areas; they'll just return the frame and a baseline of 0 since they use the default NSView implementations
+
+static struct xalignment doAlignmentInfo(NSView *v, NSRect r)
+{
+ struct xalignment a;
+
+ r = [v alignmentRectForFrame:r];
+ a.rect.x = (intptr_t) r.origin.x;
+ a.rect.y = (intptr_t) r.origin.y;
+ a.rect.width = (intptr_t) r.size.width;
+ a.rect.height = (intptr_t) r.size.height;
+ // I'm not sure if we need to set the frame for -[NSView baselineOffsetFromBottom], but let's do it just to be safe
+ [v setFrame:r];
+ a.baseline = (intptr_t) [v baselineOffsetFromBottom];
+ return a;
+}
+
+struct xalignment alignmentInfo(id c, struct xrect newrect)
+{
+ NSView *v;
+ NSRect r;
+
+ v = toNSView(c);
+ r = NSMakeRect((CGFloat) newrect.x,
+ (CGFloat) newrect.y,
+ (CGFloat) newrect.width,
+ (CGFloat) newrect.height);
+ return doAlignmentInfo(v, r);
+}
+
+struct xalignment alignmentInfoFrame(id c)
+{
+ NSView *v;
+
+ v = toNSView(c);
+ return doAlignmentInfo(v, [v frame]);
+}