Implemented table column autoresize on Windows. Also fixed Windows/Mac OS X build.

This commit is contained in:
Pietro Gagliardi 2014-08-14 09:20:20 -04:00
parent 697b3cc1b0
commit d384df97d0
4 changed files with 26 additions and 22 deletions

View File

@ -1,3 +1,5 @@
// +build !windows,!darwin
/* 13 august 2014 */
#include "gtk_unix.h"

View File

@ -19,23 +19,11 @@ static LRESULT CALLBACK tableSubProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM
return 0;
}
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 */
if (nmhdr->code == HDN_BEGINTRACK)
tableStopColumnAutosize((void *) data);
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:
if ((*fv_RemoveWindowSubclass)(hwnd, tableSubProc, id) == FALSE)
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 */
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());
}

View File

@ -60,21 +60,22 @@ func tableGetCellText(data unsafe.Pointer, row C.int, col C.int, str *C.LPWSTR)
*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
func tableStopColumnAutosize(data unsafe.Pointer) {
t := (*table)(data)
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
func tableColumnCount(data unsafe.Pointer) C.int {
t := (*table)(data)
@ -106,6 +107,9 @@ func (t *table) preferredSize(d *sizing) (width, height int) {
func (t *table) commitResize(a *allocation, d *sizing) {
basecommitResize(t, a, d)
t.RLock()
defer t.RUnlock()
t.autoresize()
}
func (t *table) getAuxResizeInfo(d *sizing) {

View File

@ -97,6 +97,7 @@ extern void setTableSubclass(HWND, void *);
extern void tableAppendColumn(HWND, int, LPWSTR);
extern void tableUpdate(HWND, int);
extern void tableAddExtendedStyles(HWND, LPARAM);
extern void tableAutosizeColumns(HWND, int);
/* container_windows.c */
extern DWORD makeContainerWindowClass(char **);