Implemented table column autoresize on Windows. Also fixed Windows/Mac OS X build.
This commit is contained in:
parent
697b3cc1b0
commit
d384df97d0
|
@ -1,3 +1,5 @@
|
||||||
|
// +build !windows,!darwin
|
||||||
|
|
||||||
/* 13 august 2014 */
|
/* 13 august 2014 */
|
||||||
|
|
||||||
#include "gtk_unix.h"
|
#include "gtk_unix.h"
|
||||||
|
|
|
@ -19,23 +19,11 @@ static LRESULT CALLBACK tableSubProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam);
|
return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam);
|
||||||
/* the autosize behavior is simple: always autosize until the user manually sizes, then never autosize again (this is my best guess as to how GTK+ behaves) */
|
/* see table.autoresize() in table_windows.go for the column autosize policy */
|
||||||
case WM_NOTIFY: /* from the contained header control */
|
case WM_NOTIFY: /* from the contained header control */
|
||||||
if (nmhdr->code == HDN_BEGINTRACK)
|
if (nmhdr->code == HDN_BEGINTRACK)
|
||||||
tableStopColumnAutosize((void *) data);
|
tableStopColumnAutosize((void *) data);
|
||||||
return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam);
|
return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam);
|
||||||
case WM_SIZE:
|
|
||||||
return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam);
|
|
||||||
/* TODO this causes weird issues with regards to item positioning on Windows XP */
|
|
||||||
if (tableAutosizeColumns((void *) data)) {
|
|
||||||
int i, nColumns;
|
|
||||||
|
|
||||||
nColumns = tableColumnCount((void *) data);
|
|
||||||
for (i = 0; i < nColumns; i++)
|
|
||||||
if (SendMessageW(hwnd, LVM_SETCOLUMNWIDTH, (WPARAM) i, (LPARAM) LVSCW_AUTOSIZE_USEHEADER) == FALSE)
|
|
||||||
xpanic("error resizing columns of results list view", GetLastError());
|
|
||||||
}
|
|
||||||
return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam);
|
|
||||||
case WM_NCDESTROY:
|
case WM_NCDESTROY:
|
||||||
if ((*fv_RemoveWindowSubclass)(hwnd, tableSubProc, id) == FALSE)
|
if ((*fv_RemoveWindowSubclass)(hwnd, tableSubProc, id) == FALSE)
|
||||||
xpanic("error removing Table subclass (which was for its own event handler)", GetLastError());
|
xpanic("error removing Table subclass (which was for its own event handler)", GetLastError());
|
||||||
|
@ -78,3 +66,12 @@ void tableAddExtendedStyles(HWND hwnd, LPARAM styles)
|
||||||
/* the bits of WPARAM specify which bits of LPARAM to look for; having WPARAM == LPARAM ensures that only the bits we want to add are affected */
|
/* the bits of WPARAM specify which bits of LPARAM to look for; having WPARAM == LPARAM ensures that only the bits we want to add are affected */
|
||||||
SendMessageW(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, (WPARAM) styles, styles);
|
SendMessageW(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, (WPARAM) styles, styles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tableAutosizeColumns(HWND hwnd, int nColumns)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < nColumns; i++)
|
||||||
|
if (SendMessageW(hwnd, LVM_SETCOLUMNWIDTH, (WPARAM) i, (LPARAM) LVSCW_AUTOSIZE_USEHEADER) == FALSE)
|
||||||
|
xpanic("error resizing columns of results list view", GetLastError());
|
||||||
|
}
|
||||||
|
|
|
@ -60,21 +60,22 @@ func tableGetCellText(data unsafe.Pointer, row C.int, col C.int, str *C.LPWSTR)
|
||||||
*str = toUTF16(s)
|
*str = toUTF16(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the column autoresize policy is simple:
|
||||||
|
// on every table.commitResize() call, if the columns have not been resized by the user, autoresize
|
||||||
|
func (t *table) autoresize() {
|
||||||
|
t.RLock()
|
||||||
|
defer t.RUnlock()
|
||||||
|
if !t.noautosize {
|
||||||
|
C.tableAutosizeColumns(t._hwnd, t.colcount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//export tableStopColumnAutosize
|
//export tableStopColumnAutosize
|
||||||
func tableStopColumnAutosize(data unsafe.Pointer) {
|
func tableStopColumnAutosize(data unsafe.Pointer) {
|
||||||
t := (*table)(data)
|
t := (*table)(data)
|
||||||
t.noautosize = true
|
t.noautosize = true
|
||||||
}
|
}
|
||||||
|
|
||||||
//export tableAutosizeColumns
|
|
||||||
func tableAutosizeColumns(data unsafe.Pointer) C.BOOL {
|
|
||||||
t := (*table)(data)
|
|
||||||
if t.noautosize {
|
|
||||||
return C.FALSE
|
|
||||||
}
|
|
||||||
return C.TRUE
|
|
||||||
}
|
|
||||||
|
|
||||||
//export tableColumnCount
|
//export tableColumnCount
|
||||||
func tableColumnCount(data unsafe.Pointer) C.int {
|
func tableColumnCount(data unsafe.Pointer) C.int {
|
||||||
t := (*table)(data)
|
t := (*table)(data)
|
||||||
|
@ -106,6 +107,9 @@ func (t *table) preferredSize(d *sizing) (width, height int) {
|
||||||
|
|
||||||
func (t *table) commitResize(a *allocation, d *sizing) {
|
func (t *table) commitResize(a *allocation, d *sizing) {
|
||||||
basecommitResize(t, a, d)
|
basecommitResize(t, a, d)
|
||||||
|
t.RLock()
|
||||||
|
defer t.RUnlock()
|
||||||
|
t.autoresize()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *table) getAuxResizeInfo(d *sizing) {
|
func (t *table) getAuxResizeInfo(d *sizing) {
|
||||||
|
|
|
@ -97,6 +97,7 @@ extern void setTableSubclass(HWND, void *);
|
||||||
extern void tableAppendColumn(HWND, int, LPWSTR);
|
extern void tableAppendColumn(HWND, int, LPWSTR);
|
||||||
extern void tableUpdate(HWND, int);
|
extern void tableUpdate(HWND, int);
|
||||||
extern void tableAddExtendedStyles(HWND, LPARAM);
|
extern void tableAddExtendedStyles(HWND, LPARAM);
|
||||||
|
extern void tableAutosizeColumns(HWND, int);
|
||||||
|
|
||||||
/* container_windows.c */
|
/* container_windows.c */
|
||||||
extern DWORD makeContainerWindowClass(char **);
|
extern DWORD makeContainerWindowClass(char **);
|
||||||
|
|
Loading…
Reference in New Issue