| 95 #endif |
95 #endif |
| 96 |
96 |
| 97 static GtkTextBuffer* create_textbuffer(UiTextArea *textarea) { |
97 static GtkTextBuffer* create_textbuffer(UiTextArea *textarea) { |
| 98 GtkTextBuffer *buf = gtk_text_buffer_new(NULL); |
98 GtkTextBuffer *buf = gtk_text_buffer_new(NULL); |
| 99 if(textarea) { |
99 if(textarea) { |
| 100 /* |
|
| 101 g_signal_connect( |
100 g_signal_connect( |
| 102 buf, |
101 buf, |
| 103 "changed", |
102 "changed", |
| 104 G_CALLBACK(ui_textbuf_changed), |
103 G_CALLBACK(ui_textbuf_changed), |
| 105 textarea); |
104 textarea); |
| 106 */ |
|
| 107 |
105 |
| 108 g_signal_connect( |
106 g_signal_connect( |
| 109 buf, |
107 buf, |
| 110 "insert-text", |
108 "insert-text", |
| 111 G_CALLBACK(ui_textbuf_changed_insert), |
109 G_CALLBACK(ui_textbuf_change_insert), |
| 112 textarea); |
110 textarea); |
| 113 g_signal_connect( |
111 g_signal_connect( |
| 114 buf, |
112 buf, |
| 115 "delete-range", |
113 "delete-range", |
| 116 G_CALLBACK(ui_textbuf_changed_delete), |
114 G_CALLBACK(ui_textbuf_change_delete), |
| 117 textarea); |
115 textarea); |
| 118 } else { |
116 } else { |
| 119 fprintf(stderr, "Error: create_textbuffer: textarea == NULL\n"); |
117 fprintf(stderr, "Error: create_textbuffer: textarea == NULL\n"); |
| 120 } |
118 } |
| 121 return buf; |
119 return buf; |
| 140 uitext->ctx = obj->ctx; |
138 uitext->ctx = obj->ctx; |
| 141 uitext->var = var; |
139 uitext->var = var; |
| 142 uitext->last_selection_state = 0; |
140 uitext->last_selection_state = 0; |
| 143 uitext->onchange = args->onchange; |
141 uitext->onchange = args->onchange; |
| 144 uitext->onchangedata = args->onchangedata; |
142 uitext->onchangedata = args->onchangedata; |
| 145 uitext->action = args->action ? strdup(args->action) : NULL; |
143 uitext->onchange_action = args->onchange_action ? strdup(args->onchange_action) : NULL; |
| |
144 uitext->ontextchanged = args->ontextchanged; |
| |
145 uitext->ontextchangeddata = args->ontextchangeddata; |
| |
146 uitext->ontextchanged_action = args->ontextchanged_action ? strdup(args->ontextchanged_action) : NULL; |
| 146 |
147 |
| 147 g_object_set_data(G_OBJECT(text_area), "ui_textarea", uitext); |
148 g_object_set_data(G_OBJECT(text_area), "ui_textarea", uitext); |
| 148 g_object_set_data(G_OBJECT(text_area), "ui_textarea_widget", text_area); |
149 g_object_set_data(G_OBJECT(text_area), "ui_textarea_widget", text_area); |
| 149 |
150 |
| 150 g_signal_connect( |
151 g_signal_connect( |
| 224 |
225 |
| 225 void ui_textarea_destroy(GtkWidget *object, UiTextArea *textarea) { |
226 void ui_textarea_destroy(GtkWidget *object, UiTextArea *textarea) { |
| 226 if(textarea->var) { |
227 if(textarea->var) { |
| 227 ui_destroy_boundvar(textarea->ctx, textarea->var); |
228 ui_destroy_boundvar(textarea->ctx, textarea->var); |
| 228 } |
229 } |
| 229 free(textarea->action); |
230 free(textarea->onchange_action); |
| |
231 free(textarea->ontextchanged_action); |
| 230 free(textarea); |
232 free(textarea); |
| 231 } |
233 } |
| 232 |
234 |
| 233 void ui_textarea_scroll_to(UIWIDGET textarea, int pos) { |
235 void ui_textarea_scroll_to(UIWIDGET textarea, int pos) { |
| 234 GtkWidget *widget = ui_textarea_gettextwidget(textarea); |
236 GtkWidget *widget = ui_textarea_gettextwidget(textarea); |
| 461 void ui_textarea_realize_event(GtkWidget *widget, gpointer data) { |
463 void ui_textarea_realize_event(GtkWidget *widget, gpointer data) { |
| 462 gtk_widget_grab_focus(widget); |
464 gtk_widget_grab_focus(widget); |
| 463 } |
465 } |
| 464 |
466 |
| 465 |
467 |
| 466 void ui_textbuf_changed_insert( |
468 static void textbuf_change_event(UiTextArea *textarea, UiTextChangeEventData *data) { |
| |
469 if(!ui_onchange_events_is_enabled()) { |
| |
470 return; |
| |
471 } |
| |
472 |
| |
473 UiEvent e; |
| |
474 e.obj = textarea->obj; |
| |
475 e.window = e.obj->window; |
| |
476 e.document = textarea->ctx->document; |
| |
477 e.eventdata = data; |
| |
478 e.eventdatatype = UI_EVENT_DATA_TEXT_CHANGED; |
| |
479 e.intval = 0; |
| |
480 e.set = ui_get_setop(); |
| |
481 |
| |
482 if(textarea->onchange) { |
| |
483 textarea->onchange(&e, textarea->onchangedata); |
| |
484 } |
| |
485 |
| |
486 if(textarea->onchange_action) { |
| |
487 uic_action_callback(&e, textarea->onchange_action); |
| |
488 } |
| |
489 } |
| |
490 |
| |
491 void ui_textbuf_change_insert( |
| 467 GtkTextBuffer *textbuffer, |
492 GtkTextBuffer *textbuffer, |
| 468 GtkTextIter *location, |
493 GtkTextIter *location, |
| 469 char *text, |
494 char *text, |
| 470 int length, |
495 int length, |
| 471 UiTextArea *textarea) |
496 UiTextArea *textarea) |
| 474 event.type = UI_TEXT_INSERT; |
499 event.type = UI_TEXT_INSERT; |
| 475 event.begin = gtk_text_iter_get_offset(location); |
500 event.begin = gtk_text_iter_get_offset(location); |
| 476 event.end = event.begin + length; |
501 event.end = event.begin + length; |
| 477 event.text = text; |
502 event.text = text; |
| 478 event.length = length; |
503 event.length = length; |
| 479 ui_textbuf_changed(textarea, &event); |
504 textbuf_change_event(textarea, &event); |
| 480 } |
505 } |
| 481 |
506 |
| 482 void ui_textbuf_changed_delete( |
507 void ui_textbuf_change_delete( |
| 483 GtkTextBuffer *self, |
508 GtkTextBuffer *self, |
| 484 const GtkTextIter *start, |
509 const GtkTextIter *start, |
| 485 const GtkTextIter *end, |
510 const GtkTextIter *end, |
| 486 UiTextArea *textarea) |
511 UiTextArea *textarea) |
| 487 { |
512 { |
| 489 event.type = UI_TEXT_DELETE; |
514 event.type = UI_TEXT_DELETE; |
| 490 event.begin = gtk_text_iter_get_offset(start); |
515 event.begin = gtk_text_iter_get_offset(start); |
| 491 event.end = gtk_text_iter_get_offset(end); |
516 event.end = gtk_text_iter_get_offset(end); |
| 492 event.text = NULL; |
517 event.text = NULL; |
| 493 event.length = 0; |
518 event.length = 0; |
| 494 ui_textbuf_changed(textarea, &event); |
519 textbuf_change_event(textarea, &event); |
| 495 } |
520 } |
| 496 |
521 |
| 497 |
522 |
| 498 // void ui_textbuf_changed(GtkTextBuffer *textbuffer, UiTextArea *textarea) |
523 void ui_textbuf_changed(GtkTextBuffer *textbuffer, UiTextArea *textarea) { |
| 499 |
|
| 500 void ui_textbuf_changed(UiTextArea *textarea, UiTextChangeEventData *data) { |
|
| 501 if(!ui_onchange_events_is_enabled()) { |
524 if(!ui_onchange_events_is_enabled()) { |
| 502 return; |
525 return; |
| 503 } |
526 } |
| 504 |
527 |
| 505 UiText *value = textarea->var->value; |
528 UiText *value = textarea->var->value; |
| 506 |
529 |
| 507 UiEvent e; |
530 UiEvent e; |
| 508 e.obj = textarea->obj; |
531 e.obj = textarea->obj; |
| 509 e.window = e.obj->window; |
532 e.window = e.obj->window; |
| 510 e.document = textarea->ctx->document; |
533 e.document = textarea->ctx->document; |
| 511 e.eventdata = data; |
534 e.eventdata = value; |
| 512 e.eventdatatype = UI_EVENT_DATA_TEXT_CHANGED; |
535 e.eventdatatype = UI_EVENT_DATA_TEXT_VALUE; |
| 513 e.intval = 0; |
536 e.intval = 0; |
| 514 e.set = ui_get_setop(); |
537 e.set = ui_get_setop(); |
| 515 |
538 |
| 516 if(textarea->onchange) { |
539 if(textarea->ontextchanged) { |
| 517 textarea->onchange(&e, textarea->onchangedata); |
540 textarea->ontextchanged(&e, textarea->ontextchangeddata); |
| |
541 } |
| |
542 |
| |
543 if(textarea->ontextchanged_action) { |
| |
544 uic_action_callback(&e, textarea->ontextchanged_action); |
| 518 } |
545 } |
| 519 |
546 |
| 520 if(value->observers) { |
547 if(value->observers) { |
| 521 ui_notify_evt(value->observers, &e); |
548 ui_notify_evt(value->observers, &e); |
| 522 } |
|
| 523 |
|
| 524 if(textarea->action) { |
|
| 525 uic_action_callback(&e, textarea->action); |
|
| 526 } |
549 } |
| 527 } |
550 } |
| 528 |
551 |
| 529 // undo manager functions |
552 // undo manager functions |
| 530 |
553 |