1 /*
2  * This file is part of gtkD.
3  *
4  * gtkD is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License
6  * as published by the Free Software Foundation; either version 3
7  * of the License, or (at your option) any later version, with
8  * some exceptions, please read the COPYING file.
9  *
10  * gtkD is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with gtkD; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
18  */
19 
20 // generated automatically - do not change
21 // find conversion definition on APILookup.txt
22 // implement new conversion functionalities on the wrap.utils pakage
23 
24 
25 module gsv.SourceBuffer;
26 
27 private import glib.ConstructionException;
28 private import glib.ListSG;
29 private import glib.Str;
30 private import gobject.ObjectG;
31 private import gobject.Signals;
32 private import gsv.SourceLanguage;
33 private import gsv.SourceMark;
34 private import gsv.SourceStyleScheme;
35 private import gsv.SourceUndoManager;
36 private import gsv.SourceUndoManagerIF;
37 private import gsvc.gsv;
38 public  import gsvc.gsvtypes;
39 private import gtk.TextBuffer;
40 private import gtk.TextIter;
41 private import gtk.TextMark;
42 private import gtk.TextTag;
43 private import gtk.TextTagTable;
44 private import std.algorithm;
45 
46 
47 /** */
48 public class SourceBuffer : TextBuffer
49 {
50 	/** the main Gtk struct */
51 	protected GtkSourceBuffer* gtkSourceBuffer;
52 
53 	/** Get the main Gtk struct */
54 	public GtkSourceBuffer* getSourceBufferStruct(bool transferOwnership = false)
55 	{
56 		if (transferOwnership)
57 			ownedRef = false;
58 		return gtkSourceBuffer;
59 	}
60 
61 	/** the main Gtk struct as a void* */
62 	protected override void* getStruct()
63 	{
64 		return cast(void*)gtkSourceBuffer;
65 	}
66 
67 	protected override void setStruct(GObject* obj)
68 	{
69 		gtkSourceBuffer = cast(GtkSourceBuffer*)obj;
70 		super.setStruct(obj);
71 	}
72 
73 	/**
74 	 * Sets our main struct and passes it to the parent class.
75 	 */
76 	public this (GtkSourceBuffer* gtkSourceBuffer, bool ownedRef = false)
77 	{
78 		this.gtkSourceBuffer = gtkSourceBuffer;
79 		super(cast(GtkTextBuffer*)gtkSourceBuffer, ownedRef);
80 	}
81 
82 
83 	/** */
84 	public static GType getType()
85 	{
86 		return gtk_source_buffer_get_type();
87 	}
88 
89 	/**
90 	 * Creates a new source buffer.
91 	 *
92 	 * Params:
93 	 *     table = a #GtkTextTagTable, or %NULL to create a new one.
94 	 *
95 	 * Returns: a new source buffer.
96 	 *
97 	 * Throws: ConstructionException GTK+ fails to create the object.
98 	 */
99 	public this(TextTagTable table)
100 	{
101 		auto p = gtk_source_buffer_new((table is null) ? null : table.getTextTagTableStruct());
102 		
103 		if(p is null)
104 		{
105 			throw new ConstructionException("null returned by new");
106 		}
107 		
108 		this(cast(GtkSourceBuffer*) p, true);
109 	}
110 
111 	/**
112 	 * Creates a new source buffer using the highlighting patterns in
113 	 * @language.  This is equivalent to creating a new source buffer with
114 	 * a new tag table and then calling gtk_source_buffer_set_language().
115 	 *
116 	 * Params:
117 	 *     language = a #GtkSourceLanguage.
118 	 *
119 	 * Returns: a new source buffer which will highlight text
120 	 *     according to the highlighting patterns in @language.
121 	 *
122 	 * Throws: ConstructionException GTK+ fails to create the object.
123 	 */
124 	public this(SourceLanguage language)
125 	{
126 		auto p = gtk_source_buffer_new_with_language((language is null) ? null : language.getSourceLanguageStruct());
127 		
128 		if(p is null)
129 		{
130 			throw new ConstructionException("null returned by new_with_language");
131 		}
132 		
133 		this(cast(GtkSourceBuffer*) p, true);
134 	}
135 
136 	/**
137 	 * Moves @iter to the position of the previous #GtkSourceMark of the given
138 	 * category. Returns %TRUE if @iter was moved. If @category is NULL, the
139 	 * previous source mark can be of any category.
140 	 *
141 	 * Params:
142 	 *     iter = an iterator.
143 	 *     category = category to search for, or %NULL
144 	 *
145 	 * Returns: whether @iter was moved.
146 	 *
147 	 * Since: 2.2
148 	 */
149 	public bool backwardIterToSourceMark(TextIter iter, string category)
150 	{
151 		return gtk_source_buffer_backward_iter_to_source_mark(gtkSourceBuffer, (iter is null) ? null : iter.getTextIterStruct(), Str.toStringz(category)) != 0;
152 	}
153 
154 	/**
155 	 * Marks the beginning of a not undoable action on the buffer,
156 	 * disabling the undo manager.  Typically you would call this function
157 	 * before initially setting the contents of the buffer (e.g. when
158 	 * loading a file in a text editor).
159 	 *
160 	 * You may nest gtk_source_buffer_begin_not_undoable_action() /
161 	 * gtk_source_buffer_end_not_undoable_action() blocks.
162 	 */
163 	public void beginNotUndoableAction()
164 	{
165 		gtk_source_buffer_begin_not_undoable_action(gtkSourceBuffer);
166 	}
167 
168 	/**
169 	 * Determines whether a source buffer can redo the last action
170 	 * (i.e. if the last operation was an undo).
171 	 *
172 	 * Returns: %TRUE if a redo is possible.
173 	 */
174 	public bool canRedo()
175 	{
176 		return gtk_source_buffer_can_redo(gtkSourceBuffer) != 0;
177 	}
178 
179 	/**
180 	 * Determines whether a source buffer can undo the last action.
181 	 *
182 	 * Returns: %TRUE if it's possible to undo the last action.
183 	 */
184 	public bool canUndo()
185 	{
186 		return gtk_source_buffer_can_undo(gtkSourceBuffer) != 0;
187 	}
188 
189 	/**
190 	 * Changes the case of the text between the specified iterators.
191 	 *
192 	 * Params:
193 	 *     caseType = how to change the case.
194 	 *     start = a #GtkTextIter.
195 	 *     end = a #GtkTextIter.
196 	 *
197 	 * Since: 3.12
198 	 */
199 	public void changeCase(GtkSourceChangeCaseType caseType, TextIter start, TextIter end)
200 	{
201 		gtk_source_buffer_change_case(gtkSourceBuffer, caseType, (start is null) ? null : start.getTextIterStruct(), (end is null) ? null : end.getTextIterStruct());
202 	}
203 
204 	/**
205 	 * Creates a source mark in the @buffer of category @category.  A source mark is
206 	 * a #GtkTextMark but organised into categories. Depending on the category
207 	 * a pixbuf can be specified that will be displayed along the line of the mark.
208 	 *
209 	 * Like a #GtkTextMark, a #GtkSourceMark can be anonymous if the
210 	 * passed @name is %NULL.  Also, the buffer owns the marks so you
211 	 * shouldn't unreference it.
212 	 *
213 	 * Marks always have left gravity and are moved to the beginning of
214 	 * the line when the user deletes the line they were in.
215 	 *
216 	 * Typical uses for a source mark are bookmarks, breakpoints, current
217 	 * executing instruction indication in a source file, etc..
218 	 *
219 	 * Params:
220 	 *     name = the name of the mark, or %NULL.
221 	 *     category = a string defining the mark category.
222 	 *     where = location to place the mark.
223 	 *
224 	 * Returns: a new #GtkSourceMark, owned by the buffer.
225 	 *
226 	 * Since: 2.2
227 	 */
228 	public SourceMark createSourceMark(string name, string category, TextIter where)
229 	{
230 		auto p = gtk_source_buffer_create_source_mark(gtkSourceBuffer, Str.toStringz(name), Str.toStringz(category), (where is null) ? null : where.getTextIterStruct());
231 		
232 		if(p is null)
233 		{
234 			return null;
235 		}
236 		
237 		return ObjectG.getDObject!(SourceMark)(cast(GtkSourceMark*) p);
238 	}
239 
240 	/**
241 	 * Marks the end of a not undoable action on the buffer.  When the
242 	 * last not undoable block is closed through the call to this
243 	 * function, the list of undo actions is cleared and the undo manager
244 	 * is re-enabled.
245 	 */
246 	public void endNotUndoableAction()
247 	{
248 		gtk_source_buffer_end_not_undoable_action(gtkSourceBuffer);
249 	}
250 
251 	/**
252 	 * Forces buffer to analyze and highlight the given area synchronously.
253 	 *
254 	 * <note>
255 	 * <para>
256 	 * This is a potentially slow operation and should be used only
257 	 * when you need to make sure that some text not currently
258 	 * visible is highlighted, for instance before printing.
259 	 * </para>
260 	 * </note>
261 	 *
262 	 * Params:
263 	 *     start = start of the area to highlight.
264 	 *     end = end of the area to highlight.
265 	 */
266 	public void ensureHighlight(TextIter start, TextIter end)
267 	{
268 		gtk_source_buffer_ensure_highlight(gtkSourceBuffer, (start is null) ? null : start.getTextIterStruct(), (end is null) ? null : end.getTextIterStruct());
269 	}
270 
271 	/**
272 	 * Moves @iter to the position of the next #GtkSourceMark of the given
273 	 * @category. Returns %TRUE if @iter was moved. If @category is NULL, the
274 	 * next source mark can be of any category.
275 	 *
276 	 * Params:
277 	 *     iter = an iterator.
278 	 *     category = category to search for, or %NULL
279 	 *
280 	 * Returns: whether @iter was moved.
281 	 *
282 	 * Since: 2.2
283 	 */
284 	public bool forwardIterToSourceMark(TextIter iter, string category)
285 	{
286 		return gtk_source_buffer_forward_iter_to_source_mark(gtkSourceBuffer, (iter is null) ? null : iter.getTextIterStruct(), Str.toStringz(category)) != 0;
287 	}
288 
289 	/**
290 	 * Get all defined context classes at @iter.
291 	 *
292 	 * See the #GtkSourceBuffer description for the list of default context classes.
293 	 *
294 	 * Params:
295 	 *     iter = a #GtkTextIter.
296 	 *
297 	 * Returns: a new %NULL
298 	 *     terminated array of context class names.
299 	 *     Use g_strfreev() to free the array if it is no longer needed.
300 	 *
301 	 * Since: 2.10
302 	 */
303 	public string[] getContextClassesAtIter(TextIter iter)
304 	{
305 		auto retStr = gtk_source_buffer_get_context_classes_at_iter(gtkSourceBuffer, (iter is null) ? null : iter.getTextIterStruct());
306 		
307 		scope(exit) Str.freeStringArray(retStr);
308 		return Str.toStringArray(retStr);
309 	}
310 
311 	/**
312 	 * Determines whether bracket match highlighting is activated for the
313 	 * source buffer.
314 	 *
315 	 * Returns: %TRUE if the source buffer will highlight matching
316 	 *     brackets.
317 	 */
318 	public bool getHighlightMatchingBrackets()
319 	{
320 		return gtk_source_buffer_get_highlight_matching_brackets(gtkSourceBuffer) != 0;
321 	}
322 
323 	/**
324 	 * Determines whether syntax highlighting is activated in the source
325 	 * buffer.
326 	 *
327 	 * Returns: %TRUE if syntax highlighting is enabled, %FALSE otherwise.
328 	 */
329 	public bool getHighlightSyntax()
330 	{
331 		return gtk_source_buffer_get_highlight_syntax(gtkSourceBuffer) != 0;
332 	}
333 
334 	/**
335 	 * Returns: whether the @buffer has an implicit trailing newline.
336 	 *
337 	 * Since: 3.14
338 	 */
339 	public bool getImplicitTrailingNewline()
340 	{
341 		return gtk_source_buffer_get_implicit_trailing_newline(gtkSourceBuffer) != 0;
342 	}
343 
344 	/**
345 	 * Returns the #GtkSourceLanguage associated with the buffer,
346 	 * see gtk_source_buffer_set_language().  The returned object should not be
347 	 * unreferenced by the user.
348 	 *
349 	 * Returns: the #GtkSourceLanguage associated
350 	 *     with the buffer, or %NULL.
351 	 */
352 	public SourceLanguage getLanguage()
353 	{
354 		auto p = gtk_source_buffer_get_language(gtkSourceBuffer);
355 		
356 		if(p is null)
357 		{
358 			return null;
359 		}
360 		
361 		return ObjectG.getDObject!(SourceLanguage)(cast(GtkSourceLanguage*) p);
362 	}
363 
364 	/**
365 	 * Determines the number of undo levels the buffer will track for buffer edits.
366 	 *
367 	 * Returns: the maximum number of possible undo levels or -1 if no limit is set.
368 	 */
369 	public int getMaxUndoLevels()
370 	{
371 		return gtk_source_buffer_get_max_undo_levels(gtkSourceBuffer);
372 	}
373 
374 	/**
375 	 * Returns the list of marks of the given category at @iter. If @category
376 	 * is %NULL it returns all marks at @iter.
377 	 *
378 	 * Params:
379 	 *     iter = an iterator.
380 	 *     category = category to search for, or %NULL
381 	 *
382 	 * Returns: a newly allocated #GSList.
383 	 *
384 	 * Since: 2.2
385 	 */
386 	public ListSG getSourceMarksAtIter(TextIter iter, string category)
387 	{
388 		auto p = gtk_source_buffer_get_source_marks_at_iter(gtkSourceBuffer, (iter is null) ? null : iter.getTextIterStruct(), Str.toStringz(category));
389 		
390 		if(p is null)
391 		{
392 			return null;
393 		}
394 		
395 		return new ListSG(cast(GSList*) p);
396 	}
397 
398 	/**
399 	 * Returns the list of marks of the given category at @line.
400 	 * If @category is %NULL, all marks at @line are returned.
401 	 *
402 	 * Params:
403 	 *     line = a line number.
404 	 *     category = category to search for, or %NULL
405 	 *
406 	 * Returns: a newly allocated #GSList.
407 	 *
408 	 * Since: 2.2
409 	 */
410 	public ListSG getSourceMarksAtLine(int line, string category)
411 	{
412 		auto p = gtk_source_buffer_get_source_marks_at_line(gtkSourceBuffer, line, Str.toStringz(category));
413 		
414 		if(p is null)
415 		{
416 			return null;
417 		}
418 		
419 		return new ListSG(cast(GSList*) p);
420 	}
421 
422 	/**
423 	 * Returns the #GtkSourceStyleScheme associated with the buffer,
424 	 * see gtk_source_buffer_set_style_scheme().
425 	 * The returned object should not be unreferenced by the user.
426 	 *
427 	 * Returns: the #GtkSourceStyleScheme
428 	 *     associated with the buffer, or %NULL.
429 	 */
430 	public SourceStyleScheme getStyleScheme()
431 	{
432 		auto p = gtk_source_buffer_get_style_scheme(gtkSourceBuffer);
433 		
434 		if(p is null)
435 		{
436 			return null;
437 		}
438 		
439 		return ObjectG.getDObject!(SourceStyleScheme)(cast(GtkSourceStyleScheme*) p);
440 	}
441 
442 	/**
443 	 * Returns the #GtkSourceUndoManager associated with the buffer,
444 	 * see gtk_source_buffer_set_undo_manager().  The returned object should not be
445 	 * unreferenced by the user.
446 	 *
447 	 * Returns: the #GtkSourceUndoManager associated
448 	 *     with the buffer, or %NULL.
449 	 */
450 	public SourceUndoManagerIF getUndoManager()
451 	{
452 		auto p = gtk_source_buffer_get_undo_manager(gtkSourceBuffer);
453 		
454 		if(p is null)
455 		{
456 			return null;
457 		}
458 		
459 		return ObjectG.getDObject!(SourceUndoManager, SourceUndoManagerIF)(cast(GtkSourceUndoManager*) p);
460 	}
461 
462 	/**
463 	 * Moves backward to the next toggle (on or off) of the context class. If no
464 	 * matching context class toggles are found, returns %FALSE, otherwise %TRUE.
465 	 * Does not return toggles located at @iter, only toggles after @iter. Sets
466 	 * @iter to the location of the toggle, or to the end of the buffer if no
467 	 * toggle is found.
468 	 *
469 	 * See the #GtkSourceBuffer description for the list of default context classes.
470 	 *
471 	 * Params:
472 	 *     iter = a #GtkTextIter.
473 	 *     contextClass = the context class.
474 	 *
475 	 * Returns: whether we found a context class toggle before @iter
476 	 *
477 	 * Since: 2.10
478 	 */
479 	public bool iterBackwardToContextClassToggle(TextIter iter, string contextClass)
480 	{
481 		return gtk_source_buffer_iter_backward_to_context_class_toggle(gtkSourceBuffer, (iter is null) ? null : iter.getTextIterStruct(), Str.toStringz(contextClass)) != 0;
482 	}
483 
484 	/**
485 	 * Moves forward to the next toggle (on or off) of the context class. If no
486 	 * matching context class toggles are found, returns %FALSE, otherwise %TRUE.
487 	 * Does not return toggles located at @iter, only toggles after @iter. Sets
488 	 * @iter to the location of the toggle, or to the end of the buffer if no
489 	 * toggle is found.
490 	 *
491 	 * See the #GtkSourceBuffer description for the list of default context classes.
492 	 *
493 	 * Params:
494 	 *     iter = a #GtkTextIter.
495 	 *     contextClass = the context class.
496 	 *
497 	 * Returns: whether we found a context class toggle after @iter
498 	 *
499 	 * Since: 2.10
500 	 */
501 	public bool iterForwardToContextClassToggle(TextIter iter, string contextClass)
502 	{
503 		return gtk_source_buffer_iter_forward_to_context_class_toggle(gtkSourceBuffer, (iter is null) ? null : iter.getTextIterStruct(), Str.toStringz(contextClass)) != 0;
504 	}
505 
506 	/**
507 	 * Check if the class @context_class is set on @iter.
508 	 *
509 	 * See the #GtkSourceBuffer description for the list of default context classes.
510 	 *
511 	 * Params:
512 	 *     iter = a #GtkTextIter.
513 	 *     contextClass = class to search for.
514 	 *
515 	 * Returns: whether @iter has the context class.
516 	 *
517 	 * Since: 2.10
518 	 */
519 	public bool iterHasContextClass(TextIter iter, string contextClass)
520 	{
521 		return gtk_source_buffer_iter_has_context_class(gtkSourceBuffer, (iter is null) ? null : iter.getTextIterStruct(), Str.toStringz(contextClass)) != 0;
522 	}
523 
524 	/**
525 	 * Joins the lines of text between the specified iterators.
526 	 *
527 	 * Params:
528 	 *     start = a #GtkTextIter.
529 	 *     end = a #GtkTextIter.
530 	 *
531 	 * Since: 3.16
532 	 */
533 	public void joinLines(TextIter start, TextIter end)
534 	{
535 		gtk_source_buffer_join_lines(gtkSourceBuffer, (start is null) ? null : start.getTextIterStruct(), (end is null) ? null : end.getTextIterStruct());
536 	}
537 
538 	/**
539 	 * Redoes the last undo operation.  Use gtk_source_buffer_can_redo()
540 	 * to check whether a call to this function will have any effect.
541 	 *
542 	 * This function emits the #GtkSourceBuffer::redo signal.
543 	 */
544 	public void redo()
545 	{
546 		gtk_source_buffer_redo(gtkSourceBuffer);
547 	}
548 
549 	/**
550 	 * Remove all marks of @category between @start and @end from the buffer.
551 	 * If @category is NULL, all marks in the range will be removed.
552 	 *
553 	 * Params:
554 	 *     start = a #GtkTextIter.
555 	 *     end = a #GtkTextIter.
556 	 *     category = category to search for, or %NULL.
557 	 *
558 	 * Since: 2.2
559 	 */
560 	public void removeSourceMarks(TextIter start, TextIter end, string category)
561 	{
562 		gtk_source_buffer_remove_source_marks(gtkSourceBuffer, (start is null) ? null : start.getTextIterStruct(), (end is null) ? null : end.getTextIterStruct(), Str.toStringz(category));
563 	}
564 
565 	/**
566 	 * Controls the bracket match highlighting function in the buffer.  If
567 	 * activated, when you position your cursor over a bracket character
568 	 * (a parenthesis, a square bracket, etc.) the matching opening or
569 	 * closing bracket character will be highlighted.
570 	 *
571 	 * Params:
572 	 *     highlight = %TRUE if you want matching brackets highlighted.
573 	 */
574 	public void setHighlightMatchingBrackets(bool highlight)
575 	{
576 		gtk_source_buffer_set_highlight_matching_brackets(gtkSourceBuffer, highlight);
577 	}
578 
579 	/**
580 	 * Controls whether syntax is highlighted in the buffer.
581 	 *
582 	 * If @highlight is %TRUE, the text will be highlighted according to the syntax
583 	 * patterns specified in the #GtkSourceLanguage set with
584 	 * gtk_source_buffer_set_language().
585 	 *
586 	 * If @highlight is %FALSE, syntax highlighting is disabled and all the
587 	 * #GtkTextTag objects that have been added by the syntax highlighting engine
588 	 * are removed from the buffer.
589 	 *
590 	 * Params:
591 	 *     highlight = %TRUE to enable syntax highlighting, %FALSE to disable it.
592 	 */
593 	public void setHighlightSyntax(bool highlight)
594 	{
595 		gtk_source_buffer_set_highlight_syntax(gtkSourceBuffer, highlight);
596 	}
597 
598 	/**
599 	 * Sets whether the @buffer has an implicit trailing newline.
600 	 *
601 	 * If an explicit trailing newline is present in a #GtkTextBuffer, #GtkTextView
602 	 * shows it as an empty line. This is generally not what the user expects.
603 	 *
604 	 * If @implicit_trailing_newline is %TRUE (the default value):
605 	 * - when a #GtkSourceFileLoader loads the content of a file into the @buffer,
606 	 * the trailing newline (if present in the file) is not inserted into the
607 	 * @buffer.
608 	 * - when a #GtkSourceFileSaver saves the content of the @buffer into a file, a
609 	 * trailing newline is added to the file.
610 	 *
611 	 * On the other hand, if @implicit_trailing_newline is %FALSE, the file's
612 	 * content is not modified when loaded into the @buffer, and the @buffer's
613 	 * content is not modified when saved into a file.
614 	 *
615 	 * Params:
616 	 *     implicitTrailingNewline = the new value.
617 	 *
618 	 * Since: 3.14
619 	 */
620 	public void setImplicitTrailingNewline(bool implicitTrailingNewline)
621 	{
622 		gtk_source_buffer_set_implicit_trailing_newline(gtkSourceBuffer, implicitTrailingNewline);
623 	}
624 
625 	/**
626 	 * Associates a #GtkSourceLanguage with the buffer.
627 	 *
628 	 * Note that a #GtkSourceLanguage affects not only the syntax highlighting, but
629 	 * also the [context classes][context-classes]. If you want to disable just the
630 	 * syntax highlighting, see gtk_source_buffer_set_highlight_syntax().
631 	 *
632 	 * The buffer holds a reference to @language.
633 	 *
634 	 * Params:
635 	 *     language = a #GtkSourceLanguage to set, or %NULL.
636 	 */
637 	public void setLanguage(SourceLanguage language)
638 	{
639 		gtk_source_buffer_set_language(gtkSourceBuffer, (language is null) ? null : language.getSourceLanguageStruct());
640 	}
641 
642 	/**
643 	 * Sets the number of undo levels for user actions the buffer will
644 	 * track.  If the number of user actions exceeds the limit set by this
645 	 * function, older actions will be discarded.
646 	 *
647 	 * If @max_undo_levels is -1, the undo/redo is unlimited.
648 	 *
649 	 * If @max_undo_levels is 0, the undo/redo is disabled.
650 	 *
651 	 * Params:
652 	 *     maxUndoLevels = the desired maximum number of undo levels.
653 	 */
654 	public void setMaxUndoLevels(int maxUndoLevels)
655 	{
656 		gtk_source_buffer_set_max_undo_levels(gtkSourceBuffer, maxUndoLevels);
657 	}
658 
659 	/**
660 	 * Sets a #GtkSourceStyleScheme to be used by the buffer and the view.
661 	 *
662 	 * Note that a #GtkSourceStyleScheme affects not only the syntax highlighting,
663 	 * but also other #GtkSourceView features such as highlighting the current line,
664 	 * matching brackets, the line numbers, etc.
665 	 *
666 	 * Instead of setting a %NULL @scheme, it is better to disable syntax
667 	 * highlighting with gtk_source_buffer_set_highlight_syntax(), and setting the
668 	 * #GtkSourceStyleScheme with the "classic" or "tango" ID, because those two
669 	 * style schemes follow more closely the GTK+ theme (for example for the
670 	 * background color).
671 	 *
672 	 * The buffer holds a reference to @scheme.
673 	 *
674 	 * Params:
675 	 *     scheme = a #GtkSourceStyleScheme or %NULL.
676 	 */
677 	public void setStyleScheme(SourceStyleScheme scheme)
678 	{
679 		gtk_source_buffer_set_style_scheme(gtkSourceBuffer, (scheme is null) ? null : scheme.getSourceStyleSchemeStruct());
680 	}
681 
682 	/**
683 	 * Set the buffer undo manager. If @manager is %NULL the default undo manager
684 	 * will be set.
685 	 *
686 	 * Params:
687 	 *     manager = A #GtkSourceUndoManager or %NULL.
688 	 */
689 	public void setUndoManager(SourceUndoManagerIF manager)
690 	{
691 		gtk_source_buffer_set_undo_manager(gtkSourceBuffer, (manager is null) ? null : manager.getSourceUndoManagerStruct());
692 	}
693 
694 	/**
695 	 * Sort the lines of text between the specified iterators.
696 	 *
697 	 * Params:
698 	 *     start = a #GtkTextIter.
699 	 *     end = a #GtkTextIter.
700 	 *     flags = #GtkSourceSortFlags specifying how the sort should behave
701 	 *     column = sort considering the text starting at the given column
702 	 *
703 	 * Since: 3.18
704 	 */
705 	public void sortLines(TextIter start, TextIter end, GtkSourceSortFlags flags, int column)
706 	{
707 		gtk_source_buffer_sort_lines(gtkSourceBuffer, (start is null) ? null : start.getTextIterStruct(), (end is null) ? null : end.getTextIterStruct(), flags, column);
708 	}
709 
710 	/**
711 	 * Undoes the last user action which modified the buffer.  Use
712 	 * gtk_source_buffer_can_undo() to check whether a call to this
713 	 * function will have any effect.
714 	 *
715 	 * This function emits the #GtkSourceBuffer::undo signal.
716 	 */
717 	public void undo()
718 	{
719 		gtk_source_buffer_undo(gtkSourceBuffer);
720 	}
721 
722 	protected class OnBracketMatchedDelegateWrapper
723 	{
724 		void delegate(TextIter, GtkSourceBracketMatchType, SourceBuffer) dlg;
725 		gulong handlerId;
726 		
727 		this(void delegate(TextIter, GtkSourceBracketMatchType, SourceBuffer) dlg)
728 		{
729 			this.dlg = dlg;
730 			onBracketMatchedListeners ~= this;
731 		}
732 		
733 		void remove(OnBracketMatchedDelegateWrapper source)
734 		{
735 			foreach(index, wrapper; onBracketMatchedListeners)
736 			{
737 				if (wrapper.handlerId == source.handlerId)
738 				{
739 					onBracketMatchedListeners[index] = null;
740 					onBracketMatchedListeners = std.algorithm.remove(onBracketMatchedListeners, index);
741 					break;
742 				}
743 			}
744 		}
745 	}
746 	OnBracketMatchedDelegateWrapper[] onBracketMatchedListeners;
747 
748 	/**
749 	 * @iter is set to a valid iterator pointing to the matching bracket
750 	 * if @state is %GTK_SOURCE_BRACKET_MATCH_FOUND. Otherwise @iter is
751 	 * meaningless.
752 	 *
753 	 * The signal is emitted only when the @state changes, typically when
754 	 * the cursor moves.
755 	 *
756 	 * A use-case for this signal is to show messages in a #GtkStatusbar.
757 	 *
758 	 * Params:
759 	 *     iter = if found, the location of the matching bracket.
760 	 *     state = state of bracket matching.
761 	 *
762 	 * Since: 2.12
763 	 */
764 	gulong addOnBracketMatched(void delegate(TextIter, GtkSourceBracketMatchType, SourceBuffer) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0)
765 	{
766 		auto wrapper = new OnBracketMatchedDelegateWrapper(dlg);
767 		wrapper.handlerId = Signals.connectData(
768 			this,
769 			"bracket-matched",
770 			cast(GCallback)&callBackBracketMatched,
771 			cast(void*)wrapper,
772 			cast(GClosureNotify)&callBackBracketMatchedDestroy,
773 			connectFlags);
774 		return wrapper.handlerId;
775 	}
776 	
777 	extern(C) static void callBackBracketMatched(GtkSourceBuffer* sourcebufferStruct, GtkTextIter* iter, GtkSourceBracketMatchType state, OnBracketMatchedDelegateWrapper wrapper)
778 	{
779 		wrapper.dlg(ObjectG.getDObject!(TextIter)(iter), state, wrapper.outer);
780 	}
781 	
782 	extern(C) static void callBackBracketMatchedDestroy(OnBracketMatchedDelegateWrapper wrapper, GClosure* closure)
783 	{
784 		wrapper.remove(wrapper);
785 	}
786 
787 	protected class OnHighlightUpdatedDelegateWrapper
788 	{
789 		void delegate(TextIter, TextIter, SourceBuffer) dlg;
790 		gulong handlerId;
791 		
792 		this(void delegate(TextIter, TextIter, SourceBuffer) dlg)
793 		{
794 			this.dlg = dlg;
795 			onHighlightUpdatedListeners ~= this;
796 		}
797 		
798 		void remove(OnHighlightUpdatedDelegateWrapper source)
799 		{
800 			foreach(index, wrapper; onHighlightUpdatedListeners)
801 			{
802 				if (wrapper.handlerId == source.handlerId)
803 				{
804 					onHighlightUpdatedListeners[index] = null;
805 					onHighlightUpdatedListeners = std.algorithm.remove(onHighlightUpdatedListeners, index);
806 					break;
807 				}
808 			}
809 		}
810 	}
811 	OnHighlightUpdatedDelegateWrapper[] onHighlightUpdatedListeners;
812 
813 	/**
814 	 * The ::highlight-updated signal is emitted when the syntax
815 	 * highlighting and [context classes][context-classes] are updated in a
816 	 * certain region of the @buffer.
817 	 *
818 	 * Params:
819 	 *     start = the start of the updated region
820 	 *     end = the end of the updated region
821 	 */
822 	gulong addOnHighlightUpdated(void delegate(TextIter, TextIter, SourceBuffer) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0)
823 	{
824 		auto wrapper = new OnHighlightUpdatedDelegateWrapper(dlg);
825 		wrapper.handlerId = Signals.connectData(
826 			this,
827 			"highlight-updated",
828 			cast(GCallback)&callBackHighlightUpdated,
829 			cast(void*)wrapper,
830 			cast(GClosureNotify)&callBackHighlightUpdatedDestroy,
831 			connectFlags);
832 		return wrapper.handlerId;
833 	}
834 	
835 	extern(C) static void callBackHighlightUpdated(GtkSourceBuffer* sourcebufferStruct, GtkTextIter* start, GtkTextIter* end, OnHighlightUpdatedDelegateWrapper wrapper)
836 	{
837 		wrapper.dlg(ObjectG.getDObject!(TextIter)(start), ObjectG.getDObject!(TextIter)(end), wrapper.outer);
838 	}
839 	
840 	extern(C) static void callBackHighlightUpdatedDestroy(OnHighlightUpdatedDelegateWrapper wrapper, GClosure* closure)
841 	{
842 		wrapper.remove(wrapper);
843 	}
844 
845 	protected class OnRedoDelegateWrapper
846 	{
847 		void delegate(SourceBuffer) dlg;
848 		gulong handlerId;
849 		
850 		this(void delegate(SourceBuffer) dlg)
851 		{
852 			this.dlg = dlg;
853 			onRedoListeners ~= this;
854 		}
855 		
856 		void remove(OnRedoDelegateWrapper source)
857 		{
858 			foreach(index, wrapper; onRedoListeners)
859 			{
860 				if (wrapper.handlerId == source.handlerId)
861 				{
862 					onRedoListeners[index] = null;
863 					onRedoListeners = std.algorithm.remove(onRedoListeners, index);
864 					break;
865 				}
866 			}
867 		}
868 	}
869 	OnRedoDelegateWrapper[] onRedoListeners;
870 
871 	/**
872 	 * The ::redo signal is emitted to redo the last undo operation.
873 	 */
874 	gulong addOnRedo(void delegate(SourceBuffer) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0)
875 	{
876 		auto wrapper = new OnRedoDelegateWrapper(dlg);
877 		wrapper.handlerId = Signals.connectData(
878 			this,
879 			"redo",
880 			cast(GCallback)&callBackRedo,
881 			cast(void*)wrapper,
882 			cast(GClosureNotify)&callBackRedoDestroy,
883 			connectFlags);
884 		return wrapper.handlerId;
885 	}
886 	
887 	extern(C) static void callBackRedo(GtkSourceBuffer* sourcebufferStruct, OnRedoDelegateWrapper wrapper)
888 	{
889 		wrapper.dlg(wrapper.outer);
890 	}
891 	
892 	extern(C) static void callBackRedoDestroy(OnRedoDelegateWrapper wrapper, GClosure* closure)
893 	{
894 		wrapper.remove(wrapper);
895 	}
896 
897 	protected class OnSourceMarkUpdatedDelegateWrapper
898 	{
899 		void delegate(TextMark, SourceBuffer) dlg;
900 		gulong handlerId;
901 		
902 		this(void delegate(TextMark, SourceBuffer) dlg)
903 		{
904 			this.dlg = dlg;
905 			onSourceMarkUpdatedListeners ~= this;
906 		}
907 		
908 		void remove(OnSourceMarkUpdatedDelegateWrapper source)
909 		{
910 			foreach(index, wrapper; onSourceMarkUpdatedListeners)
911 			{
912 				if (wrapper.handlerId == source.handlerId)
913 				{
914 					onSourceMarkUpdatedListeners[index] = null;
915 					onSourceMarkUpdatedListeners = std.algorithm.remove(onSourceMarkUpdatedListeners, index);
916 					break;
917 				}
918 			}
919 		}
920 	}
921 	OnSourceMarkUpdatedDelegateWrapper[] onSourceMarkUpdatedListeners;
922 
923 	/**
924 	 * The ::source-mark-updated signal is emitted each time
925 	 * a mark is added to, moved or removed from the @buffer.
926 	 *
927 	 * Params:
928 	 *     mark = the #GtkSourceMark
929 	 */
930 	gulong addOnSourceMarkUpdated(void delegate(TextMark, SourceBuffer) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0)
931 	{
932 		auto wrapper = new OnSourceMarkUpdatedDelegateWrapper(dlg);
933 		wrapper.handlerId = Signals.connectData(
934 			this,
935 			"source-mark-updated",
936 			cast(GCallback)&callBackSourceMarkUpdated,
937 			cast(void*)wrapper,
938 			cast(GClosureNotify)&callBackSourceMarkUpdatedDestroy,
939 			connectFlags);
940 		return wrapper.handlerId;
941 	}
942 	
943 	extern(C) static void callBackSourceMarkUpdated(GtkSourceBuffer* sourcebufferStruct, GtkTextMark* mark, OnSourceMarkUpdatedDelegateWrapper wrapper)
944 	{
945 		wrapper.dlg(ObjectG.getDObject!(TextMark)(mark), wrapper.outer);
946 	}
947 	
948 	extern(C) static void callBackSourceMarkUpdatedDestroy(OnSourceMarkUpdatedDelegateWrapper wrapper, GClosure* closure)
949 	{
950 		wrapper.remove(wrapper);
951 	}
952 
953 	protected class OnUndoDelegateWrapper
954 	{
955 		void delegate(SourceBuffer) dlg;
956 		gulong handlerId;
957 		
958 		this(void delegate(SourceBuffer) dlg)
959 		{
960 			this.dlg = dlg;
961 			onUndoListeners ~= this;
962 		}
963 		
964 		void remove(OnUndoDelegateWrapper source)
965 		{
966 			foreach(index, wrapper; onUndoListeners)
967 			{
968 				if (wrapper.handlerId == source.handlerId)
969 				{
970 					onUndoListeners[index] = null;
971 					onUndoListeners = std.algorithm.remove(onUndoListeners, index);
972 					break;
973 				}
974 			}
975 		}
976 	}
977 	OnUndoDelegateWrapper[] onUndoListeners;
978 
979 	/**
980 	 * The ::undo signal is emitted to undo the last user action which
981 	 * modified the buffer.
982 	 */
983 	gulong addOnUndo(void delegate(SourceBuffer) dlg, ConnectFlags connectFlags=cast(ConnectFlags)0)
984 	{
985 		auto wrapper = new OnUndoDelegateWrapper(dlg);
986 		wrapper.handlerId = Signals.connectData(
987 			this,
988 			"undo",
989 			cast(GCallback)&callBackUndo,
990 			cast(void*)wrapper,
991 			cast(GClosureNotify)&callBackUndoDestroy,
992 			connectFlags);
993 		return wrapper.handlerId;
994 	}
995 	
996 	extern(C) static void callBackUndo(GtkSourceBuffer* sourcebufferStruct, OnUndoDelegateWrapper wrapper)
997 	{
998 		wrapper.dlg(wrapper.outer);
999 	}
1000 	
1001 	extern(C) static void callBackUndoDestroy(OnUndoDelegateWrapper wrapper, GClosure* closure)
1002 	{
1003 		wrapper.remove(wrapper);
1004 	}
1005 }