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); |