| 32 #include "container.h" |
32 #include "container.h" |
| 33 |
33 |
| 34 #include "list.h" |
34 #include "list.h" |
| 35 #include "../common/object.h" |
35 #include "../common/object.h" |
| 36 |
36 |
| 37 UIWIDGET ui_listview_create(UiObject* obj, UiListArgs args) { |
37 static void* getvalue_wrapper(UiList *list, void *elm, int row, int col, void *userdata, UiBool *freeResult) { |
| |
38 ui_getvaluefunc getvalue = (ui_getvaluefunc)userdata; |
| |
39 return getvalue(elm, col); |
| |
40 } |
| |
41 |
| |
42 /* |
| |
43 static void* model_getvalue(UiModel *model, UiList *list, void *elm, int row, int col, UiBool *freeResult) { |
| |
44 if(model->getvalue2) { |
| |
45 return model->getvalue2(list, elm, row, col, model->getvalue2data, freeResult); |
| |
46 } else if(model->getvalue) { |
| |
47 return model->getvalue(elm, col); |
| |
48 } |
| |
49 return NULL; |
| |
50 } |
| |
51 */ |
| |
52 |
| |
53 UIWIDGET ui_listview_create(UiObject* obj, UiListArgs *args) { |
| 38 Arg xargs[16]; |
54 Arg xargs[16]; |
| 39 int n = 0; |
55 int n = 0; |
| 40 |
56 |
| 41 UiContainerPrivate *ctn = ui_obj_container(obj); |
57 UiContainerPrivate *ctn = ui_obj_container(obj); |
| 42 UI_APPLY_LAYOUT(ctn->layout, args); |
58 UI_APPLY_LAYOUT(ctn->layout, args); |
| 43 |
59 |
| 44 if(args.multiselection) { |
60 if(args->multiselection) { |
| 45 XtSetArg(xargs[n], XmNselectionPolicy, XmEXTENDED_SELECT); n++; |
61 XtSetArg(xargs[n], XmNselectionPolicy, XmEXTENDED_SELECT); n++; |
| 46 } else { |
62 } else { |
| 47 XtSetArg(xargs[n], XmNselectionPolicy, XmSINGLE_SELECT); n++; |
63 XtSetArg(xargs[n], XmNselectionPolicy, XmSINGLE_SELECT); n++; |
| 48 } |
64 } |
| 49 |
65 |
| 50 char *name = args.name ? (char*)args.name : "listview"; |
66 char *name = args->name ? (char*)args->name : "listview"; |
| 51 Widget parent = ctn->prepare(ctn, xargs, &n); |
67 Widget parent = ctn->prepare(ctn, xargs, &n); |
| 52 Widget widget = XmCreateScrolledList(parent, name, xargs, n); |
68 Widget widget = XmCreateScrolledList(parent, name, xargs, n); |
| 53 XtManageChild(widget); |
69 XtManageChild(widget); |
| 54 |
70 |
| 55 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.list, args.varname, UI_VAR_LIST); |
71 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); |
| 56 |
72 |
| 57 UiListView *listview = malloc(sizeof(UiListView)); |
73 UiListView *listview = malloc(sizeof(UiListView)); |
| 58 memset(listview, 0, sizeof(UiListView)); |
74 memset(listview, 0, sizeof(UiListView)); |
| 59 listview->obj = obj; |
75 listview->obj = obj; |
| 60 listview->widget = widget; |
76 listview->widget = widget; |
| 61 listview->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue; |
77 if(args->getvalue2) { |
| |
78 listview->getvalue = args->getvalue2; |
| |
79 listview->getvaluedata = args->getvalue2data; |
| |
80 } else if(args->getvalue) { |
| |
81 listview->getvalue = getvalue_wrapper; |
| |
82 listview->getvaluedata = args->getvalue; |
| |
83 } else { |
| |
84 listview->getvalue = getvalue_wrapper; |
| |
85 listview->getvaluedata = ui_strmodel_getvalue; |
| |
86 } |
| 62 listview->var = var; |
87 listview->var = var; |
| 63 listview->onactivate = args.onactivate; |
88 listview->onactivate = args->onactivate; |
| 64 listview->onactivatedata = args.onactivatedata; |
89 listview->onactivatedata = args->onactivatedata; |
| 65 listview->onselection = args.onselection; |
90 listview->onselection = args->onselection; |
| 66 listview->onselectiondata = args.onselectiondata; |
91 listview->onselectiondata = args->onselectiondata; |
| 67 |
92 |
| 68 if(var) { |
93 if(var) { |
| 69 UiList *list = var->value; |
94 UiList *list = var->value; |
| 70 list->obj = listview; |
95 list->obj = listview; |
| 71 list->update = ui_listview_update; |
96 list->update = ui_listview_update; |
| 137 if(listview->onselection) { |
163 if(listview->onselection) { |
| 138 list_callback(listview->obj, listview->current_selection, listview->onselection, listview->onselectiondata); |
164 list_callback(listview->obj, listview->current_selection, listview->onselection, listview->onselectiondata); |
| 139 } |
165 } |
| 140 } |
166 } |
| 141 |
167 |
| 142 static XmStringTable create_stringlist(UiList *list, ui_getvaluefunc getvalue, int *count) { |
168 static XmStringTable create_stringlist(UiList *list, ui_getvaluefunc2 getvalue, void *getvaluedata, int *count) { |
| 143 int num = list->count(list); |
169 int num = list->count(list); |
| 144 XmStringTable items = (XmStringTable)XtMalloc(num * sizeof(XmString)); |
170 XmStringTable items = (XmStringTable)XtMalloc(num * sizeof(XmString)); |
| 145 void *data = list->first(list); |
171 void *data = list->first(list); |
| 146 for(int i=0;i<num;i++) { |
172 for(int i=0;i<num;i++) { |
| 147 char *s = getvalue(data, 0); |
173 UiBool freevalue = FALSE; |
| |
174 char *s = getvalue(list, data, i, 0, getvaluedata, &freevalue); |
| 148 items[i] = XmStringCreateLocalized(s ? s : ""); |
175 items[i] = XmStringCreateLocalized(s ? s : ""); |
| |
176 if(freevalue) { |
| |
177 free(s); |
| |
178 } |
| 149 data = list->next(list); |
179 data = list->next(list); |
| 150 } |
180 } |
| 151 |
181 |
| 152 *count = num; |
182 *count = num; |
| 153 return items; |
183 return items; |
| 204 static void ui_dropdown_selection( |
235 static void ui_dropdown_selection( |
| 205 Widget w, |
236 Widget w, |
| 206 UiListView *listview, |
237 UiListView *listview, |
| 207 XmComboBoxCallbackStruct *cb) |
238 XmComboBoxCallbackStruct *cb) |
| 208 { |
239 { |
| 209 UiListSelection sel = { 0, NULL }; |
240 int index = cb->item_position; |
| 210 if(cb->item_position > 0) { |
241 void *elm = NULL; |
| 211 sel.count = 1; |
242 if(listview->var) { |
| 212 sel.rows = malloc(sizeof(int)); |
243 UiList *list = listview->var->value; |
| 213 sel.rows[0] = cb->item_position-1; |
244 elm = ui_list_get(list, index); |
| 214 } |
245 } |
| |
246 |
| 215 UiEvent event; |
247 UiEvent event; |
| 216 event.obj = listview->obj; |
248 event.obj = listview->obj; |
| 217 event.window = event.obj->window; |
249 event.window = event.obj->window; |
| 218 event.document = event.obj->ctx->document; |
250 event.document = event.obj->ctx->document; |
| 219 event.eventdata = &sel; |
251 event.eventdata = elm; |
| 220 event.intval = 0; |
252 event.eventdatatype = UI_EVENT_DATA_LIST_ELM; |
| |
253 event.intval = index; |
| 221 if(listview->onactivate) { |
254 if(listview->onactivate) { |
| 222 listview->onactivate(&event, listview->onactivatedata); |
255 listview->onactivate(&event, listview->onactivatedata); |
| 223 } |
256 } |
| 224 if(listview->onselection) { |
257 if(listview->onselection) { |
| 225 listview->onselection(&event, listview->onselectiondata); |
258 listview->onselection(&event, listview->onselectiondata); |
| 226 } |
259 } |
| 227 } |
260 } |
| 228 |
261 |
| 229 UIWIDGET ui_combobox_create(UiObject* obj, UiListArgs args) { |
262 UIWIDGET ui_combobox_create(UiObject* obj, UiListArgs *args) { |
| 230 Arg xargs[16]; |
263 Arg xargs[16]; |
| 231 int n = 0; |
264 int n = 0; |
| 232 |
265 |
| 233 UiContainerPrivate *ctn = ui_obj_container(obj); |
266 UiContainerPrivate *ctn = ui_obj_container(obj); |
| 234 UI_APPLY_LAYOUT(ctn->layout, args); |
267 UI_APPLY_LAYOUT(ctn->layout, args); |
| 235 |
268 |
| 236 char *name = args.name ? (char*)args.name : "dropdown"; |
269 char *name = args->name ? (char*)args->name : "dropdown"; |
| 237 Widget parent = ctn->prepare(ctn, xargs, &n); |
270 Widget parent = ctn->prepare(ctn, xargs, &n); |
| 238 Widget widget = XmCreateDropDownList(parent, name, xargs, n); |
271 Widget widget = XmCreateDropDownList(parent, name, xargs, n); |
| 239 XtManageChild(widget); |
272 XtManageChild(widget); |
| 240 |
273 |
| 241 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.list, args.varname, UI_VAR_LIST); |
274 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->list, args->varname, UI_VAR_LIST); |
| 242 |
275 |
| 243 UiListView *listview = malloc(sizeof(UiListView)); |
276 UiListView *listview = malloc(sizeof(UiListView)); |
| 244 memset(listview, 0, sizeof(UiListView)); |
277 memset(listview, 0, sizeof(UiListView)); |
| 245 listview->obj = obj; |
278 listview->obj = obj; |
| 246 listview->widget = widget; |
279 listview->widget = widget; |
| 247 listview->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue; |
280 if(args->getvalue2) { |
| |
281 listview->getvalue = args->getvalue2; |
| |
282 listview->getvaluedata = args->getvalue2data; |
| |
283 } else if(args->getvalue) { |
| |
284 listview->getvalue = getvalue_wrapper; |
| |
285 listview->getvaluedata = args->getvalue; |
| |
286 } else { |
| |
287 listview->getvalue = getvalue_wrapper; |
| |
288 listview->getvaluedata = ui_strmodel_getvalue; |
| |
289 } |
| 248 listview->var = var; |
290 listview->var = var; |
| 249 listview->onactivate = args.onactivate; |
291 listview->onactivate = args->onactivate; |
| 250 listview->onactivatedata = args.onactivatedata; |
292 listview->onactivatedata = args->onactivatedata; |
| 251 listview->onselection = args.onselection; |
293 listview->onselection = args->onselection; |
| 252 listview->onselectiondata = args.onselectiondata; |
294 listview->onselectiondata = args->onselectiondata; |
| 253 |
295 |
| 254 if(var) { |
296 if(var) { |
| 255 UiList *list = var->value; |
297 UiList *list = var->value; |
| 256 list->obj = listview; |
298 list->obj = listview; |
| 257 list->update = ui_listview_update; |
299 list->update = ui_listview_update; |