ui/win32/list.c

Sun, 07 Dec 2025 15:45:30 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 07 Dec 2025 15:45:30 +0100
changeset 969
7385c26d998d
parent 938
be4c88ded783
child 980
39cb60b6a81b
permissions
-rw-r--r--

rename combobox to dropdown

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);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
137 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
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);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
173 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
174
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
175 return (W32Widget*)listview;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
176 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
177
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
178 static UiListSelection listview_get_selection(UiListView *listview) {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
179 UiListSelection sel = { 0, NULL };
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
180 HWND hwnd = listview->widget.hwnd;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
181
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
182 CX_ARRAY_DECLARE(int, indices);
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
183 cx_array_initialize(indices, 8);
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
184
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
185 int index = -1;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
186 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
187 cx_array_simple_add(indices, index);
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
188 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
189
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
190 if (indices_size > 0) {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
191 sel.rows = indices;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
192 sel.count = indices_size;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
193 }
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 return sel;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
196 }
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 // 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
199 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
200 UiListView *listview = (UiListView*)widget;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
201 switch (uMsg) {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
202 case WM_NOTIFY: {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
203 LPNMHDR hdr = (LPNMHDR)lParam;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
204 switch (hdr->code) {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
205 case LVN_ITEMCHANGED: {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
206 LPNMLISTVIEW lv = (LPNMLISTVIEW)lParam;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
207 int row = lv->iItem;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
208 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
209 UiListSelection sel = listview_get_selection(listview);
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
210
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
211 UiEvent event;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
212 event.obj = listview->obj;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
213 event.window = listview->obj->window;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
214 event.document = listview->obj->ctx->document;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
215 event.eventdata = &sel;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
216 event.eventdatatype = UI_EVENT_DATA_LIST_SELECTION;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
217 event.intval = row;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
218 event.set = ui_get_setop();
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
219 listview->onselection(&event, listview->onselectiondata);
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
220
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
221 ui_listselection_free(sel);
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
222 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
223 break;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
224 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
225 case LVN_ITEMACTIVATE: {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
226 LPNMLISTVIEW lv = (LPNMLISTVIEW)lParam;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
227 int row = lv->iItem;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
228 if (listview->onactivate) {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
229 UiEvent event;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
230 event.obj = listview->obj;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
231 event.window = listview->obj->window;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
232 event.document = listview->obj->ctx->document;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
233 event.eventdata = NULL;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
234 event.eventdatatype = UI_EVENT_DATA_LIST_ELM;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
235 event.intval = row;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
236 event.set = ui_get_setop();
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 if (listview->var) {
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
239 UiList *list = listview->var->value;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
240 event.eventdata = list->get(list, row);
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
241 event.eventdatatype = UI_EVENT_DATA_LIST_ELM;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
242 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
243
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
244 listview->onactivate(&event, listview->onactivatedata);
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
245 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
246 break;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
247 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
248 }
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
249 break;
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 }
938
be4c88ded783 change w32 eventproc signature + fix grid repaint bug (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 936
diff changeset
252
be4c88ded783 change w32 eventproc signature + fix grid repaint bug (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 936
diff changeset
253 return 0;
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
254 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
255
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
256 W32Size ui_listview_get_preferred_size(W32Widget *widget) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
257 UiListView *listview = (UiListView*)widget;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
258 W32Size size;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
259 size.width = listview->preferred_width;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
260 size.height = listview->preferred_height;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
261 return size;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
262 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
263
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
264 /*
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
265 * Creates and inserts an LVITEM
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
266 *
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
267 * list: An UiList bound to an UiListView
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
268 * row: row index
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
269 * 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
270 */
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
271 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
272 UiListView *listview = (UiListView*)list->obj;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
273 HWND hwnd = listview->widget.hwnd;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
274 UiModel *model = listview->model;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
275
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
276 LVITEM item;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
277 item.mask = LVIF_TEXT;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
278 item.iItem = row;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
279 item.iSubItem = 0;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
280 int idx = -1;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
281 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
282 UiBool freeResult = FALSE;
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
283 // 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
284 // TODO: handle all model types
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
285 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
286 if (col == 0) {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
287 item.pszText = str;
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
288 idx = ListView_InsertItem(hwnd, &item);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
289 } else {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
290 ListView_SetItemText(hwnd, idx, col, str);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
291 }
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
292
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
293 if (freeResult) {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
294 free(str);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
295 }
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
296 }
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
297 }
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
298
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
299 /*
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
300 * UiList->update function
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
301 *
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
302 * Updates one or all rows
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
303 * 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
304 */
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
305 void ui_listview_update(UiList *list, int row) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
306 UiListView *listview = (UiListView*)list->obj;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
307 HWND hwnd = listview->widget.hwnd;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
308 UiModel *model = listview->model;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
309 if (row < 0) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
310 ListView_DeleteAllItems(hwnd);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
311 void *elm = list->first(list);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
312 int row = 0;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
313 while (elm) {
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
314 insert_item(list, row, elm);
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
315 elm = list->next(list);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
316 row++;
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
317 }
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
318 } else {
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
319 ListView_DeleteItem(hwnd, row);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
320 void *elm = list->get(list, row);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
321 insert_item(list, row, elm);
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
322 }
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
323
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
324 // re-adjust all columns
918
7d3dd5aacfda implement single row listview update (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 917
diff changeset
325 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
326 ListView_SetColumnWidth(hwnd, i, LVSCW_AUTOSIZE);
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
327 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
328 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
329
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
330 UiListSelection ui_listview_getselection(UiList *list) {
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
331 UiListView *listview = (UiListView*)list->obj;
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
332 return listview_get_selection(listview);
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
333 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
334
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
335 void ui_listview_setselection(UiList *list, UiListSelection selection) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
336
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
337 }
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
338
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
339 // public API
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
340 UIWIDGET ui_listview_create(UiObject *obj, UiListArgs *args) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
341 return listview_create(obj, args, FALSE);
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
919
d9018dcd4e2d implement listview selection events (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 918
diff changeset
344 // public API
917
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
345 UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) {
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
346 return listview_create(obj, args, TRUE);
ca3918f9c96b add first win32 listview/table code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
347 }
936
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
348
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
349
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
350 /* ------------------------------------ DropDown ------------------------------------*/
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
351
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
352 static W32WidgetClass dropdown_widget_class = {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
353 .eventproc = ui_dropdown_eventproc,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
354 .enable = w32_widget_default_enable,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
355 .show = w32_widget_default_show,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
356 .get_preferred_size = ui_dropdown_get_preferred_size,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
357 .destroy = w32_widget_default_destroy
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
358 };
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
359
969
7385c26d998d rename combobox to dropdown
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 938
diff changeset
360 UIWIDGET ui_dropdown_create(UiObject *obj, UiListArgs *args) {
936
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
361 HINSTANCE hInstance = GetModuleHandle(NULL);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
362 UiContainerPrivate *container = ui_obj_container(obj);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
363 HWND parent = ui_container_get_parent(container);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
364 UiLayout layout = UI_ARGS2LAYOUT(args);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
365
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
366 HWND hwnd = CreateWindowEx(
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
367 WS_EX_CLIENTEDGE,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
368 WC_COMBOBOX,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
369 "",
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
370 WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_DROPDOWNLIST,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
371 0, 0, 100, 100,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
372 parent,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
373 (HMENU)1337,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
374 hInstance,
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
375 NULL);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
376 ui_win32_set_ui_font(hwnd);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
377
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
378 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
379 ui_container_add(container, (W32Widget*)dropdown, &layout);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
380
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
381 // bind the dropdown to the provided UiList
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
382 if (dropdown->var) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
383 UiList *list = dropdown->var->value;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
384 list->obj = dropdown;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
385 list->update = ui_dropdown_update;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
386 list->getselection = ui_dropdown_getselection;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
387 list->setselection = ui_dropdown_setselection;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
388
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
389 ui_dropdown_update(list, -1);
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
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
392
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
393 return (W32Widget*)dropdown;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
394 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
395
938
be4c88ded783 change w32 eventproc signature + fix grid repaint bug (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 936
diff changeset
396 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
397 return 0;
936
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
398 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
399
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
400 W32Size ui_dropdown_get_preferred_size(W32Widget *widget) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
401 W32Size size;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
402 size.width = 200;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
403 size.height = 30;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
404 return size;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
405 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
406
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
407 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
408 UiListView *listview = (UiListView*)list->obj;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
409 HWND hwnd = listview->widget.hwnd;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
410
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
411 UiBool freeResult = FALSE;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
412 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
413 SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)str);
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 if (freeResult) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
416 free(str);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
417 }
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 void ui_dropdown_update(UiList *list, int row) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
421 UiListView *listview = (UiListView*)list->obj;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
422 HWND hwnd = listview->widget.hwnd;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
423 if (row < 0) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
424 SendMessage(hwnd, CB_RESETCONTENT, 0, 0);
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 void *elm = list->first(list);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
427 int row = 0;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
428 while (elm) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
429 dropdown_insert_item(list, row, elm);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
430 elm = list->next(list);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
431 row++;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
432 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
433 } else {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
434 SendMessage(hwnd, CB_DELETESTRING, row, 0);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
435 void *elm = list->get(list, row);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
436 dropdown_insert_item(list, row, elm);
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 UiListSelection ui_dropdown_getselection(UiList *list) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
441 UiListSelection sel = { 0, NULL };
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
442 UiListView *listview = (UiListView*)list->obj;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
443 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
444 if (index >= 0) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
445 sel.rows = malloc(sizeof(int));
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
446 sel.rows[0] = index;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
447 sel.count = 1;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
448 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
449 return sel;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
450 }
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
451
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
452 void ui_dropdown_setselection(UiList *list, UiListSelection selection) {
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
453 UiListView *listview = (UiListView*)list->obj;
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
454 SendMessage(listview->widget.hwnd, CB_SETCURSEL, 0, 0);
d40a72210be8 add ui_combobox (Win32)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 919
diff changeset
455 }

mercurial