ui/win32/list.c

Wed, 19 Nov 2025 12:17:59 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 19 Nov 2025 12:17:59 +0100
changeset 918
7d3dd5aacfda
parent 917
ca3918f9c96b
child 919
d9018dcd4e2d
permissions
-rw-r--r--

implement single row listview update (Win32)

917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2025 Olaf Wintermann. All rights reserved.
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "list.h"
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #include "container.h"
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34 static W32WidgetClass listview_widget_class = {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 .eventproc = ui_listview_eventproc,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 .enable = w32_widget_default_enable,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 .show = w32_widget_default_show,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 .get_preferred_size = ui_listview_get_preferred_size,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 .destroy = w32_widget_default_destroy
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 };
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 static void* strmodel_getvalue(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 return col == 0 ? elm : NULL;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 static void* getvalue_wrapper(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 ui_getvaluefunc getvalue = (ui_getvaluefunc)userdata;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 return getvalue(elm, col);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 static void* null_getvalue(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 return NULL;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 static UiListView* create_listview_widget(UiObject *obj, HWND hwnd, UiListArgs *args, UiBool table) {
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
57 UiListView *listview = w32_widget_create(&listview_widget_class, hwnd, sizeof(UiListView));
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 listview->widget.hwnd = hwnd;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 listview->preferred_width = args->width ? args->width : 300;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 listview->preferred_height = args->height ? args->height : 300;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 listview->onactivate = args->onactivate;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 listview->onactivatedata = args->onactivatedata;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 listview->onselection = args->onselection;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 listview->onselectiondata = args->onselectiondata;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 listview->ondragstart = args->ondragstart;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66 listview->ondragstartdata = args->ondragstartdata;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67 listview->ondragcomplete = args->ondragcomplete;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 listview->ondragcompletedata = args->ondragcompletedata;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 listview->ondrop = args->ondrop;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 listview->ondropdata = args->ondropdata;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 listview->istable = table;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 ui_getvaluefunc2 getvalue = args->getvalue2;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 void *getvaluedata = args->getvalue2data;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 if(!getvalue) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 if(args->getvalue) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 getvalue = getvalue_wrapper;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 getvaluedata = (void*)args->getvalue;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 } else {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 getvalue = table ? null_getvalue : strmodel_getvalue;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 listview->getvalue = getvalue;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 listview->getvaluedata = getvaluedata;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 listview->var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88 return listview;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 static UIWIDGET listview_create(UiObject *obj, UiListArgs *args, UiBool table) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 HINSTANCE hInstance = GetModuleHandle(NULL);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93 UiContainerPrivate *container = ui_obj_container(obj);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 HWND parent = ui_container_get_parent(container);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 UiLayout layout = UI_ARGS2LAYOUT(args);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 HWND hwnd = CreateWindowEx(
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 WS_EX_CLIENTEDGE,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 WC_LISTVIEW,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 "",
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 WS_CHILD | WS_VISIBLE | LVS_REPORT,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 0, 0, 100, 100,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 parent,
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
104 (HMENU)1337,
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105 hInstance,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 NULL);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107 ui_win32_set_ui_font(hwnd);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 ListView_SetExtendedListViewStyle(
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 hwnd,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 LVS_EX_FULLROWSELECT //| LVS_EX_GRIDLINES
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 );
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 UiListView *listview = create_listview_widget(obj, hwnd, args, table);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115 ui_container_add(container, (W32Widget*)listview, &layout);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
116
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 // model
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118 int numcolumns = 0;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119 if (table) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 if (args->model) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121 listview->model = ui_model_copy(obj->ctx, args->model);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
122 numcolumns = listview->model->columns;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123 } else {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124 listview->model = ui_model_new(obj->ctx);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
125 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
126 } else {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127 UiModel *model = ui_model_new(obj->ctx);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128 ui_model_add_column(obj->ctx, model, UI_STRING, "Test", -1);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129 listview->model = model;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
130 numcolumns = 1;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
131 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
132
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
133 UiModel *model = listview->model;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
134 for (int i=0;i<numcolumns;i++) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
135 LVCOLUMN col;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
136 UiModelType type = model->types[i];
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
137 char *title = model->titles[i];
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
138 size_t titlelen = title ? strlen(title) : 0;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
139 int size = model->columnsize[i];
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
140 switch (type) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
141 default: {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
142 col.mask = LVCF_TEXT | LVCF_WIDTH;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
143 col.pszText = title;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
144 col.cx = size > 0 ? size : titlelen*10+5;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
145 break;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
146 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
147 case UI_ICON: {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
148 break; // TODO
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
149 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
150 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
151 ListView_InsertColumn(hwnd, i, &col);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
152 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
153
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
154 if (listview->var) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
155 UiList *list = listview->var->value;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
156 list->obj = listview;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
157 list->update = ui_listview_update;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
158 list->getselection = ui_listview_getselection;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
159 list->setselection = ui_listview_setselection;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
160
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
161 ui_listview_update(list, -1);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
162 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
163
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
164 return (W32Widget*)listview;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
165 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
166
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
167 void ui_listview_eventproc(W32Widget *widget, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
168
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
169 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
170
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
171 W32Size ui_listview_get_preferred_size(W32Widget *widget) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
172 UiListView *listview = (UiListView*)widget;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
173 W32Size size;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
174 size.width = listview->preferred_width;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
175 size.height = listview->preferred_height;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
176 return size;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
177 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
178
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
179 static void insert_item(UiList *list, int row, void *elm) {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
180 UiListView *listview = (UiListView*)list->obj;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
181 HWND hwnd = listview->widget.hwnd;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
182 UiModel *model = listview->model;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
183
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
184 LVITEM item;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
185 item.mask = LVIF_TEXT;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
186 item.iItem = row;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
187 item.iSubItem = 0;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
188 int idx = -1;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
189 for (int col=0;col<model->columns;col++) {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
190 UiBool freeResult = FALSE;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
191 char *str = listview->getvalue(list, elm, row, col, listview->getvaluedata, &freeResult);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
192 if (col == 0) {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
193 item.pszText = str;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
194 idx = ListView_InsertItem(hwnd, &item);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
195 } else {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
196 ListView_SetItemText(hwnd, idx, col, str);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
197 }
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
198
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
199 if (freeResult) {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
200 free(str);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
201 }
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
202 }
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
203 }
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
204
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
205 void ui_listview_update(UiList *list, int row) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
206 UiListView *listview = (UiListView*)list->obj;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
207 HWND hwnd = listview->widget.hwnd;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
208 UiModel *model = listview->model;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
209 if (row < 0) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
210 ListView_DeleteAllItems(hwnd);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
211 void *elm = list->first(list);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
212 int row = 0;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
213 while (elm) {
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
214 insert_item(list, row, elm);
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
215 elm = list->next(list);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
216 row++;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
217 }
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
218 } else {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
219 ListView_DeleteItem(hwnd, row);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
220 void *elm = list->get(list, row);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
221 insert_item(list, row, elm);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
222 }
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
223
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
224 for (int i=0;i<model->columns;i++) {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
225 ListView_SetColumnWidth(hwnd, i, LVSCW_AUTOSIZE);
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
226 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
227 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
228
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
229 UiListSelection ui_listview_getselection(UiList *list) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
230 UiListSelection sel = { 0, NULL };
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
231 return sel;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
232 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
233
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
234 void ui_listview_setselection(UiList *list, UiListSelection selection) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
235
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
236 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
237
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
238 UIWIDGET ui_listview_create(UiObject *obj, UiListArgs *args) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
239 return listview_create(obj, args, FALSE);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
240 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
241
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
242 UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
243 return listview_create(obj, args, TRUE);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
244 }

mercurial