func (tb *ToolBar) applyDefaultButtonWidth() error { if tb.defaultButtonWidth == 0 { return nil } lParam := uintptr( win.MAKELONG(uint16(tb.defaultButtonWidth), uint16(tb.defaultButtonWidth))) if 0 == tb.SendMessage(win.TB_SETBUTTONWIDTH, 0, lParam) { return newError("SendMessage(TB_SETBUTTONWIDTH)") } size := uint32(tb.SendMessage(win.TB_GETBUTTONSIZE, 0, 0)) height := win.HIWORD(size) lParam = uintptr(win.MAKELONG(uint16(tb.defaultButtonWidth), height)) if win.FALSE == tb.SendMessage(win.TB_SETBUTTONSIZE, 0, lParam) { return newError("SendMessage(TB_SETBUTTONSIZE)") } return nil }
func (cb *ComboBox) SetTextSelection(start, end int) { cb.SendMessage(win.CB_SETEDITSEL, 0, uintptr(win.MAKELONG(uint16(start), uint16(end)))) }
func (nle *numberLineEdit) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { switch msg { case win.WM_CHAR: if AltDown() { return 0 } if ControlDown() { if wParam == 1 { // Ctrl+A return 0 } break } char := uint16(wParam) text := nle.textUTF16() text = text[len(nle.prefix) : len(text)-len(nle.suffix)] start, end := nle.TextSelection() start -= len(nle.prefix) end -= len(nle.prefix) if Key(wParam) == KeyBack { nle.processChar(text, start, end, KeyBack, 0) return 0 } switch char { case uint16('0'), uint16('1'), uint16('2'), uint16('3'), uint16('4'), uint16('5'), uint16('6'), uint16('7'), uint16('8'), uint16('9'): if start == end && nle.decimals > 0 { if i := uint16IndexUint16(text, decimalSepUint16); i > -1 && i < len(text)-nle.decimals && start > i { return 0 } } nle.processChar(text, start, end, 0, char) return 0 case uint16('-'): if nle.minValue != nle.maxValue && nle.minValue >= 0 { return 0 } if start > 0 || uint16ContainsUint16(text, uint16('-')) && end == 0 { return 0 } nle.processChar(text, start, end, 0, char) return 0 case decimalSepUint16: if nle.decimals == 0 { return 0 } if start == 0 && end == 0 && len(text) > 0 && text[0] == '-' { return 0 } if end < len(text)-nle.decimals { return 0 } if i := uint16IndexUint16(text, decimalSepUint16); i > -1 && i <= start || i > end { return 0 } nle.processChar(text, start, end, 0, char) return 0 default: return 0 } case win.WM_KEYDOWN: switch Key(wParam) { case KeyA: if ControlDown() { nle.selectNumber() return 0 } case KeyDelete: text := nle.textUTF16() text = text[len(nle.prefix) : len(text)-len(nle.suffix)] start, end := nle.TextSelection() start -= len(nle.prefix) end -= len(nle.prefix) nle.processChar(text, start, end, KeyDelete, 0) return 0 case KeyDown: nle.incrementValue(-nle.increment) return 0 case KeyEnd: start, end := nle.TextSelection() end = len(nle.textUTF16()) - len(nle.suffix) if !ShiftDown() { start = end } nle.SetTextSelection(start, end) return 0 case KeyHome: start, end := nle.TextSelection() start = len(nle.prefix) if !ShiftDown() { end = start } nle.SetTextSelection(start, end) return 0 case KeyLeft: var pos win.POINT win.GetCaretPos(&pos) lParam := uintptr(win.MAKELONG(uint16(pos.X), uint16(pos.Y))) i := int(win.LOWORD(uint32(nle.SendMessage(win.EM_CHARFROMPOS, 0, lParam)))) if min := len(nle.prefix); i <= min { if !ShiftDown() { nle.SetTextSelection(min, min) } return 0 } case KeyReturn: if nle.inEditMode { nle.endEdit() nle.selectNumber() return 0 } case KeyRight: var pos win.POINT win.GetCaretPos(&pos) lParam := uintptr(win.MAKELONG(uint16(pos.X), uint16(pos.Y))) i := int(win.LOWORD(uint32(nle.SendMessage(win.EM_CHARFROMPOS, 0, lParam)))) if max := len(nle.textUTF16()) - len(nle.suffix); i >= max { if !ShiftDown() { nle.SetTextSelection(max, max) } return 0 } case KeyUp: nle.incrementValue(nle.increment) return 0 } case win.WM_GETDLGCODE: if !nle.inEditMode { if form := ancestor(nle); form != nil { if dlg, ok := form.(dialogish); ok { if dlg.DefaultButton() != nil { // If the NumberEdit lives in a Dialog that has a // DefaultButton, we won't swallow the return key. break } } } } if wParam == win.VK_RETURN { return win.DLGC_WANTALLKEYS } case win.WM_KILLFOCUS: nle.endEdit() case win.WM_LBUTTONDOWN: i := int(win.LOWORD(uint32(nle.SendMessage(win.EM_CHARFROMPOS, 0, lParam)))) if min := len(nle.prefix); i < min { nle.SetFocus() nle.SetTextSelection(min, min) return 0 } if max := len(nle.textUTF16()) - len(nle.suffix); i > max { nle.SetFocus() nle.SetTextSelection(max, max) return 0 } case win.WM_LBUTTONDBLCLK: nle.selectNumber() return 0 case win.WM_MOUSEMOVE: i := int(win.LOWORD(uint32(nle.SendMessage(win.EM_CHARFROMPOS, 0, lParam)))) if min := len(nle.prefix); i < min { return 0 } if max := len(nle.textUTF16()) - len(nle.suffix); i > max { return 0 } case win.WM_MOUSEWHEEL: delta := float64(int16(win.HIWORD(uint32(wParam)))) nle.incrementValue(delta / 120 * nle.increment) return 0 case win.WM_PASTE: ret := nle.LineEdit.WndProc(hwnd, msg, wParam, lParam) if !nle.tryUpdateValue(true) { nle.setTextFromValue(nle.value) } nle.selectNumber() return ret case win.WM_SETFOCUS: nle.selectNumber() case win.EM_SETSEL: start := int(wParam) end := int(lParam) adjusted := false if min := len(nle.prefix); start < min { start = min adjusted = true } if max := len(nle.textUTF16()) - len(nle.suffix); end < 0 || end > max { end = max adjusted = true } if adjusted { nle.SetTextSelection(start, end) return 0 } } return nle.LineEdit.WndProc(hwnd, msg, wParam, lParam) }