ui/win32/list.c

Sat, 13 Dec 2025 12:37:41 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 13 Dec 2025 12:37:41 +0100
changeset 997
287b20e2a564
parent 980
39cb60b6a81b
child 998
55508508ba4d
permissions
-rw-r--r--

add support for static elements in the listview/dropdown (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
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
29 #include <stdio.h>
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
30 #include <stdlib.h>
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
31
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
32 #include <cx/array_list.h>
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
33
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34 #include "list.h"
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 #include "container.h"
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 static W32WidgetClass listview_widget_class = {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 .eventproc = ui_listview_eventproc,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 .enable = w32_widget_default_enable,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 .show = w32_widget_default_show,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 .get_preferred_size = ui_listview_get_preferred_size,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 .destroy = w32_widget_default_destroy
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
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 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
48 return col == 0 ? elm : NULL;
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* 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
52 ui_getvaluefunc getvalue = (ui_getvaluefunc)userdata;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 return getvalue(elm, col);
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 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
57 return NULL;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
60 /*
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
61 * Creates an UiListView widget object and initializes it from the UiListArgs
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
62 */
936
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
63 static UiListView* create_listview_widget(UiObject *obj, W32WidgetClass *widget_class, HWND hwnd, UiListArgs *args, UiBool table) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
64 UiListView *listview = w32_widget_create(widget_class, hwnd, sizeof(UiListView));
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 listview->widget.hwnd = hwnd;
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
66 listview->obj = obj;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
67 listview->preferred_width = args->width ? args->width : 300; // 300: default width/height
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 listview->preferred_height = args->height ? args->height : 300;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 listview->onactivate = args->onactivate;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 listview->onactivatedata = args->onactivatedata;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 listview->onselection = args->onselection;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 listview->onselectiondata = args->onselectiondata;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 listview->ondragstart = args->ondragstart;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 listview->ondragstartdata = args->ondragstartdata;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 listview->ondragcomplete = args->ondragcomplete;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 listview->ondragcompletedata = args->ondragcompletedata;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 listview->ondrop = args->ondrop;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 listview->ondropdata = args->ondropdata;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 listview->istable = table;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
81 // convert ui_getvaluefunc into ui_getvaluefunc2 if necessary
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 ui_getvaluefunc2 getvalue = args->getvalue2;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 void *getvaluedata = args->getvalue2data;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 if(!getvalue) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 if(args->getvalue) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 getvalue = getvalue_wrapper;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87 getvaluedata = (void*)args->getvalue;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88 } else {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 getvalue = table ? null_getvalue : strmodel_getvalue;
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 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 listview->getvalue = getvalue;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93 listview->getvaluedata = getvaluedata;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 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
96
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 return listview;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 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
101 HINSTANCE hInstance = GetModuleHandle(NULL);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 UiContainerPrivate *container = ui_obj_container(obj);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 HWND parent = ui_container_get_parent(container);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 UiLayout layout = UI_ARGS2LAYOUT(args);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 HWND hwnd = CreateWindowEx(
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107 WS_EX_CLIENTEDGE,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 WC_LISTVIEW,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 "",
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 WS_CHILD | WS_VISIBLE | LVS_REPORT,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 0, 0, 100, 100,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 parent,
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
113 (HMENU)1337,
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 hInstance,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115 NULL);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
116 ui_win32_set_ui_font(hwnd);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 ListView_SetExtendedListViewStyle(
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118 hwnd,
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119 LVS_EX_FULLROWSELECT //| LVS_EX_GRIDLINES
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 );
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121
936
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
122 UiListView *listview = create_listview_widget(obj, &listview_widget_class, hwnd, args, table);
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123 ui_container_add(container, (W32Widget*)listview, &layout);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
125 // init list model
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
126 // always initialize listview->model
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127 int numcolumns = 0;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128 if (table) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129 if (args->model) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
130 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
131 numcolumns = listview->model->columns;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
132 } else {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
133 listview->model = ui_model_new(obj->ctx);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
134 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
135 } else {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
136 UiModel *model = ui_model_new(obj->ctx);
980
39cb60b6a81b fix win32 build
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 969
diff changeset
137 ui_model_add_column(model, UI_STRING, "Test", -1);
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
138 listview->model = model;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
139 numcolumns = 1;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
140 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
141
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
142 // create columns
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
143 UiModel *model = listview->model;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
144 for (int i=0;i<numcolumns;i++) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
145 LVCOLUMN col;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
146 UiModelType type = model->types[i];
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
147 char *title = model->titles[i];
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
148 size_t titlelen = title ? strlen(title) : 0;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
149 int size = model->columnsize[i];
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
150 switch (type) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
151 default: {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
152 col.mask = LVCF_TEXT | LVCF_WIDTH;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
153 col.pszText = title;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
154 col.cx = size > 0 ? size : titlelen*10+5;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
155 break;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
156 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
157 case UI_ICON: {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
158 break; // TODO
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
159 }
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 ListView_InsertColumn(hwnd, i, &col);
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
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
164 // bind the listview to the provided UiList
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
165 if (listview->var) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
166 UiList *list = listview->var->value;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
167 list->obj = listview;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
168 list->update = ui_listview_update;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
169 list->getselection = ui_listview_getselection;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
170 list->setselection = ui_listview_setselection;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
171
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
172 ui_listview_update(list, -1);
997
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
173 } else if (!table && args->static_elements && args->static_nelm > 0) {
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
174 char **static_elements = args->static_elements;
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
175 size_t static_nelm = args->static_nelm;
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
176 LVITEM item;
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
177 item.mask = LVIF_TEXT;
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
178 item.iSubItem = 0;
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
179 for (int i=0;i<static_nelm;i++) {
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
180 item.iItem = i;
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
181 item.pszText = static_elements[i];
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
182 ListView_InsertItem(hwnd, &item);
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
183 }
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
184 listview->getvalue = strmodel_getvalue;
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
185 listview->getvaluedata = NULL;
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
186 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
187
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
188 return (W32Widget*)listview;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
189 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
190
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
191 static UiListSelection listview_get_selection(UiListView *listview) {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
192 UiListSelection sel = { 0, NULL };
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
193 HWND hwnd = listview->widget.hwnd;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
194
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
195 CX_ARRAY_DECLARE(int, indices);
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
196 cx_array_initialize(indices, 8);
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
197
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
198 int index = -1;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
199 while ((index = ListView_GetNextItem(hwnd, index, LVNI_SELECTED)) != -1) {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
200 cx_array_simple_add(indices, index);
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
201 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
202
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
203 if (indices_size > 0) {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
204 sel.rows = indices;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
205 sel.count = indices_size;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
206 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
207
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
208 return sel;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
209 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
210
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
211 // listview class event proc
938
be4c88ded783 change w32 eventproc signature + fix grid repaint bug (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 936
diff changeset
212 int ui_listview_eventproc(W32Widget *widget, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
213 UiListView *listview = (UiListView*)widget;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
214 switch (uMsg) {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
215 case WM_NOTIFY: {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
216 LPNMHDR hdr = (LPNMHDR)lParam;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
217 switch (hdr->code) {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
218 case LVN_ITEMCHANGED: {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
219 LPNMLISTVIEW lv = (LPNMLISTVIEW)lParam;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
220 int row = lv->iItem;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
221 if ((lv->uChanged & LVIF_STATE) && (lv->uNewState & LVIS_SELECTED) && listview->onselection) {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
222 UiListSelection sel = listview_get_selection(listview);
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
223
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
224 UiEvent event;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
225 event.obj = listview->obj;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
226 event.window = listview->obj->window;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
227 event.document = listview->obj->ctx->document;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
228 event.eventdata = &sel;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
229 event.eventdatatype = UI_EVENT_DATA_LIST_SELECTION;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
230 event.intval = row;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
231 event.set = ui_get_setop();
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
232 listview->onselection(&event, listview->onselectiondata);
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
233
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
234 ui_listselection_free(sel);
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
235 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
236 break;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
237 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
238 case LVN_ITEMACTIVATE: {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
239 LPNMLISTVIEW lv = (LPNMLISTVIEW)lParam;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
240 int row = lv->iItem;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
241 if (listview->onactivate) {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
242 UiEvent event;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
243 event.obj = listview->obj;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
244 event.window = listview->obj->window;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
245 event.document = listview->obj->ctx->document;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
246 event.eventdata = NULL;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
247 event.eventdatatype = UI_EVENT_DATA_LIST_ELM;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
248 event.intval = row;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
249 event.set = ui_get_setop();
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
250
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
251 if (listview->var) {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
252 UiList *list = listview->var->value;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
253 event.eventdata = list->get(list, row);
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
254 event.eventdatatype = UI_EVENT_DATA_LIST_ELM;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
255 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
256
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
257 listview->onactivate(&event, listview->onactivatedata);
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
258 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
259 break;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
260 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
261 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
262 break;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
263 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
264 }
938
be4c88ded783 change w32 eventproc signature + fix grid repaint bug (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 936
diff changeset
265
be4c88ded783 change w32 eventproc signature + fix grid repaint bug (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 936
diff changeset
266 return 0;
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
267 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
268
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
269 W32Size ui_listview_get_preferred_size(W32Widget *widget) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
270 UiListView *listview = (UiListView*)widget;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
271 W32Size size;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
272 size.width = listview->preferred_width;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
273 size.height = listview->preferred_height;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
274 return size;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
275 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
276
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
277 /*
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
278 * Creates and inserts an LVITEM
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
279 *
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
280 * list: An UiList bound to an UiListView
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
281 * row: row index
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
282 * elm: list element (same as list->get(list, row))
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
283 */
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
284 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
285 UiListView *listview = (UiListView*)list->obj;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
286 HWND hwnd = listview->widget.hwnd;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
287 UiModel *model = listview->model;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
288
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
289 LVITEM item;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
290 item.mask = LVIF_TEXT;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
291 item.iItem = row;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
292 item.iSubItem = 0;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
293 int idx = -1;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
294 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
295 UiBool freeResult = FALSE;
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
296 // convert the list element to a value, that can be displayed in the list view
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
297 // TODO: handle all model types
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
298 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
299 if (col == 0) {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
300 item.pszText = str;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
301 idx = ListView_InsertItem(hwnd, &item);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
302 } else {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
303 ListView_SetItemText(hwnd, idx, col, str);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
304 }
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
305
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
306 if (freeResult) {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
307 free(str);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
308 }
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
309 }
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
310 }
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
311
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
312 /*
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
313 * UiList->update function
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
314 *
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
315 * Updates one or all rows
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
316 * row: list index or -1 for updating all rows
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
317 */
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
318 void ui_listview_update(UiList *list, int row) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
319 UiListView *listview = (UiListView*)list->obj;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
320 HWND hwnd = listview->widget.hwnd;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
321 UiModel *model = listview->model;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
322 if (row < 0) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
323 ListView_DeleteAllItems(hwnd);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
324 void *elm = list->first(list);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
325 int row = 0;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
326 while (elm) {
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
327 insert_item(list, row, elm);
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
328 elm = list->next(list);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
329 row++;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
330 }
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
331 } else {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
332 ListView_DeleteItem(hwnd, row);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
333 void *elm = list->get(list, row);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
334 insert_item(list, row, elm);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
335 }
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
336
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
337 // re-adjust all columns
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
338 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
339 ListView_SetColumnWidth(hwnd, i, LVSCW_AUTOSIZE);
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
340 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
341 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
342
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
343 UiListSelection ui_listview_getselection(UiList *list) {
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
344 UiListView *listview = (UiListView*)list->obj;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
345 return listview_get_selection(listview);
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
346 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
347
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
348 void ui_listview_setselection(UiList *list, UiListSelection selection) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
349
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
350 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
351
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
352 // public API
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
353 UIWIDGET ui_listview_create(UiObject *obj, UiListArgs *args) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
354 return listview_create(obj, args, FALSE);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
355 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
356
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
357 // public API
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
358 UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
359 return listview_create(obj, args, TRUE);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
360 }
936
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
361
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
362
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
363 /* ------------------------------------ DropDown ------------------------------------*/
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
364
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
365 static W32WidgetClass dropdown_widget_class = {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
366 .eventproc = ui_dropdown_eventproc,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
367 .enable = w32_widget_default_enable,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
368 .show = w32_widget_default_show,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
369 .get_preferred_size = ui_dropdown_get_preferred_size,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
370 .destroy = w32_widget_default_destroy
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
371 };
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
372
969
7385c26d998d rename combobox to dropdown
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 938
diff changeset
373 UIWIDGET ui_dropdown_create(UiObject *obj, UiListArgs *args) {
936
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
374 HINSTANCE hInstance = GetModuleHandle(NULL);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
375 UiContainerPrivate *container = ui_obj_container(obj);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
376 HWND parent = ui_container_get_parent(container);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
377 UiLayout layout = UI_ARGS2LAYOUT(args);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
378
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
379 HWND hwnd = CreateWindowEx(
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
380 WS_EX_CLIENTEDGE,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
381 WC_COMBOBOX,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
382 "",
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
383 WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
384 0, 0, 100, 100,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
385 parent,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
386 (HMENU)1337,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
387 hInstance,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
388 NULL);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
389 ui_win32_set_ui_font(hwnd);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
390
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
391 UiListView *dropdown = create_listview_widget(obj, &dropdown_widget_class, hwnd, args, FALSE);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
392 ui_container_add(container, (W32Widget*)dropdown, &layout);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
393
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
394 // bind the dropdown to the provided UiList
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
395 if (dropdown->var) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
396 UiList *list = dropdown->var->value;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
397 list->obj = dropdown;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
398 list->update = ui_dropdown_update;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
399 list->getselection = ui_dropdown_getselection;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
400 list->setselection = ui_dropdown_setselection;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
401
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
402 ui_dropdown_update(list, -1);
997
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
403 } else if (args->static_elements && args->static_nelm > 0) {
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
404 char **static_elements = args->static_elements;
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
405 size_t static_nelm = args->static_nelm;
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
406 for (int i=0;i<static_nelm;i++) {
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
407 SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)static_elements[i]);
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
408 }
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
409 dropdown->getvalue = strmodel_getvalue;
287b20e2a564 add support for static elements in the listview/dropdown (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 980
diff changeset
410 dropdown->getvaluedata = NULL;
936
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
411 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
412
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
413 return (W32Widget*)dropdown;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
414 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
415
938
be4c88ded783 change w32 eventproc signature + fix grid repaint bug (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 936
diff changeset
416 int ui_dropdown_eventproc(W32Widget *widget, HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
be4c88ded783 change w32 eventproc signature + fix grid repaint bug (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 936
diff changeset
417 return 0;
936
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
418 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
419
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
420 W32Size ui_dropdown_get_preferred_size(W32Widget *widget) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
421 W32Size size;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
422 size.width = 200;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
423 size.height = 30;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
424 return size;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
425 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
426
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
427 static void dropdown_insert_item(UiList *list, int row, void *elm) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
428 UiListView *listview = (UiListView*)list->obj;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
429 HWND hwnd = listview->widget.hwnd;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
430
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
431 UiBool freeResult = FALSE;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
432 char *str = listview->getvalue(list, elm, row, 0, listview->getvaluedata, &freeResult);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
433 SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)str);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
434
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
435 if (freeResult) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
436 free(str);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
437 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
438 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
439
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
440 void ui_dropdown_update(UiList *list, int row) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
441 UiListView *listview = (UiListView*)list->obj;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
442 HWND hwnd = listview->widget.hwnd;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
443 if (row < 0) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
444 SendMessage(hwnd, CB_RESETCONTENT, 0, 0);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
445
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
446 void *elm = list->first(list);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
447 int row = 0;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
448 while (elm) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
449 dropdown_insert_item(list, row, elm);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
450 elm = list->next(list);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
451 row++;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
452 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
453 } else {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
454 SendMessage(hwnd, CB_DELETESTRING, row, 0);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
455 void *elm = list->get(list, row);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
456 dropdown_insert_item(list, row, elm);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
457 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
458 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
459
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
460 UiListSelection ui_dropdown_getselection(UiList *list) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
461 UiListSelection sel = { 0, NULL };
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
462 UiListView *listview = (UiListView*)list->obj;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
463 int index = (int)SendMessage(listview->widget.hwnd, CB_GETCURSEL, 0, 0);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
464 if (index >= 0) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
465 sel.rows = malloc(sizeof(int));
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
466 sel.rows[0] = index;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
467 sel.count = 1;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
468 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
469 return sel;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
470 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
471
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
472 void ui_dropdown_setselection(UiList *list, UiListSelection selection) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
473 UiListView *listview = (UiListView*)list->obj;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
474 SendMessage(listview->widget.hwnd, CB_SETCURSEL, 0, 0);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
475 }

mercurial