diff --git a/redo/container_darwin.go b/redo/container_darwin.go new file mode 100644 index 0000000..fd28b4c --- /dev/null +++ b/redo/container_darwin.go @@ -0,0 +1,31 @@ +// 4 august 2014 + +package ui + +import ( + "unsafe" +) + +// #include "objc_darwin.h" +import "C" + +type container struct { + view C.id + *sizer +} + +func newContainer(child Control) *container { + c := &container{ + sizer: new(sizer), + } + c.view = C.newContainerView(unsafe.Pointer(c)) + c.child = child + c.child.setParent(&controlParent{c.view}) + return c +} + +//export containerResized +func containerResized(data unsafe.Pointer, width C.intptr_t, height C.intptr_t) { + c := (*container)(unsafe.Pointer(data)) + c.resize(0, 0, int(width), int(height)) +} diff --git a/redo/container_darwin.m b/redo/container_darwin.m new file mode 100644 index 0000000..17ada72 --- /dev/null +++ b/redo/container_darwin.m @@ -0,0 +1,33 @@ +// 4 august 2014 + +#include "objc_darwin.h" +#include "_cgo_export.h" +#include + +// calling -[className] on the content views of NSWindow, NSTabItem, and NSBox all return NSView, so I'm assuming I just need to override these +// fortunately, in the case of NSTabView, this -[setFrame:] is called when resizing and when changing tabs, so we can indeed use this directly there +@interface goContainerView : NSView { +@public + void *gocontainer; +} +@end + +@implementation goContainerView + +- (void)setFrame:(NSRect)r +{ + [super setFrame:r]; + if (self->gocontainer != NULL) + containerResized(self->gocontainer, (intptr_t) r.size.width, (intptr_t) r.size.height); +} + +@end + +id newContainerView(void *gocontainer) +{ + goContainerView *c; + + c = [[goContainerView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)]; + c->gocontainer = gocontainer; + return (id) c; +} diff --git a/redo/objc_darwin.h b/redo/objc_darwin.h index 84d1a84..b739f39 100644 --- a/redo/objc_darwin.h +++ b/redo/objc_darwin.h @@ -55,7 +55,7 @@ extern void moveControl(id, intptr_t, intptr_t, intptr_t, intptr_t); /* tab_darwin.m */ extern id newTab(void *); -extern id tabAppend(id, char *); +extern void tabAppend(id, char *, id); /* table_darwin.m */ extern id newTable(void); @@ -87,4 +87,7 @@ extern struct xsize areaPrefSize(id); extern struct xalignment alignmentInfo(id, struct xrect); extern struct xrect frame(id); +/* container_darwin.m */ +extern id newContainerView(void *); + #endif diff --git a/redo/tab_darwin.go b/redo/tab_darwin.go index 503c138..3a9b338 100644 --- a/redo/tab_darwin.go +++ b/redo/tab_darwin.go @@ -11,7 +11,7 @@ import "C" type tab struct { _id C.id - tabs []*sizer + tabs []*container } func newTab() Tab { @@ -21,22 +21,20 @@ func newTab() Tab { } func (t *tab) Append(name string, control Control) { - s := new(sizer) - t.tabs = append(t.tabs, s) + c := newContainer(control) + t.tabs = append(t.tabs, c) cname := C.CString(name) defer C.free(unsafe.Pointer(cname)) - tabview := C.tabAppend(t._id, cname) - s.child = control - s.child.setParent(&controlParent{tabview}) + C.tabAppend(t._id, cname, c.view) } //export tabResized func tabResized(data unsafe.Pointer, width C.intptr_t, height C.intptr_t) { - t := (*tab)(unsafe.Pointer(data)) - for _, s := range t.tabs { +// t := (*tab)(unsafe.Pointer(data)) +// for _, c := range t.tabs { // the tab area's coordinate system is localized, so the origin is (0, 0) - s.resize(0, 0, int(width), int(height)) - } +// c.resize(0, 0, int(width), int(height)) +// } } func (t *tab) id() C.id { diff --git a/redo/tab_darwin.m b/redo/tab_darwin.m index c99e275..7697e26 100644 --- a/redo/tab_darwin.m +++ b/redo/tab_darwin.m @@ -5,6 +5,7 @@ #import #define toNSTabView(x) ((NSTabView *) (x)) +#define toNSView(x) ((NSView *) (x)) @interface goTabView : NSTabView { @public @@ -35,12 +36,12 @@ id newTab(void *gotab) return (id) t; } -id tabAppend(id t, char *name) +void tabAppend(id t, char *name, id view) { NSTabViewItem *i; i = [[NSTabViewItem alloc] initWithIdentifier:nil]; [i setLabel:[NSString stringWithUTF8String:name]]; + [i setView:toNSView(view)]; [toNSTabView(t) addTabViewItem:i]; - return (id) [i view]; }