func (lb *ListBox) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { switch msg { case win.WM_COMMAND: switch win.HIWORD(uint32(wParam)) { case win.LBN_SELCHANGE: lb.prevCurIndex = lb.CurrentIndex() lb.currentIndexChangedPublisher.Publish() case win.LBN_DBLCLK: lb.itemActivatedPublisher.Publish() } case win.WM_GETDLGCODE: if form := ancestor(lb); form != nil { if dlg, ok := form.(dialogish); ok { if dlg.DefaultButton() != nil { // If the ListBox 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_KEYDOWN: if uint32(lParam)>>30 == 0 && Key(wParam) == KeyReturn && lb.CurrentIndex() > -1 { lb.itemActivatedPublisher.Publish() } } return lb.WidgetBase.WndProc(hwnd, msg, wParam, lParam) }
func (sv *ScrollView) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { if sv.composite != nil { switch msg { case win.WM_HSCROLL: sv.composite.SetX(sv.scroll(win.SB_HORZ, win.LOWORD(uint32(wParam)))) case win.WM_VSCROLL: sv.composite.SetY(sv.scroll(win.SB_VERT, win.LOWORD(uint32(wParam)))) case win.WM_MOUSEWHEEL: var cmd uint16 if delta := int16(win.HIWORD(uint32(wParam))); delta < 0 { cmd = win.SB_LINEDOWN } else { cmd = win.SB_LINEUP } sv.composite.SetY(sv.scroll(win.SB_VERT, cmd)) return 0 case win.WM_COMMAND, win.WM_NOTIFY: sv.composite.WndProc(hwnd, msg, wParam, lParam) case win.WM_SIZE, win.WM_SIZING: s := maxSize(sv.composite.layout.MinSize(), sv.ClientBounds().Size()) sv.composite.SetSize(s) sv.updateScrollBars() } } return sv.WidgetBase.WndProc(hwnd, msg, wParam, lParam) }
func (cb *CheckBox) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { switch msg { case win.WM_COMMAND: switch win.HIWORD(uint32(wParam)) { case win.BN_CLICKED: cb.checkedChangedPublisher.Publish() cb.checkStateChangedPublisher.Publish() } } return cb.Button.WndProc(hwnd, msg, wParam, lParam) }
func (tb *ToolBar) SizeHint() Size { if tb.actions.Len() == 0 { return Size{} } size := uint32(tb.SendMessage(win.TB_GETBUTTONSIZE, 0, 0)) width := tb.defaultButtonWidth if width == 0 { width = int(win.LOWORD(size)) } height := int(win.HIWORD(size)) return Size{width, height} }
func (b *Button) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { switch msg { case win.WM_COMMAND: switch win.HIWORD(uint32(wParam)) { case win.BN_CLICKED: b.raiseClicked() } case win.WM_LBUTTONDBLCLK: b.dbclickPublisher.Publish() case win.WM_SETTEXT: b.textChangedPublisher.Publish() } return b.WidgetBase.WndProc(hwnd, msg, wParam, lParam) }
func (tb *ToolBar) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { switch msg { case win.WM_COMMAND: switch win.HIWORD(uint32(wParam)) { case win.BN_CLICKED: actionId := uint16(win.LOWORD(uint32(wParam))) if action, ok := actionsById[actionId]; ok { action.raiseTriggered() return 0 } } case win.WM_NOTIFY: nmhdr := (*win.NMHDR)(unsafe.Pointer(lParam)) switch int32(nmhdr.Code) { case win.TBN_DROPDOWN: nmtb := (*win.NMTOOLBAR)(unsafe.Pointer(lParam)) actionId := uint16(nmtb.IItem) if action := actionsById[actionId]; action != nil { var r win.RECT if 0 == tb.SendMessage(win.TB_GETRECT, uintptr(actionId), uintptr(unsafe.Pointer(&r))) { break } p := win.POINT{r.Left, r.Bottom} if !win.ClientToScreen(tb.hWnd, &p) { break } win.TrackPopupMenuEx( action.menu.hMenu, win.TPM_NOANIMATION, p.X, p.Y, tb.hWnd, nil) return win.TBDDRET_DEFAULT } } } return tb.WidgetBase.WndProc(hwnd, msg, wParam, lParam) }
func (cb *ComboBox) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { switch msg { case win.WM_COMMAND: code := win.HIWORD(uint32(wParam)) selIndex := cb.CurrentIndex() switch code { case win.CBN_EDITCHANGE: cb.selChangeIndex = -1 cb.textChangedPublisher.Publish() cb.currentIndexChangedPublisher.Publish() case win.CBN_SELCHANGE: cb.selChangeIndex = selIndex case win.CBN_SELENDCANCEL: if cb.selChangeIndex != -1 { if cb.selChangeIndex < cb.model.ItemCount() { cb.SetCurrentIndex(cb.selChangeIndex) } cb.selChangeIndex = -1 } case win.CBN_SELENDOK: if editable := cb.Editable(); editable || selIndex != cb.prevCurIndex { if editable && selIndex > -1 { cb.Property("Value").Set(cb.model.Value(selIndex)) } cb.currentIndexChangedPublisher.Publish() cb.prevCurIndex = selIndex return 0 } cb.selChangeIndex = -1 } case win.WM_MOUSEWHEEL: if !cb.Enabled() { return 0 } } return cb.WidgetBase.WndProc(hwnd, msg, wParam, lParam) }
func (le *LineEdit) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { switch msg { case win.WM_COMMAND: switch win.HIWORD(uint32(wParam)) { case win.EN_CHANGE: le.textChangedPublisher.Publish() } case win.WM_GETDLGCODE: if form := ancestor(le); form != nil { if dlg, ok := form.(dialogish); ok { if dlg.DefaultButton() != nil { // If the LineEdit 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_KEYDOWN: switch Key(wParam) { case KeyA: if ControlDown() { le.SetTextSelection(0, -1) } case KeyReturn: le.editingFinishedPublisher.Publish() } case win.WM_KILLFOCUS: // FIXME: This may be dangerous, see remarks section: // http://msdn.microsoft.com/en-us/library/ms646282(v=vs.85).aspx le.editingFinishedPublisher.Publish() } return le.WidgetBase.WndProc(hwnd, msg, wParam, lParam) }
func (rb *RadioButton) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { switch msg { case win.WM_COMMAND: switch win.HIWORD(uint32(wParam)) { case win.BN_CLICKED: prevChecked := rb.group.checkedButton rb.group.checkedButton = rb if prevChecked != rb { if prevChecked != nil { prevChecked.setChecked(false) } rb.setChecked(true) } } } return rb.Button.WndProc(hwnd, msg, wParam, lParam) }
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 (te *TextEdit) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { switch msg { case win.WM_COMMAND: switch win.HIWORD(uint32(wParam)) { case win.EN_CHANGE: te.textChangedPublisher.Publish() } case win.WM_GETDLGCODE: if wParam == win.VK_RETURN { return win.DLGC_WANTALLKEYS } return win.DLGC_HASSETSEL | win.DLGC_WANTARROWS | win.DLGC_WANTCHARS case win.WM_KEYDOWN: if Key(wParam) == KeyA && ControlDown() { te.SetTextSelection(0, -1) } } return te.WidgetBase.WndProc(hwnd, msg, wParam, lParam) }
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) }
func (cb *ContainerBase) WndProc(hwnd win.HWND, msg uint32, wParam, lParam uintptr) uintptr { switch msg { case win.WM_COMMAND: if lParam == 0 { switch win.HIWORD(uint32(wParam)) { case 0: cmdId := win.LOWORD(uint32(wParam)) switch cmdId { case win.IDOK, win.IDCANCEL: form := ancestor(cb) if form == nil { break } dlg, ok := form.(dialogish) if !ok { break } var button *PushButton if cmdId == win.IDOK { button = dlg.DefaultButton() } else { button = dlg.CancelButton() } if button != nil && button.Visible() && button.Enabled() { button.raiseClicked() } break } // Menu actionId := uint16(win.LOWORD(uint32(wParam))) if action, ok := actionsById[actionId]; ok { action.raiseTriggered() return 0 } case 1: // Accelerator } } else { // The window that sent the notification shall handle it itself. hWnd := win.HWND(lParam) if window := windowFromHandle(hWnd); window != nil { window.WndProc(hwnd, msg, wParam, lParam) return 0 } } case win.WM_NOTIFY: nmh := (*win.NMHDR)(unsafe.Pointer(lParam)) if window := windowFromHandle(nmh.HwndFrom); window != nil { // The window that sent the notification shall handle it itself. return window.WndProc(hwnd, msg, wParam, lParam) } case win.WM_SIZE, win.WM_SIZING: if cb.layout != nil { cb.layout.Update(false) } } return cb.WidgetBase.WndProc(hwnd, msg, wParam, lParam) }