Wrapped Mac OS X Listboxes in NSScrollViews. Their preferredSize seems to be more reasonable now. Now to just add scrollbars...

This commit is contained in:
Pietro Gagliardi 2014-03-03 14:50:03 -05:00
parent dd2abbacce
commit 8bacbf8cd6
2 changed files with 39 additions and 9 deletions

View File

@ -139,7 +139,7 @@ func bindListboxArray(tableColumn C.id, array C.id) {
C.nilid) // no options
}
func listboxArray(tableColumn C.id) C.id {
func listboxArrayController(tableColumn C.id) C.id {
dict := C.objc_msgSend_id(tableColumn, _infoForBinding, tableColumnBinding)
return C.objc_msgSend_id(dict, _objectForKey, *C._NSObservedObjectKey)
}
@ -169,6 +169,37 @@ func listboxTableColumn(listbox C.id) C.id {
return C.objc_msgSend_id(listbox, _tableColumnWithIdentifier, listboxItemKey)
}
/*
The NSTableViews don't draw their own scrollbars; we have to drop our NSTableViews in NSScrollViews for this.
*/
var (
_NSScrollView = objc_getClass("NSScrollView")
_setDocumentView = sel_getUid("setDocumentView:")
_documentView = sel_getUid("documentView")
)
func newListboxScrollView(listbox C.id) C.id {
scrollview := objc_alloc(_NSScrollView)
scrollview = objc_msgSend_rect(scrollview, _initWithFrame,
0, 0, 100, 100)
C.objc_msgSend_id(scrollview, _setDocumentView, listbox)
return scrollview
}
func listboxInScrollView(scrollview C.id) C.id {
return C.objc_msgSend_noargs(scrollview, _documentView)
}
/*
And now, a helper function that takes a scroll view and gets out the array.
*/
func listboxArray(listbox C.id) C.id {
return listboxArrayController(listboxTableColumn(listboxInScrollView(listbox)))
}
/*
...and finally, we work with the NSTableView directly. These are the methods sysData calls.
@ -199,18 +230,19 @@ func makeListbox(parentWindow C.id, alternate bool) C.id {
C.objc_msgSend_bool(listbox, _setAllowsEmptySelection, C.BOOL(C.YES))
C.objc_msgSend_id(listbox, _setHeaderView, C.nilid)
// TODO others?
listbox = newListboxScrollView(listbox)
windowView := C.objc_msgSend_noargs(parentWindow, _contentView)
C.objc_msgSend_id(windowView, _addSubview, listbox)
return listbox
}
func appendListbox(listbox C.id, what string, alternate bool) {
array := listboxArray(listboxTableColumn(listbox))
array := listboxArray(listbox)
appendListboxArray(array, what)
}
func insertListboxBefore(listbox C.id, what string, before int, alternate bool) {
array := listboxArray(listboxTableColumn(listbox))
array := listboxArray(listbox)
insertListboxArrayBefore(array, what, before)
}
@ -220,7 +252,7 @@ func insertListboxBefore(listbox C.id, what string, before int, alternate bool)
func selectedListboxIndices(listbox C.id) (list []int) {
var cindices []C.uintptr_t
indices := C.objc_msgSend_noargs(listbox, _selectedRowIndexes)
indices := C.objc_msgSend_noargs(listboxInScrollView(listbox), _selectedRowIndexes)
count := int(C.objc_msgSend_uintret_noargs(indices, _count))
if count == 0 {
return nil
@ -243,7 +275,7 @@ func selectedListboxTexts(listbox C.id) (texts []string) {
if len(indices) == 0 {
return nil
}
array := listboxArray(listboxTableColumn(listbox))
array := listboxArray(listbox)
texts = make([]string, len(indices))
for i := 0; i < len(texts); i++ {
texts[i] = indexListboxArray(array, indices[i])
@ -252,6 +284,6 @@ func selectedListboxTexts(listbox C.id) (texts []string) {
}
func deleteListbox(listbox C.id, index int) {
array := listboxArray(listboxTableColumn(listbox))
array := listboxArray(listbox)
deleteListboxArray(array, index)
}

View File

@ -12,7 +12,6 @@ Cocoa doesn't provide a reliable way to get the preferred size of a control (you
var (
_sizeToFit = sel_getUid("sizeToFit")
// _frame in sysdata_darwin.go
// _documentView in listbox_darwin.go
)
// standard case: control immediately passed in
@ -24,8 +23,7 @@ func controlPrefSize(control C.id) (width int, height int) {
// NSTableView is actually in a NSScrollView so we have to get it out first
func listboxPrefSize(control C.id) (width int, height int) {
// return controlPrefSize(C.objc_msgSend_noargs(control, _documentView))
return controlPrefSize(control)
return controlPrefSize(listboxInScrollView(control))
}
var prefsizefuncs = [nctypes]func(C.id) (int, int){