diff options
Diffstat (limited to 'prev/group_windows.go')
| -rw-r--r-- | prev/group_windows.go | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/prev/group_windows.go b/prev/group_windows.go new file mode 100644 index 0000000..18a3cc6 --- /dev/null +++ b/prev/group_windows.go @@ -0,0 +1,91 @@ +// 15 august 2014 + +package ui + +import ( + "unsafe" +) + +// #include "winapi_windows.h" +import "C" + +type group struct { + *controlSingleHWNDWithText + child Control + margined bool +} + +func newGroup(text string, control Control) Group { + hwnd := C.newControl(buttonclass, + C.BS_GROUPBOX, + C.WS_EX_CONTROLPARENT) + g := &group{ + controlSingleHWNDWithText: newControlSingleHWNDWithText(hwnd), + child: control, + } + g.fpreferredSize = g.xpreferredSize + g.fnTabStops = control.nTabStops // groupbox itself is not tabbable but the contents might be + g.SetText(text) + C.controlSetControlFont(g.hwnd) + C.setGroupSubclass(g.hwnd, unsafe.Pointer(g)) + control.setParent(&controlParent{g.hwnd}) + return g +} + +func (g *group) Text() string { + return g.text() +} + +func (g *group) SetText(text string) { + g.setText(text) +} + +func (g *group) Margined() bool { + return g.margined +} + +func (g *group) SetMargined(margined bool) { + g.margined = margined +} + +const ( + groupXMargin = 6 + groupYMarginTop = 11 // note this value /includes the groupbox label/ + groupYMarginBottom = 7 +) + +func (g *group) xpreferredSize(d *sizing) (width, height int) { + var r C.RECT + + width, height = g.child.preferredSize(d) + if width < int(g.textlen) { // if the text is longer, try not to truncate + width = int(g.textlen) + } + r.left = 0 + r.top = 0 + r.right = C.LONG(width) + r.bottom = C.LONG(height) + // use negative numbers to increase the size of the rectangle + if g.margined { + marginRectDLU(&r, -groupYMarginTop, -groupYMarginBottom, -groupXMargin, -groupXMargin, d) + } else { + // unforutnately, as mentioned above, the size of a groupbox includes the label and border + // 1 character cell (4DLU x, 8DLU y) on each side (but only 3DLU on the bottom) should be enough to make up for that; TODO is not, we can change it + // TODO make these named constants + marginRectDLU(&r, -8, -3, -4, -4, d) + } + return int(r.right - r.left), int(r.bottom - r.top) +} + +//export groupResized +func groupResized(data unsafe.Pointer, r C.RECT) { + g := (*group)(unsafe.Pointer(data)) + d := beginResize(g.hwnd) + if g.margined { + // see above + marginRectDLU(&r, groupYMarginTop, groupYMarginBottom, groupXMargin, groupXMargin, d) + } else { + marginRectDLU(&r, 8, 3, 4, 4, d) + } + g.child.resize(int(r.left), int(r.top), int(r.right - r.left), int(r.bottom - r.top), d) +} |
