ui/gtk/text.c

changeset 486
a5f3abf8b9d1
parent 402
96a055be7f0b
child 487
077c5029aaee
equal deleted inserted replaced
485:c584149b22f0 486:a5f3abf8b9d1
60 } 60 }
61 textview->last_selection_state = sel; 61 textview->last_selection_state = sel;
62 } 62 }
63 } 63 }
64 64
65 static void textarea_set_text_funcs(UiText *value) {
66
67 }
68
69 #if GTK_MAJOR_VERSION == 2
70 static void textarea_set_undomgr(GtkWidget *text_area, UiText *value) {
71 GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_area));
72
73 if(!value->data2) {
74 value->data2 = ui_create_undomgr();
75 }
76
77 g_signal_connect(
78 buf,
79 "changed",
80 G_CALLBACK(ui_textbuf_changed),
81 uitext);
82
83 // register undo manager
84 g_signal_connect(
85 buf,
86 "insert-text",
87 G_CALLBACK(ui_textbuf_insert),
88 var);
89 g_signal_connect(
90 buf,
91 "delete-range",
92 G_CALLBACK(ui_textbuf_delete),
93 var);
94 g_signal_connect(
95 buf,
96 "mark-set",
97 G_CALLBACK(selection_handler),
98 uitext);
99 }
100 #endif
101
65 UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) { 102 UIWIDGET ui_textarea_create(UiObject *obj, UiTextAreaArgs args) {
66 UiObject* current = uic_current_obj(obj); 103 UiObject* current = uic_current_obj(obj);
67 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_TEXT); 104 UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_TEXT);
68 105
69 GtkWidget *text_area = gtk_text_view_new(); 106 GtkWidget *text_area = gtk_text_view_new();
112 current->container->add(current->container, scroll_area, TRUE); 149 current->container->add(current->container, scroll_area, TRUE);
113 150
114 // bind value 151 // bind value
115 if(var) { 152 if(var) {
116 UiText *value = var->value; 153 UiText *value = var->value;
117 GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_area)); 154 GtkTextBuffer *buf;
118 155 if(value->data1 && value->datatype == UI_TEXT_TYPE_BUFFER) {
119 if(value->value.ptr) { 156 buf = value->data1;
120 gtk_text_buffer_set_text(buf, value->value.ptr, -1); 157 } else {
121 value->value.free(value->value.ptr); 158 buf = gtk_text_buffer_new(NULL);
122 } 159 if(value->value.ptr) {
123 160 gtk_text_buffer_set_text(buf, value->value.ptr, -1);
161 value->value.free(value->value.ptr);
162 }
163 }
164 gtk_text_view_set_buffer(GTK_TEXT_VIEW(text_area), buf);
165 value->save = ui_textarea_save;
166 value->restore = ui_textarea_restore;
167 value->destroy = ui_textarea_text_destroy;
124 value->get = ui_textarea_get; 168 value->get = ui_textarea_get;
125 value->set = ui_textarea_set; 169 value->set = ui_textarea_set;
126 value->getsubstr = ui_textarea_getsubstr; 170 value->getsubstr = ui_textarea_getsubstr;
127 value->insert = ui_textarea_insert; 171 value->insert = ui_textarea_insert;
128 value->setposition = ui_textarea_setposition; 172 value->setposition = ui_textarea_setposition;
129 value->position = ui_textarea_position; 173 value->position = ui_textarea_position;
130 value->selection = ui_textarea_selection; 174 value->selection = ui_textarea_selection;
131 value->length = ui_textarea_length; 175 value->length = ui_textarea_length;
132 value->remove = ui_textarea_remove; 176 value->remove = ui_textarea_remove;
177 value->data1 = buf;
178 value->data2 = NULL;
179 value->datatype == UI_TEXT_TYPE_BUFFER;
133 value->value.ptr = NULL; 180 value->value.ptr = NULL;
134 value->value.free = NULL; 181 value->value.free = NULL;
135 value->obj = buf;
136 if(!value->undomgr) {
137 value->undomgr = ui_create_undomgr();
138 }
139 182
140 g_signal_connect( 183 #if GTK_MAJOR_VERSION == 2
141 buf, 184 textarea_set_undomgr(text_area, value);
142 "changed", 185 #endif
143 G_CALLBACK(ui_textbuf_changed),
144 uitext);
145
146 // register undo manager
147 g_signal_connect(
148 buf,
149 "insert-text",
150 G_CALLBACK(ui_textbuf_insert),
151 var);
152 g_signal_connect(
153 buf,
154 "delete-range",
155 G_CALLBACK(ui_textbuf_delete),
156 var);
157 g_signal_connect(
158 buf,
159 "mark-set",
160 G_CALLBACK(selection_handler),
161 uitext);
162 } 186 }
163 187
164 return scroll_area; 188 return scroll_area;
165 } 189 }
166 190
171 free(textarea); 195 free(textarea);
172 } 196 }
173 197
174 UIWIDGET ui_textarea_gettextwidget(UIWIDGET textarea) { 198 UIWIDGET ui_textarea_gettextwidget(UIWIDGET textarea) {
175 return SCROLLEDWINDOW_GET_CHILD(textarea); 199 return SCROLLEDWINDOW_GET_CHILD(textarea);
200 }
201
202 void ui_textarea_save(UiText *text) {
203 // NOOP
204 }
205
206 void ui_textarea_restore(UiText *text) {
207 GtkWidget *textarea = text->obj;
208 gtk_text_view_set_buffer(GTK_TEXT_VIEW(textarea), text->data1);
209 }
210
211 void ui_textarea_text_destroy(UiText *text) {
212 GtkTextBuffer *buf = text->data1;
213 g_object_unref(buf);
176 } 214 }
177 215
178 char* ui_textarea_get(UiText *text) { 216 char* ui_textarea_get(UiText *text) {
179 if(text->value.ptr) { 217 if(text->value.ptr) {
180 text->value.free(text->value.ptr); 218 text->value.free(text->value.ptr);
297 int length, 335 int length,
298 void *data) 336 void *data)
299 { 337 {
300 UiVar *var = data; 338 UiVar *var = data;
301 UiText *value = var->value; 339 UiText *value = var->value;
302 if(!value->undomgr) { 340 if(!value->data2) {
303 value->undomgr = ui_create_undomgr(); 341 value->data2 = ui_create_undomgr();
304 } 342 }
305 UiUndoMgr *mgr = value->undomgr; 343 UiUndoMgr *mgr = value->data2;
306 if(!mgr->event) { 344 if(!mgr->event) {
307 return; 345 return;
308 } 346 }
309 347
310 if(mgr->cur) { 348 if(mgr->cur) {
369 GtkTextIter *end, 407 GtkTextIter *end,
370 void *data) 408 void *data)
371 { 409 {
372 UiVar *var = data; 410 UiVar *var = data;
373 UiText *value = var->value; 411 UiText *value = var->value;
374 if(!value->undomgr) { 412 if(!value->data2) {
375 value->undomgr = ui_create_undomgr(); 413 value->data2 = ui_create_undomgr();
376 } 414 }
377 UiUndoMgr *mgr = value->undomgr; 415 UiUndoMgr *mgr = value->data2;
378 if(!mgr->event) { 416 if(!mgr->event) {
379 return; 417 return;
380 } 418 }
381 419
382 if(mgr->cur) { 420 if(mgr->cur) {
467 505
468 return 0; 506 return 0;
469 } 507 }
470 508
471 void ui_text_undo(UiText *value) { 509 void ui_text_undo(UiText *value) {
472 UiUndoMgr *mgr = value->undomgr; 510 UiUndoMgr *mgr = value->data2;
473 511
474 if(mgr->cur) { 512 if(mgr->cur) {
475 UiTextBufOp *op = mgr->cur; 513 UiTextBufOp *op = mgr->cur;
476 mgr->event = 0; 514 mgr->event = 0;
477 switch(op->type) { 515 switch(op->type) {
496 mgr->cur = mgr->cur->prev; 534 mgr->cur = mgr->cur->prev;
497 } 535 }
498 } 536 }
499 537
500 void ui_text_redo(UiText *value) { 538 void ui_text_redo(UiText *value) {
501 UiUndoMgr *mgr = value->undomgr; 539 UiUndoMgr *mgr = value->data2;
502 540
503 UiTextBufOp *elm = NULL; 541 UiTextBufOp *elm = NULL;
504 if(mgr->cur) { 542 if(mgr->cur) {
505 if(mgr->cur->next) { 543 if(mgr->cur->next) {
506 elm = mgr->cur->next; 544 elm = mgr->cur->next;

mercurial