ui/motif/text.c

changeset 108
77254bd6dccb
parent 103
6606616eca9f
child 112
c3f2f16fa4b8
equal deleted inserted replaced
107:b34bd1557c6c 108:77254bd6dccb
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;
305 free(op); 327 free(op);
306 } 328 }
307 329
308 330
309 void ui_text_undo(UiText *value) { 331 void ui_text_undo(UiText *value) {
310 UiUndoMgr *mgr = value->undomgr; 332 UiUndoMgr *mgr = value->data2;
311 333
312 if(mgr->cur) { 334 if(mgr->cur) {
313 UiTextBufOp *op = mgr->cur; 335 UiTextBufOp *op = mgr->cur;
314 mgr->event = 0; 336 mgr->event = 0;
315 switch(op->type) { 337 switch(op->type) {
326 mgr->cur = mgr->cur->prev; 348 mgr->cur = mgr->cur->prev;
327 } 349 }
328 } 350 }
329 351
330 void ui_text_redo(UiText *value) { 352 void ui_text_redo(UiText *value) {
331 UiUndoMgr *mgr = value->undomgr; 353 UiUndoMgr *mgr = value->data2;
332 354
333 UiTextBufOp *elm = NULL; 355 UiTextBufOp *elm = NULL;
334 if(mgr->cur) { 356 if(mgr->cur) {
335 if(mgr->cur->next) { 357 if(mgr->cur->next) {
336 elm = mgr->cur->next; 358 elm = mgr->cur->next;
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;

mercurial