ui/motif/text.c

changeset 155
b907d8059290
parent 154
8a4451fcb736
child 176
bc63cb601f6d
equal deleted inserted replaced
154:8a4451fcb736 155:b907d8059290
30 #include <stdlib.h> 30 #include <stdlib.h>
31 31
32 #include "text.h" 32 #include "text.h"
33 #include "container.h" 33 #include "container.h"
34 34
35 UIWIDGET ui_textarea(UiObject *obj, UiText *value) { 35
36 UIWIDGET ui_textarea_var(UiObject *obj, UiVar *var) {
36 UiContainer *ct = uic_get_current_container(obj); 37 UiContainer *ct = uic_get_current_container(obj);
37 int n = 0; 38 int n = 0;
38 Arg args[16]; 39 Arg args[16];
39 40
40 //XtSetArg(args[n], XmNeditable, TRUE); 41 //XtSetArg(args[n], XmNeditable, TRUE);
57 XmNmotionVerifyCallback, 58 XmNmotionVerifyCallback,
58 (XtCallbackProc)ui_text_selection_callback, 59 (XtCallbackProc)ui_text_selection_callback,
59 uitext); 60 uitext);
60 61
61 // bind value 62 // bind value
62 if(value) { 63 if(var->value) {
64 UiText *value = var->value;
63 if(value->value.ptr) { 65 if(value->value.ptr) {
64 XmTextSetString(text_area, value->value.ptr); 66 XmTextSetString(text_area, value->value.ptr);
65 value->value.free(value->value.ptr); 67 value->value.free(value->value.ptr);
66 } 68 }
67 69
82 84
83 XtAddCallback( 85 XtAddCallback(
84 text_area, 86 text_area,
85 XmNmodifyVerifyCallback, 87 XmNmodifyVerifyCallback,
86 (XtCallbackProc)ui_text_modify_callback, 88 (XtCallbackProc)ui_text_modify_callback,
87 value); 89 var);
88 } 90 }
89 91
90 return text_area; 92 return text_area;
93 }
94
95 UIWIDGET ui_textarea(UiObject *obj, UiText *value) {
96 UiVar *var = malloc(sizeof(UiVar));
97 var->value = value;
98 var->type = UI_VAR_SPECIAL;
99 return ui_textarea_var(obj, var);
91 } 100 }
92 101
93 UIWIDGET ui_textarea_nv(UiObject *obj, char *varname) { 102 UIWIDGET ui_textarea_nv(UiObject *obj, char *varname) {
94 UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_TEXT); 103 UiVar *var = uic_create_var(obj->ctx, varname, UI_VAR_TEXT);
95 if(var) { 104 if(var) {
96 UiText *value = var->value; 105 return ui_textarea_var(obj, var);
97 return ui_textarea(obj, value);
98 } else { 106 } else {
99 // TODO: error 107 // TODO: error
100 } 108 }
101 return NULL; 109 return NULL;
102 } 110 }
110 text->value.free = (ui_freefunc)XtFree; 118 text->value.free = (ui_freefunc)XtFree;
111 return str; 119 return str;
112 } 120 }
113 121
114 void ui_textarea_set(UiText *text, char *str) { 122 void ui_textarea_set(UiText *text, char *str) {
123 XmTextSetString(text->obj, str);
115 if(text->value.ptr) { 124 if(text->value.ptr) {
116 text->value.free(text->value.ptr); 125 text->value.free(text->value.ptr);
117 } 126 }
118 text->value.ptr = NULL; 127 text->value.ptr = NULL;
119 XmTextSetString(text->obj, str);
120 } 128 }
121 129
122 char* ui_textarea_getsubstr(UiText *text, int begin, int end) { 130 char* ui_textarea_getsubstr(UiText *text, int begin, int end) {
123 if(text->value.ptr) { 131 if(text->value.ptr) {
124 text->value.free(text->value.ptr); 132 text->value.free(text->value.ptr);
130 text->value.free = (ui_freefunc)XtFree; 138 text->value.free = (ui_freefunc)XtFree;
131 return str; 139 return str;
132 } 140 }
133 141
134 void ui_textarea_insert(UiText *text, int pos, char *str) { 142 void ui_textarea_insert(UiText *text, int pos, char *str) {
143 text->value.ptr = NULL;
144 XmTextInsert(text->obj, pos, str);
135 if(text->value.ptr) { 145 if(text->value.ptr) {
136 text->value.free(text->value.ptr); 146 text->value.free(text->value.ptr);
137 } 147 }
138 text->value.ptr = NULL;
139 XmTextInsert(text->obj, pos, str);
140 } 148 }
141 149
142 void ui_textarea_setposition(UiText *text, int pos) { 150 void ui_textarea_setposition(UiText *text, int pos) {
143 XmTextSetInsertionPosition(text->obj, pos); 151 XmTextSetInsertionPosition(text->obj, pos);
144 } 152 }
207 } 215 }
208 } 216 }
209 textarea->last_selection_state = sel; 217 textarea->last_selection_state = sel;
210 } 218 }
211 219
212 void ui_text_modify_callback(Widget widget, UiText *value, XtPointer data) { 220 void ui_text_modify_callback(Widget widget, UiVar *var, XtPointer data) {
221 UiText *value = var->value;
222 if(!value->obj) {
223 // TODO: bug, fix
224 return;
225 }
226 if(!value->undomgr) {
227 value->undomgr = ui_create_undomgr();
228 }
229
213 XmTextVerifyCallbackStruct *txv = (XmTextVerifyCallbackStruct*)data; 230 XmTextVerifyCallbackStruct *txv = (XmTextVerifyCallbackStruct*)data;
214 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;
215 UiUndoMgr *mgr = value->undomgr; 232 UiUndoMgr *mgr = value->undomgr;
216 if(!mgr->event) { 233 if(!mgr->event) {
217 return; 234 return;

mercurial