1use glib::translate::*;
7
8use crate::{
9 TextBuffer, TextChildAnchor, TextIter, TextMark, TextTag, ffi, prelude::*, subclass::prelude::*,
10};
11
12pub trait TextBufferImpl: ObjectImpl + ObjectSubclass<Type: IsA<TextBuffer>> {
13 fn apply_tag(&self, tag: &TextTag, start: &TextIter, end: &TextIter) {
25 self.parent_apply_tag(tag, start, end)
26 }
27 fn begin_user_action(&self) {
46 self.parent_begin_user_action()
47 }
48 fn changed(&self) {
50 self.parent_changed()
51 }
52 fn delete_range(&self, start: &mut TextIter, end: &mut TextIter) {
54 self.parent_delete_range(start, end)
55 }
56 fn end_user_action(&self) {
62 self.parent_end_user_action()
63 }
64 fn insert_child_anchor(&self, iter: &mut TextIter, anchor: &TextChildAnchor) {
82 self.parent_insert_child_anchor(iter, anchor)
83 }
84 fn insert_paintable(&self, iter: &mut TextIter, paintable: &gdk::Paintable) {
98 self.parent_insert_paintable(iter, paintable)
99 }
100 fn insert_text(&self, iter: &mut TextIter, new_text: &str) {
102 self.parent_insert_text(iter, new_text)
103 }
104 fn mark_deleted(&self, mark: &TextMark) {
106 self.parent_mark_deleted(mark);
107 }
108 fn mark_set(&self, location: &TextIter, mark: &TextMark) {
110 self.parent_mark_set(location, mark)
111 }
112 fn modified_changed(&self) {
114 self.parent_modified_changed();
115 }
116 fn paste_done(&self, clipboard: &gdk::Clipboard) {
118 self.parent_paste_done(clipboard)
119 }
120 fn redo(&self) {
122 self.parent_redo()
123 }
124 fn remove_tag(&self, tag: &TextTag, start: &TextIter, end: &TextIter) {
136 self.parent_remove_tag(tag, start, end)
137 }
138 fn undo(&self) {
140 self.parent_undo()
141 }
142}
143
144pub trait TextBufferImplExt: TextBufferImpl {
145 fn parent_apply_tag(&self, tag: &TextTag, start: &TextIter, end: &TextIter) {
146 unsafe {
147 let data = Self::type_data();
148 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
149 if let Some(f) = (*parent_class).apply_tag {
150 f(
151 self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0,
152 tag.to_glib_none().0,
153 start.to_glib_none().0,
154 end.to_glib_none().0,
155 )
156 }
157 }
158 }
159
160 fn parent_begin_user_action(&self) {
161 unsafe {
162 let data = Self::type_data();
163 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
164 if let Some(f) = (*parent_class).begin_user_action {
165 f(self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0)
166 }
167 }
168 }
169
170 fn parent_changed(&self) {
171 unsafe {
172 let data = Self::type_data();
173 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
174 if let Some(f) = (*parent_class).changed {
175 f(self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0)
176 }
177 }
178 }
179
180 fn parent_delete_range(&self, start: &mut TextIter, end: &mut TextIter) {
181 unsafe {
182 let data = Self::type_data();
183 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
184 if let Some(f) = (*parent_class).delete_range {
185 f(
186 self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0,
187 start.to_glib_none_mut().0,
188 end.to_glib_none_mut().0,
189 )
190 }
191 }
192 }
193
194 fn parent_end_user_action(&self) {
195 unsafe {
196 let data = Self::type_data();
197 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
198 if let Some(f) = (*parent_class).end_user_action {
199 f(self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0)
200 }
201 }
202 }
203
204 fn parent_insert_child_anchor(&self, iter: &mut TextIter, anchor: &TextChildAnchor) {
205 unsafe {
206 let data = Self::type_data();
207 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
208 if let Some(f) = (*parent_class).insert_child_anchor {
209 f(
210 self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0,
211 iter.to_glib_none_mut().0,
212 anchor.to_glib_none().0,
213 )
214 }
215 }
216 }
217
218 fn parent_insert_paintable(&self, iter: &mut TextIter, paintable: &gdk::Paintable) {
219 unsafe {
220 let data = Self::type_data();
221 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
222 if let Some(f) = (*parent_class).insert_paintable {
223 f(
224 self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0,
225 iter.to_glib_none_mut().0,
226 paintable.to_glib_none().0,
227 )
228 }
229 }
230 }
231
232 fn parent_insert_text(&self, iter: &mut TextIter, new_text: &str) {
233 unsafe {
234 let data = Self::type_data();
235 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
236 if let Some(f) = (*parent_class).insert_text {
237 f(
238 self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0,
239 iter.to_glib_none_mut().0,
240 new_text.to_glib_none().0,
241 new_text.len() as i32,
242 )
243 }
244 }
245 }
246
247 fn parent_mark_deleted(&self, mark: &TextMark) {
248 unsafe {
249 let data = Self::type_data();
250 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
251 if let Some(f) = (*parent_class).mark_deleted {
252 f(
253 self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0,
254 mark.to_glib_none().0,
255 )
256 }
257 }
258 }
259
260 fn parent_mark_set(&self, location: &TextIter, mark: &TextMark) {
261 unsafe {
262 let data = Self::type_data();
263 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
264 if let Some(f) = (*parent_class).mark_set {
265 f(
266 self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0,
267 location.to_glib_none().0,
268 mark.to_glib_none().0,
269 )
270 }
271 }
272 }
273
274 fn parent_modified_changed(&self) {
275 unsafe {
276 let data = Self::type_data();
277 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
278 if let Some(f) = (*parent_class).modified_changed {
279 f(self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0)
280 }
281 }
282 }
283
284 fn parent_paste_done(&self, clipboard: &gdk::Clipboard) {
285 unsafe {
286 let data = Self::type_data();
287 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
288 if let Some(f) = (*parent_class).paste_done {
289 f(
290 self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0,
291 clipboard.to_glib_none().0,
292 )
293 }
294 }
295 }
296
297 fn parent_redo(&self) {
298 unsafe {
299 let data = Self::type_data();
300 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
301 if let Some(f) = (*parent_class).redo {
302 f(self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0)
303 }
304 }
305 }
306
307 fn parent_remove_tag(&self, tag: &TextTag, start: &TextIter, end: &TextIter) {
308 unsafe {
309 let data = Self::type_data();
310 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
311 if let Some(f) = (*parent_class).remove_tag {
312 f(
313 self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0,
314 tag.to_glib_none().0,
315 start.to_glib_none().0,
316 end.to_glib_none().0,
317 )
318 }
319 }
320 }
321
322 fn parent_undo(&self) {
323 unsafe {
324 let data = Self::type_data();
325 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTextBufferClass;
326 if let Some(f) = (*parent_class).undo {
327 f(self.obj().unsafe_cast_ref::<TextBuffer>().to_glib_none().0)
328 }
329 }
330 }
331}
332
333impl<T: TextBufferImpl> TextBufferImplExt for T {}
334
335unsafe impl<T: TextBufferImpl> IsSubclassable<T> for TextBuffer {
336 fn class_init(class: &mut glib::Class<Self>) {
337 Self::parent_class_init::<T>(class);
338
339 assert_initialized_main_thread!();
340
341 let klass = class.as_mut();
342 klass.apply_tag = Some(text_buffer_apply_tag::<T>);
343 klass.begin_user_action = Some(text_buffer_begin_user_action::<T>);
344 klass.changed = Some(text_buffer_changed::<T>);
345 klass.delete_range = Some(text_buffer_delete_range::<T>);
346 klass.end_user_action = Some(text_buffer_end_user_action::<T>);
347 klass.insert_child_anchor = Some(text_buffer_insert_child_anchor::<T>);
348 klass.insert_paintable = Some(text_buffer_insert_paintable::<T>);
349 klass.insert_text = Some(text_buffer_insert_text::<T>);
350 klass.mark_deleted = Some(text_buffer_mark_deleted::<T>);
351 klass.mark_set = Some(text_buffer_mark_set::<T>);
352 klass.modified_changed = Some(text_buffer_modified_changed::<T>);
353 klass.paste_done = Some(text_buffer_paste_done::<T>);
354 klass.remove_tag = Some(text_buffer_remove_tag::<T>);
355 klass.redo = Some(text_buffer_redo::<T>);
356 klass.undo = Some(text_buffer_undo::<T>);
357 }
358}
359
360unsafe extern "C" fn text_buffer_apply_tag<T: TextBufferImpl>(
361 ptr: *mut ffi::GtkTextBuffer,
362 tag_ptr: *mut ffi::GtkTextTag,
363 start_ptr: *const ffi::GtkTextIter,
364 end_ptr: *const ffi::GtkTextIter,
365) {
366 unsafe {
367 let instance = &*(ptr as *mut T::Instance);
368 let imp = instance.imp();
369
370 imp.apply_tag(
371 &from_glib_borrow(tag_ptr),
372 &from_glib_borrow(start_ptr),
373 &from_glib_borrow(end_ptr),
374 )
375 }
376}
377
378unsafe extern "C" fn text_buffer_begin_user_action<T: TextBufferImpl>(
379 ptr: *mut ffi::GtkTextBuffer,
380) {
381 unsafe {
382 let instance = &*(ptr as *mut T::Instance);
383 let imp = instance.imp();
384
385 imp.begin_user_action()
386 }
387}
388
389unsafe extern "C" fn text_buffer_changed<T: TextBufferImpl>(ptr: *mut ffi::GtkTextBuffer) {
390 unsafe {
391 let instance = &*(ptr as *mut T::Instance);
392 let imp = instance.imp();
393
394 imp.changed()
395 }
396}
397
398unsafe extern "C" fn text_buffer_delete_range<T: TextBufferImpl>(
399 ptr: *mut ffi::GtkTextBuffer,
400 start_ptr: *mut ffi::GtkTextIter,
401 end_ptr: *mut ffi::GtkTextIter,
402) {
403 unsafe {
404 let instance = &*(ptr as *mut T::Instance);
405 let imp = instance.imp();
406
407 let mut start_copy = from_glib_none(start_ptr);
408 let mut end_copy = from_glib_none(end_ptr);
409
410 imp.delete_range(&mut start_copy, &mut end_copy);
411
412 *start_ptr = *start_copy.to_glib_none().0;
413 *end_ptr = *end_copy.to_glib_none().0;
414 }
415}
416
417unsafe extern "C" fn text_buffer_end_user_action<T: TextBufferImpl>(ptr: *mut ffi::GtkTextBuffer) {
418 unsafe {
419 let instance = &*(ptr as *mut T::Instance);
420 let imp = instance.imp();
421
422 imp.end_user_action()
423 }
424}
425
426unsafe extern "C" fn text_buffer_insert_child_anchor<T: TextBufferImpl>(
427 ptr: *mut ffi::GtkTextBuffer,
428 iter_ptr: *mut ffi::GtkTextIter,
429 anchor_ptr: *mut ffi::GtkTextChildAnchor,
430) {
431 unsafe {
432 let instance = &*(ptr as *mut T::Instance);
433 let imp = instance.imp();
434
435 let mut iter = from_glib_none(iter_ptr);
436
437 imp.insert_child_anchor(&mut iter, &from_glib_borrow(anchor_ptr));
438 *iter_ptr = *iter.to_glib_none().0;
439 }
440}
441
442unsafe extern "C" fn text_buffer_insert_paintable<T: TextBufferImpl>(
443 ptr: *mut ffi::GtkTextBuffer,
444 iter_ptr: *mut ffi::GtkTextIter,
445 paintable_ptr: *mut gdk::ffi::GdkPaintable,
446) {
447 unsafe {
448 let instance = &*(ptr as *mut T::Instance);
449 let imp = instance.imp();
450
451 let mut iter = from_glib_none(iter_ptr);
452
453 imp.insert_paintable(&mut iter, &from_glib_borrow(paintable_ptr));
454 *iter_ptr = *iter.to_glib_none().0;
455 }
456}
457
458unsafe extern "C" fn text_buffer_insert_text<T: TextBufferImpl>(
459 ptr: *mut ffi::GtkTextBuffer,
460 iter_ptr: *mut ffi::GtkTextIter,
461 text_ptr: *const libc::c_char,
462 _length: libc::c_int,
463) {
464 unsafe {
465 let instance = &*(ptr as *mut T::Instance);
466 let imp = instance.imp();
467 let text: Borrowed<glib::GString> = from_glib_borrow(text_ptr);
468
469 let mut iter = from_glib_none(iter_ptr);
470
471 imp.insert_text(&mut iter, text.as_str());
472 *iter_ptr = *iter.to_glib_none().0;
473 }
474}
475
476unsafe extern "C" fn text_buffer_modified_changed<T: TextBufferImpl>(ptr: *mut ffi::GtkTextBuffer) {
477 unsafe {
478 let instance = &*(ptr as *mut T::Instance);
479 let imp = instance.imp();
480
481 imp.modified_changed()
482 }
483}
484
485unsafe extern "C" fn text_buffer_mark_deleted<T: TextBufferImpl>(
486 ptr: *mut ffi::GtkTextBuffer,
487 mark: *mut ffi::GtkTextMark,
488) {
489 unsafe {
490 let instance = &*(ptr as *mut T::Instance);
491 let imp = instance.imp();
492
493 imp.mark_deleted(&from_glib_borrow(mark))
494 }
495}
496
497unsafe extern "C" fn text_buffer_mark_set<T: TextBufferImpl>(
498 ptr: *mut ffi::GtkTextBuffer,
499 iter: *const ffi::GtkTextIter,
500 mark: *mut ffi::GtkTextMark,
501) {
502 unsafe {
503 let instance = &*(ptr as *mut T::Instance);
504 let imp = instance.imp();
505
506 imp.mark_set(&from_glib_borrow(iter), &from_glib_borrow(mark))
507 }
508}
509
510unsafe extern "C" fn text_buffer_paste_done<T: TextBufferImpl>(
511 ptr: *mut ffi::GtkTextBuffer,
512 clipboard_ptr: *mut gdk::ffi::GdkClipboard,
513) {
514 unsafe {
515 let instance = &*(ptr as *mut T::Instance);
516 let imp = instance.imp();
517
518 imp.paste_done(&from_glib_borrow(clipboard_ptr))
519 }
520}
521
522unsafe extern "C" fn text_buffer_redo<T: TextBufferImpl>(ptr: *mut ffi::GtkTextBuffer) {
523 unsafe {
524 let instance = &*(ptr as *mut T::Instance);
525 let imp = instance.imp();
526
527 imp.redo()
528 }
529}
530
531unsafe extern "C" fn text_buffer_remove_tag<T: TextBufferImpl>(
532 ptr: *mut ffi::GtkTextBuffer,
533 tag: *mut ffi::GtkTextTag,
534 start: *const ffi::GtkTextIter,
535 end: *const ffi::GtkTextIter,
536) {
537 unsafe {
538 let instance = &*(ptr as *mut T::Instance);
539 let imp = instance.imp();
540
541 imp.remove_tag(
542 &from_glib_borrow(tag),
543 &from_glib_borrow(start),
544 &from_glib_borrow(end),
545 )
546 }
547}
548
549unsafe extern "C" fn text_buffer_undo<T: TextBufferImpl>(ptr: *mut ffi::GtkTextBuffer) {
550 unsafe {
551 let instance = &*(ptr as *mut T::Instance);
552 let imp = instance.imp();
553
554 imp.undo()
555 }
556}