ui/motif/list.c

changeset 108
77254bd6dccb
parent 103
6606616eca9f
child 112
c3f2f16fa4b8
equal deleted inserted replaced
107:b34bd1557c6c 108:77254bd6dccb
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;
107 UiEvent event; 132 UiEvent event;
108 event.obj = obj; 133 event.obj = obj;
109 event.window = obj->window; 134 event.window = obj->window;
110 event.document = obj->ctx->document; 135 event.document = obj->ctx->document;
111 event.eventdata = &sel; 136 event.eventdata = &sel;
137 event.eventdatatype = UI_EVENT_DATA_LIST_SELECTION;
112 event.intval = sel.count > 0 ? sel.rows[0] : -1; 138 event.intval = sel.count > 0 ? sel.rows[0] : -1;
113 callback(&event, userdata); 139 callback(&event, userdata);
114 } 140 }
115 141
116 static void listview_save_selection(UiListView *listview, XmListCallbackStruct *cb) { 142 static void listview_save_selection(UiListView *listview, XmListCallbackStruct *cb) {
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;
158 188
159 int count; 189 int count;
160 XmStringTable items = create_stringlist( 190 XmStringTable items = create_stringlist(
161 list, 191 list,
162 listview->getvalue, 192 listview->getvalue,
193 listview->getvaluedata,
163 &count); 194 &count);
164 195
165 XtVaSetValues( 196 XtVaSetValues(
166 listview->widget, 197 listview->widget,
167 XmNitems, count == 0 ? NULL : items, 198 XmNitems, count == 0 ? NULL : 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;

mercurial