| 39 #include <cx/compare.h> |
39 #include <cx/compare.h> |
| 40 |
40 |
| 41 #include <Xm/XmAll.h> |
41 #include <Xm/XmAll.h> |
| 42 |
42 |
| 43 |
43 |
| 44 UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs args) { |
44 UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) { |
| 45 Arg xargs[16]; |
45 Arg xargs[16]; |
| 46 int n = 0; |
46 int n = 0; |
| 47 |
47 |
| 48 UiContainerPrivate *ctn = ui_obj_container(obj); |
48 UiContainerPrivate *ctn = ui_obj_container(obj); |
| 49 UI_APPLY_LAYOUT(ctn->layout, args); |
49 UI_APPLY_LAYOUT(ctn->layout, args); |
| 50 |
50 |
| 51 Widget parent = ctn->prepare(ctn, xargs, &n); |
51 Widget parent = ctn->prepare(ctn, xargs, &n); |
| 52 |
52 |
| 53 XmString label = NULL; |
53 XmString label = NULL; |
| 54 if(args.label) { |
54 if(args->label) { |
| 55 label = XmStringCreateLocalized((char*)args.label); |
55 label = XmStringCreateLocalized((char*)args->label); |
| 56 XtSetArg(xargs[n], XmNlabelString, label); n++; |
56 XtSetArg(xargs[n], XmNlabelString, label); n++; |
| 57 } |
57 } |
| 58 |
58 |
| 59 char *name = args.name ? (char*)args.name : "button"; |
59 char *name = args->name ? (char*)args->name : "button"; |
| 60 Widget button = XmCreatePushButton(parent, name, xargs, n); |
60 Widget button = XmCreatePushButton(parent, name, xargs, n); |
| 61 XtManageChild(button); |
61 XtManageChild(button); |
| 62 ctn->add(ctn, button); |
62 ctn->add(ctn, button); |
| 63 |
63 |
| 64 ui_set_widget_groups(obj->ctx, button, args.groups); |
64 ui_set_widget_groups(obj->ctx, button, args->groups); |
| 65 |
65 |
| 66 if(args.onclick) { |
66 if(args->onclick) { |
| 67 UiEventData *eventdata = malloc(sizeof(UiEventData)); |
67 UiEventData *eventdata = malloc(sizeof(UiEventData)); |
| 68 eventdata->callback = args.onclick; |
68 eventdata->callback = args->onclick; |
| 69 eventdata->userdata = args.onclickdata; |
69 eventdata->userdata = args->onclickdata; |
| 70 eventdata->obj = obj; |
70 eventdata->obj = obj; |
| 71 eventdata->value = 0; |
71 eventdata->value = 0; |
| 72 XtAddCallback( |
72 XtAddCallback( |
| 73 button, |
73 button, |
| 74 XmNactivateCallback, |
74 XmNactivateCallback, |
| 106 Widget parent = ctn->prepare(ctn, xargs, &n); |
106 Widget parent = ctn->prepare(ctn, xargs, &n); |
| 107 XtSetArg(xargs[n], XmNfillOnSelect, True); n++; |
107 XtSetArg(xargs[n], XmNfillOnSelect, True); n++; |
| 108 XtSetArg(xargs[n], XmNindicatorOn, False); n++; |
108 XtSetArg(xargs[n], XmNindicatorOn, False); n++; |
| 109 |
109 |
| 110 XmString label = NULL; |
110 XmString label = NULL; |
| 111 if(args.label) { |
111 if(args->label) { |
| 112 label = XmStringCreateLocalized((char*)args.label); |
112 label = XmStringCreateLocalized((char*)args->label); |
| 113 XtSetArg(xargs[n], XmNlabelString, label); n++; |
113 XtSetArg(xargs[n], XmNlabelString, label); n++; |
| 114 } |
114 } |
| 115 |
115 |
| 116 char *name = args.name ? (char*)args.name : "togglebutton"; |
116 char *name = args->name ? (char*)args->name : "togglebutton"; |
| 117 Widget button = XmCreateToggleButton(parent, name, xargs, n); |
117 Widget button = XmCreateToggleButton(parent, name, xargs, n); |
| 118 XtManageChild(button); |
118 XtManageChild(button); |
| 119 ctn->add(ctn, button); |
119 ctn->add(ctn, button); |
| 120 |
120 |
| 121 ui_set_widget_groups(obj->ctx, button, args.groups); |
121 ui_set_widget_groups(obj->ctx, button, args->groups); |
| 122 |
122 |
| 123 ui_bind_togglebutton(obj, button, args.varname, args.value, args.onchange, args.onchangedata, args.enable_group); |
123 ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_group); |
| 124 |
124 |
| 125 XmStringFree(label); |
125 XmStringFree(label); |
| 126 return button; |
126 return button; |
| 127 } |
127 } |
| 128 |
128 |
| 129 UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { |
129 UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { |
| 130 Arg xargs[16]; |
130 Arg xargs[16]; |
| 131 int n = 0; |
131 int n = 0; |
| 132 |
132 |
| 133 UiContainerPrivate *ctn = ui_obj_container(obj); |
133 UiContainerPrivate *ctn = ui_obj_container(obj); |
| 134 UI_APPLY_LAYOUT(ctn->layout, args); |
134 UI_APPLY_LAYOUT(ctn->layout, args); |
| 135 |
135 |
| 136 Widget parent = ctn->prepare(ctn, xargs, &n); |
136 Widget parent = ctn->prepare(ctn, xargs, &n); |
| 137 |
137 |
| 138 XmString label = NULL; |
138 XmString label = NULL; |
| 139 if(args.label) { |
139 if(args->label) { |
| 140 label = XmStringCreateLocalized((char*)args.label); |
140 label = XmStringCreateLocalized((char*)args->label); |
| 141 XtSetArg(xargs[n], XmNlabelString, label); n++; |
141 XtSetArg(xargs[n], XmNlabelString, label); n++; |
| 142 } |
142 } |
| 143 |
143 |
| 144 char *name = args.name ? (char*)args.name : "button"; |
144 char *name = args->name ? (char*)args->name : "button"; |
| 145 Widget button = XmCreateToggleButton(parent, name, xargs, n); |
145 Widget button = XmCreateToggleButton(parent, name, xargs, n); |
| 146 XtManageChild(button); |
146 XtManageChild(button); |
| 147 ctn->add(ctn, button); |
147 ctn->add(ctn, button); |
| 148 |
148 |
| 149 ui_set_widget_groups(obj->ctx, button, args.groups); |
149 ui_set_widget_groups(obj->ctx, button, args->groups); |
| 150 |
150 |
| 151 ui_bind_togglebutton(obj, button, args.varname, args.value, args.onchange, args.onchangedata, args.enable_group); |
151 ui_bind_togglebutton(obj, button, args->varname, args->value, args->onchange, args->onchangedata, args->enable_group); |
| 152 |
152 |
| 153 XmStringFree(label); |
153 XmStringFree(label); |
| 154 return button; |
154 return button; |
| 155 } |
155 } |
| 156 |
156 |
| 157 UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs args) { |
157 UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs *args) { |
| 158 return ui_checkbox_create(obj, args); |
158 return ui_checkbox_create(obj, args); |
| 159 } |
159 } |
| 160 |
160 |
| 161 static void togglebutton_changed(Widget w, UiVarEventData *event, XmToggleButtonCallbackStruct *tb) { |
161 static void togglebutton_changed(Widget w, UiVarEventData *event, XmToggleButtonCallbackStruct *tb) { |
| 162 if(event->value > 0) { |
162 if(event->value > 0) { |
| 341 XmNdestroyCallback, |
343 XmNdestroyCallback, |
| 342 (XtCallbackProc)ui_destroy_eventdata, |
344 (XtCallbackProc)ui_destroy_eventdata, |
| 343 event); |
345 event); |
| 344 } |
346 } |
| 345 |
347 |
| 346 UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) { |
348 UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs *args) { |
| 347 Arg xargs[16]; |
349 Arg xargs[16]; |
| 348 int n = 0; |
350 int n = 0; |
| 349 |
351 |
| 350 UiContainerPrivate *ctn = ui_obj_container(obj); |
352 UiContainerPrivate *ctn = ui_obj_container(obj); |
| 351 UI_APPLY_LAYOUT(ctn->layout, args); |
353 UI_APPLY_LAYOUT(ctn->layout, args); |
| 352 |
354 |
| 353 Widget parent = ctn->prepare(ctn, xargs, &n); |
355 Widget parent = ctn->prepare(ctn, xargs, &n); |
| 354 XtSetArg(xargs[n], XmNindicatorType, XmONE_OF_MANY_ROUND); n++; |
356 XtSetArg(xargs[n], XmNindicatorType, XmONE_OF_MANY_ROUND); n++; |
| 355 XmString label = NULL; |
357 XmString label = NULL; |
| 356 if(args.label) { |
358 if(args->label) { |
| 357 label = XmStringCreateLocalized((char*)args.label); |
359 label = XmStringCreateLocalized((char*)args->label); |
| 358 XtSetArg(xargs[n], XmNlabelString, label); n++; |
360 XtSetArg(xargs[n], XmNlabelString, label); n++; |
| 359 } |
361 } |
| 360 |
362 |
| 361 char *name = args.name ? (char*)args.name : "button"; |
363 char *name = args->name ? (char*)args->name : "button"; |
| 362 Widget button = XmCreateToggleButton(parent, name, xargs, n); |
364 Widget button = XmCreateToggleButton(parent, name, xargs, n); |
| 363 XtManageChild(button); |
365 XtManageChild(button); |
| 364 ctn->add(ctn, button); |
366 ctn->add(ctn, button); |
| 365 |
367 |
| 366 ui_set_widget_groups(obj->ctx, button, args.groups); |
368 ui_set_widget_groups(obj->ctx, button, args->groups); |
| 367 |
369 |
| 368 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); |
370 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); |
| 369 if(var) { |
371 if(var) { |
| 370 UiInteger *value = var->value; |
372 UiInteger *value = var->value; |
| 371 CxList *rb = value->obj; |
373 CxList *rb = value->obj; |
| 372 if(!rb) { |
374 if(!rb) { |
| 373 // first button in the radiobutton group |
375 // first button in the radiobutton group |
| 394 |
396 |
| 395 // the radio button needs to handle change events to update all |
397 // the radio button needs to handle change events to update all |
| 396 // other buttons in the radio button group |
398 // other buttons in the radio button group |
| 397 UiVarEventData *event = malloc(sizeof(UiVarEventData)); |
399 UiVarEventData *event = malloc(sizeof(UiVarEventData)); |
| 398 event->obj = obj; |
400 event->obj = obj; |
| 399 event->callback = args.onchange; |
401 event->callback = args->onchange; |
| 400 event->userdata = args.onchangedata; |
402 event->userdata = args->onchangedata; |
| 401 event->observers = NULL; |
403 event->observers = NULL; |
| 402 event->var = var; |
404 event->var = var; |
| 403 event->value = args.enable_group; |
405 event->value = args->enable_group; |
| 404 XtAddCallback( |
406 XtAddCallback( |
| 405 button, |
407 button, |
| 406 XmNvalueChangedCallback, |
408 XmNvalueChangedCallback, |
| 407 (XtCallbackProc)radiobutton_changed, |
409 (XtCallbackProc)radiobutton_changed, |
| 408 event); |
410 event); |