| 36 #include <cx/string.h> |
36 #include <cx/string.h> |
| 37 |
37 |
| 38 |
38 |
| 39 /* ------------------------------ Text Area ------------------------------ */ |
39 /* ------------------------------ Text Area ------------------------------ */ |
| 40 |
40 |
| 41 UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { |
41 UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs *args) { |
| 42 Arg xargs[16]; |
42 Arg xargs[16]; |
| 43 int n = 0; |
43 int n = 0; |
| 44 |
44 |
| 45 XtSetArg(xargs[n], XmNeditMode, XmMULTI_LINE_EDIT); n++; |
45 XtSetArg(xargs[n], XmNeditMode, XmMULTI_LINE_EDIT); n++; |
| 46 |
46 |
| 47 UiContainerPrivate *ctn = ui_obj_container(obj); |
47 UiContainerPrivate *ctn = ui_obj_container(obj); |
| 48 UI_APPLY_LAYOUT(ctn->layout, args); |
48 UI_APPLY_LAYOUT(ctn->layout, args); |
| 49 |
49 |
| 50 Widget parent = ctn->prepare(ctn, xargs, &n); |
50 Widget parent = ctn->prepare(ctn, xargs, &n); |
| 51 char *name = args.name ? (char*)args.name : "textarea"; |
51 char *name = args->name ? (char*)args->name : "textarea"; |
| 52 XtSetArg(xargs[n], XmNwidth, 100); n++; |
52 XtSetArg(xargs[n], XmNwidth, 100); n++; |
| 53 Widget widget = XmCreateScrolledText(parent, name, xargs, n); |
53 Widget widget = XmCreateScrolledText(parent, name, xargs, n); |
| 54 XtManageChild(widget); |
54 XtManageChild(widget); |
| 55 |
55 |
| 56 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_TEXT); |
56 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_TEXT); |
| 57 |
57 |
| 58 UiTextArea *textarea = malloc(sizeof(UiTextArea)); |
58 UiTextArea *textarea = malloc(sizeof(UiTextArea)); |
| 59 memset(textarea, 0, sizeof(UiTextArea)); |
59 memset(textarea, 0, sizeof(UiTextArea)); |
| 60 textarea->obj = obj; |
60 textarea->obj = obj; |
| 61 textarea->var = var; |
61 textarea->var = var; |
| 66 XmTextSetString(widget, value->value.ptr); |
66 XmTextSetString(widget, value->value.ptr); |
| 67 value->value.free(value->value.ptr); |
67 value->value.free(value->value.ptr); |
| 68 value->value.ptr = NULL; |
68 value->value.ptr = NULL; |
| 69 } |
69 } |
| 70 |
70 |
| |
71 value->save = ui_textarea_save; |
| |
72 value->restore = ui_textarea_restore; |
| |
73 value->destroy = ui_textarea_text_destroy; |
| 71 value->set = ui_textarea_set; |
74 value->set = ui_textarea_set; |
| 72 value->get = ui_textarea_get; |
75 value->get = ui_textarea_get; |
| 73 value->getsubstr = ui_textarea_getsubstr; |
76 value->getsubstr = ui_textarea_getsubstr; |
| 74 value->insert = ui_textarea_insert; |
77 value->insert = ui_textarea_insert; |
| 75 value->setposition = ui_textarea_setposition; |
78 value->setposition = ui_textarea_setposition; |
| 77 value->selection = ui_textarea_selection; |
80 value->selection = ui_textarea_selection; |
| 78 value->length = ui_textarea_length; |
81 value->length = ui_textarea_length; |
| 79 value->value.ptr = NULL; |
82 value->value.ptr = NULL; |
| 80 value->obj = widget; |
83 value->obj = widget; |
| 81 |
84 |
| 82 if(!value->undomgr) { |
85 if(!value->data2) { |
| 83 value->undomgr = ui_create_undomgr(); |
86 value->data2 = ui_create_undomgr(); |
| 84 } |
87 } |
| 85 |
88 |
| 86 XtAddCallback( |
89 XtAddCallback( |
| 87 widget, |
90 widget, |
| 88 XmNmodifyVerifyCallback, |
91 XmNmodifyVerifyCallback, |
| 99 } |
102 } |
| 100 char *str = XmTextGetString(text->obj); |
103 char *str = XmTextGetString(text->obj); |
| 101 text->value.ptr = str; |
104 text->value.ptr = str; |
| 102 text->value.free = (ui_freefunc)XtFree; |
105 text->value.free = (ui_freefunc)XtFree; |
| 103 return str; |
106 return str; |
| |
107 } |
| |
108 |
| |
109 void ui_textarea_save(UiText *text) { |
| |
110 (void)ui_textarea_get(text); |
| |
111 } |
| |
112 |
| |
113 void ui_textarea_restore(UiText *text) { |
| |
114 if(text->value.ptr) { |
| |
115 ui_textarea_set(text, text->value.ptr); |
| |
116 } |
| |
117 } |
| |
118 |
| |
119 void ui_textarea_text_destroy(UiText *text) { |
| |
120 if(text->value.free) { |
| |
121 text->value.free(text->value.ptr); |
| |
122 } |
| |
123 if(text->data2) { |
| |
124 ui_destroy_undomgr(text->data2); |
| |
125 } |
| 104 } |
126 } |
| 105 |
127 |
| 106 void ui_textarea_set(UiText *text, const char *str) { |
128 void ui_textarea_set(UiText *text, const char *str) { |
| 107 XmTextSetString(text->obj, (char*)str); |
129 XmTextSetString(text->obj, (char*)str); |
| 108 if(text->value.ptr) { |
130 if(text->value.ptr) { |
| 199 UiText *value = var->value; |
221 UiText *value = var->value; |
| 200 if(!value->obj) { |
222 if(!value->obj) { |
| 201 // TODO: bug, fix |
223 // TODO: bug, fix |
| 202 return; |
224 return; |
| 203 } |
225 } |
| 204 if(!value->undomgr) { |
226 if(!value->data2) { |
| 205 value->undomgr = ui_create_undomgr(); |
227 value->data2 = ui_create_undomgr(); |
| 206 } |
228 } |
| 207 |
229 |
| 208 XmTextVerifyCallbackStruct *txv = (XmTextVerifyCallbackStruct*)data; |
230 XmTextVerifyCallbackStruct *txv = (XmTextVerifyCallbackStruct*)data; |
| 209 int type = txv->text->length > 0 ? UI_TEXTBUF_INSERT : UI_TEXTBUF_DELETE; |
231 int type = txv->text->length > 0 ? UI_TEXTBUF_INSERT : UI_TEXTBUF_DELETE; |
| 210 UiUndoMgr *mgr = value->undomgr; |
232 UiUndoMgr *mgr = value->data2; |
| 211 if(!mgr->event) { |
233 if(!mgr->event) { |
| 212 return; |
234 return; |
| 213 } |
235 } |
| 214 |
236 |
| 215 char *text = txv->text->ptr; |
237 char *text = txv->text->ptr; |
| 359 |
381 |
| 360 |
382 |
| 361 |
383 |
| 362 /* ------------------------------ Text Field ------------------------------ */ |
384 /* ------------------------------ Text Field ------------------------------ */ |
| 363 |
385 |
| 364 static UIWIDGET create_textfield(UiObject *obj, UiTextFieldArgs args, int frameless, int password) { |
386 static UIWIDGET create_textfield(UiObject *obj, UiTextFieldArgs *args, int frameless, int password) { |
| 365 Arg xargs[16]; |
387 Arg xargs[16]; |
| 366 int n = 0; |
388 int n = 0; |
| 367 |
389 |
| 368 if(frameless) { |
390 if(frameless) { |
| 369 XtSetArg(xargs[n], XmNshadowThickness, 0); |
391 XtSetArg(xargs[n], XmNshadowThickness, 0); |
| 375 |
397 |
| 376 UiContainerPrivate *ctn = ui_obj_container(obj); |
398 UiContainerPrivate *ctn = ui_obj_container(obj); |
| 377 UI_APPLY_LAYOUT(ctn->layout, args); |
399 UI_APPLY_LAYOUT(ctn->layout, args); |
| 378 |
400 |
| 379 Widget parent = ctn->prepare(ctn, xargs, &n); |
401 Widget parent = ctn->prepare(ctn, xargs, &n); |
| 380 char *name = args.name ? (char*)args.name : "textfield"; |
402 char *name = args->name ? (char*)args->name : "textfield"; |
| 381 Widget textfield = XmCreateTextField(parent, name, xargs, n); |
403 Widget textfield = XmCreateTextField(parent, name, xargs, n); |
| 382 XtManageChild(textfield); |
404 XtManageChild(textfield); |
| 383 |
405 |
| 384 ui_set_widget_groups(obj->ctx, textfield, args.groups); |
406 ui_set_widget_groups(obj->ctx, textfield, args->groups); |
| 385 |
407 |
| 386 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_STRING); |
408 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING); |
| 387 if(var) { |
409 if(var) { |
| 388 UiString *value = (UiString*)var->value; |
410 UiString *value = (UiString*)var->value; |
| 389 value->obj = textfield; |
411 value->obj = textfield; |
| 390 value->get = ui_textfield_get; |
412 value->get = ui_textfield_get; |
| 391 value->set = ui_textfield_set; |
413 value->set = ui_textfield_set; |
| 396 } |
418 } |
| 397 |
419 |
| 398 return textfield; |
420 return textfield; |
| 399 } |
421 } |
| 400 |
422 |
| 401 UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs args) { |
423 UIWIDGET ui_textfield_create(UiObject *obj, UiTextFieldArgs *args) { |
| 402 return create_textfield(obj, args, FALSE, FALSE); |
424 return create_textfield(obj, args, FALSE, FALSE); |
| 403 } |
425 } |
| 404 |
426 |
| 405 UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs args) { |
427 UIWIDGET ui_frameless_textfield_create(UiObject* obj, UiTextFieldArgs *args) { |
| 406 return create_textfield(obj, args, TRUE, FALSE); |
428 return create_textfield(obj, args, TRUE, FALSE); |
| 407 } |
429 } |
| 408 |
430 |
| 409 UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs args) { |
431 UIWIDGET ui_passwordfield_create(UiObject* obj, UiTextFieldArgs *args) { |
| 410 return create_textfield(obj, args, FALSE, FALSE); |
432 return create_textfield(obj, args, FALSE, FALSE); |
| 411 } |
433 } |
| 412 |
434 |
| 413 char* ui_textfield_get(UiString *str) { |
435 char* ui_textfield_get(UiString *str) { |
| 414 str->value.free(str->value.ptr); |
436 if(str->value.free) { |
| |
437 str->value.free(str->value.ptr); |
| |
438 } |
| 415 char *value = XmTextFieldGetString(str->obj); |
439 char *value = XmTextFieldGetString(str->obj); |
| 416 str->value.ptr = value; |
440 str->value.ptr = value; |
| 417 str->value.free = (ui_freefunc)XtFree; |
441 str->value.free = (ui_freefunc)XtFree; |
| 418 return value; |
442 return value; |
| 419 } |
443 } |
| 420 |
444 |
| 421 void ui_textfield_set(UiString *str, const char *value) { |
445 void ui_textfield_set(UiString *str, const char *value) { |
| 422 XmTextFieldSetString(str->obj, (void*)value); |
446 XmTextFieldSetString(str->obj, (void*)value); |
| |
447 if(str->value.free) { |
| |
448 str->value.free(str->value.ptr); |
| |
449 } |
| 423 str->value.ptr = NULL; |
450 str->value.ptr = NULL; |
| 424 str->value.free(str->value.ptr); |
|
| 425 } |
451 } |
| 426 |
452 |
| 427 |
453 |
| 428 |
454 |
| 429 |
455 |
| 933 UiEvent evt; |
959 UiEvent evt; |
| 934 evt.obj = event->obj; |
960 evt.obj = event->obj; |
| 935 evt.window = evt.obj->window; |
961 evt.window = evt.obj->window; |
| 936 evt.document = evt.obj->ctx->document; |
962 evt.document = evt.obj->ctx->document; |
| 937 evt.eventdata = path; |
963 evt.eventdata = path; |
| |
964 evt.eventdatatype = UI_EVENT_DATA_STRING; |
| 938 evt.intval = index; |
965 evt.intval = index; |
| 939 event->callback(&evt, event->userdata); |
966 event->callback(&evt, event->userdata); |
| 940 } |
967 } |
| 941 |
968 |
| 942 UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs args) { |
969 UIWIDGET ui_path_textfield_create(UiObject* obj, UiPathTextFieldArgs *args) { |
| 943 Arg xargs[16]; |
970 Arg xargs[16]; |
| 944 int n = 0; |
971 int n = 0; |
| 945 |
972 |
| 946 UiContainerPrivate *ctn = ui_obj_container(obj); |
973 UiContainerPrivate *ctn = ui_obj_container(obj); |
| 947 UI_APPLY_LAYOUT(ctn->layout, args); |
974 UI_APPLY_LAYOUT(ctn->layout, args); |
| 949 Widget parent = ctn->prepare(ctn, xargs, &n); |
976 Widget parent = ctn->prepare(ctn, xargs, &n); |
| 950 // TODO: name |
977 // TODO: name |
| 951 |
978 |
| 952 |
979 |
| 953 PathBar *pathbar = CreatePathBar(parent, xargs, n); |
980 PathBar *pathbar = CreatePathBar(parent, xargs, n); |
| 954 if(!args.getpathelm) { |
981 if(!args->getpathelm) { |
| 955 pathbar->getpathelm= default_pathelm_func; |
982 pathbar->getpathelm= default_pathelm_func; |
| 956 } else { |
983 } else { |
| 957 pathbar->getpathelm = args.getpathelm; |
984 pathbar->getpathelm = args->getpathelm; |
| 958 pathbar->getpathelmdata = args.getpathelmdata; |
985 pathbar->getpathelmdata = args->getpathelmdata; |
| 959 } |
986 } |
| 960 |
987 |
| 961 |
988 |
| 962 XtManageChild(pathbar->widget); |
989 XtManageChild(pathbar->widget); |
| 963 ctn->add(ctn, pathbar->widget); |
990 ctn->add(ctn, pathbar->widget); |
| 964 |
991 |
| 965 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_STRING); |
992 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_STRING); |
| 966 if (var) { |
993 if (var) { |
| 967 UiString* value = (UiString*)var->value; |
994 UiString* value = (UiString*)var->value; |
| 968 value->obj = pathbar; |
995 value->obj = pathbar; |
| 969 value->get = ui_path_textfield_get; |
996 value->get = ui_path_textfield_get; |
| 970 value->set = ui_path_textfield_set; |
997 value->set = ui_path_textfield_set; |
| 974 ui_string_set(value, str); |
1001 ui_string_set(value, str); |
| 975 free(str); |
1002 free(str); |
| 976 } |
1003 } |
| 977 } |
1004 } |
| 978 |
1005 |
| 979 if(args.onactivate) { |
1006 if(args->onactivate) { |
| 980 UiEventData *eventdata = malloc(sizeof(UiEventData)); |
1007 UiEventData *eventdata = malloc(sizeof(UiEventData)); |
| 981 eventdata->callback = args.onactivate; |
1008 eventdata->callback = args->onactivate; |
| 982 eventdata->userdata = args.onactivatedata; |
1009 eventdata->userdata = args->onactivatedata; |
| 983 eventdata->obj = obj; |
1010 eventdata->obj = obj; |
| 984 eventdata->value = 0; |
1011 eventdata->value = 0; |
| 985 |
1012 |
| 986 pathbar->updateDir = pathbar_activate; |
1013 pathbar->updateDir = pathbar_activate; |
| 987 pathbar->updateDirData = eventdata; |
1014 pathbar->updateDirData = eventdata; |