Added combobox/listbox selection helper functions.

This commit is contained in:
Pietro Gagliardi 2014-02-15 12:32:12 -05:00
parent 0e2c1d2314
commit 0c0bbc29fa
2 changed files with 116 additions and 1 deletions

View File

@ -39,7 +39,15 @@ func (c *cSysData) append(string) error {
func (c *cSysData) insertBefore(string, int) error {
panic(runtime.GOOS + " sysData does not define insertBefore()")
}
// TODO selectedIndex, selectedIndices, selectedTexts
func (c *cSysData) selectedIndex() (int, error) {
panic(runtime.GOOS + " sysData does not define selectedIndex()")
}
func (c *cSysData) selectedIndices() ([]int, error) {
panic(runtime.GOOS + " sysData does not define selectedIndices()")
}
func (c *cSysData) selectedTexts() ([]string, error) {
panic(runtime.GOOS + " sysData does not define selectedIndex()")
}
const (
c_window = iota

View File

@ -27,6 +27,8 @@ type classData struct {
appendMsg uintptr
insertBeforeString uintptr
deleteMsg uintptr
selectedIndexMsg uintptr
selectedIndexErr int
}
const controlstyle = _WS_CHILD | _WS_VISIBLE | _WS_TABSTOP
@ -55,6 +57,8 @@ var classTypes = [nctypes]*classData{
appendMsg: _CB_ADDSTRING,
insertBeforeMsg: _CB_INSERTSTRING,
deleteMsg: _CB_DELETESTRING,
selectedIndexMsg: _CB_GETCURSEL,
selectedIndexErr: _CB_ERR,
},
c_lineedit: &classData{
name: "EDIT",
@ -75,6 +79,8 @@ var classTypes = [nctypes]*classData{
appendMsg: _LB_ADDSTRING,
insertBeforeMsg: _LB_INSERTSTRING,
deleteMsg: _LB_DELETESTRING,
selectedIndexMsg: _LB_GETCURSEL,
selectedIndexErr: _LB_ERR,
},
}
@ -330,3 +336,104 @@ func (s *sysData) insertBefore(what string, index int) (err error) {
// TODO error handling
return nil
}
// TODO handle actual errors
// TODO differentiate between nothing selected and custom text entered for a Combobox
func (s *sysData) selectedIndex() (int, error) {
ret := make(chan uiret)
defer close(ret)
uitask <- &uimsg{
call: _sendMessage,
p: []uintptr{
uintptr(s.hwnd),
uintptr(classTypes[s.ctype].selectedIndexMsg),
uintptr(_WPARAM(0)),
uintptr(_LPARAM(0)),
},
ret: ret,
}
r := <-ret
if r.ret == classTypes[s.ctype].selectedIndexErr {
return -1, nil
}
return int(r.ret), nil
}
// TODO handle actual errors
func (s *sysData) selectedIndices() ([]int, error) {
if !s.alternate { // single-selection list box; use single-selection method
index, err := s.selectedIndex()
if err != nil {
return nil, fmt.Errorf("error getting indices of single-selection list box: %v", err)
}
return []int{index}, nil
}
ret := make(chan uiret)
defer close(ret)
uitask <- &uimsg{
call: _sendMessage,
p: []uintptr{
uintptr(s.hwnd),
uintptr(_LB_GETSELCOUNT),
uintptr(0),
uintptr(0),
},
ret: ret
}
r := <-ret
// TODO handle errors
indices := make([]int, r.ret)
uitask <- &uimisg{
call: _sendMessage,
p: []uintptr{
uintptr(s.hwnd),
uintptr(_LB_GETSELITEMS),
uintptr(_WPARAM(r.ret)),
uintptr(_LPARAM(unsafe.Pointer(&indices[0]))),
},
ret: ret,
}
<-ret
// TODO handle errors
return indices, nil
}
func (s *sysData) selectedTexts() ([]string, error) {
indices, err := s.selectedIndices()
if err != nil {
return nil, fmt.Errorf("error getting selected indices for selected texts: %v", err)
}
ret := make(chan uiret)
defer close(ret)
strings := make([]string, len(indices))
for i, v := range indices {
uitask <- &uimsg{
call: _sendMessage,
p: []uintptr{
uintptr(s.hwnd),
uintptr(_LB_GETTEXTLEN),
uintptr(_WPARAM(v)),
uintptr(0),
},
ret: ret,
}
r := <-ret
// TODO handle errors
str := make([]uint16, r.ret)
uitask <- &uimsg{
call: _sendMessage,
p: []uintptr{
uintptr(s.hwnd),
uintptr(_LB_GETTEXT),
uintptr(_WPARAM(v)),
uintptr(_LPARAM(unsafe.Pointer(&str[0]))),
},
ret: ret,
}
<-ret
// TODO handle errors
strings[i] = syscall.UTF16ToString(str)
}
return strings, nil
}