1 /* GTK - The GIMP Toolkit
2  * gtktextiter.h Copyright (C) 2000 Red Hat, Inc.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 /*
19  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
20  * file for a list of people on the GTK+ Team.  See the ChangeLog
21  * files for a list of changes.  These files are distributed with
22  * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
23  */
24 
25 #ifndef __GTK_TEXT_ITER_H__
26 #define __GTK_TEXT_ITER_H__
27 
28 #if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
29 #error "Only <gtk/gtk.h> can be included directly."
30 #endif
31 
32 #include <gtk/gtktextattributes.h>
33 #include <gtk/gtktextchild.h>
34 #include <gtk/gtktexttag.h>
35 
36 G_BEGIN_DECLS
37 
38 /**
39  * GtkTextSearchFlags:
40  * @GTK_TEXT_SEARCH_VISIBLE_ONLY: Search only visible data. A search match may
41  * have invisible text interspersed.
42  * @GTK_TEXT_SEARCH_TEXT_ONLY: Search only text. A match may have pixbufs or
43  * child widgets mixed inside the matched range.
44  * @GTK_TEXT_SEARCH_CASE_INSENSITIVE: The text will be matched regardless of
45  * what case it is in.
46  *
47  * Flags affecting how a search is done.
48  *
49  * If neither #GTK_TEXT_SEARCH_VISIBLE_ONLY nor #GTK_TEXT_SEARCH_TEXT_ONLY are
50  * enabled, the match must be exact; the special 0xFFFC character will match
51  * embedded pixbufs or child widgets.
52  */
53 typedef enum {
54   GTK_TEXT_SEARCH_VISIBLE_ONLY     = 1 << 0,
55   GTK_TEXT_SEARCH_TEXT_ONLY        = 1 << 1,
56   GTK_TEXT_SEARCH_CASE_INSENSITIVE = 1 << 2
57   /* Possible future plans: SEARCH_REGEXP */
58 } GtkTextSearchFlags;
59 
60 /*
61  * Iter: represents a location in the text. Becomes invalid if the
62  * characters/pixmaps/widgets (indexable objects) in the text buffer
63  * are changed.
64  */
65 
66 typedef struct _GtkTextBuffer GtkTextBuffer;
67 
68 #define GTK_TYPE_TEXT_ITER     (gtk_text_iter_get_type ())
69 
70 struct _GtkTextIter {
71   /* GtkTextIter is an opaque datatype; ignore all these fields.
72    * Initialize the iter with gtk_text_buffer_get_iter_*
73    * functions
74    */
75   /*< private >*/
76   gpointer dummy1;
77   gpointer dummy2;
78   gint dummy3;
79   gint dummy4;
80   gint dummy5;
81   gint dummy6;
82   gint dummy7;
83   gint dummy8;
84   gpointer dummy9;
85   gpointer dummy10;
86   gint dummy11;
87   gint dummy12;
88   /* padding */
89   gint dummy13;
90   gpointer dummy14;
91 };
92 
93 
94 /* This is primarily intended for language bindings that want to avoid
95    a "buffer" argument to text insertions, deletions, etc. */
96 GDK_AVAILABLE_IN_ALL
97 GtkTextBuffer *gtk_text_iter_get_buffer (const GtkTextIter *iter);
98 
99 /*
100  * Life cycle
101  */
102 
103 GDK_AVAILABLE_IN_ALL
104 GtkTextIter *gtk_text_iter_copy     (const GtkTextIter *iter);
105 GDK_AVAILABLE_IN_ALL
106 void         gtk_text_iter_free     (GtkTextIter       *iter);
107 GDK_AVAILABLE_IN_3_2
108 void         gtk_text_iter_assign   (GtkTextIter       *iter,
109                                      const GtkTextIter *other);
110 
111 GDK_AVAILABLE_IN_ALL
112 GType        gtk_text_iter_get_type (void) G_GNUC_CONST;
113 
114 /*
115  * Convert to different kinds of index
116  */
117 
118 GDK_AVAILABLE_IN_ALL
119 gint gtk_text_iter_get_offset      (const GtkTextIter *iter);
120 GDK_AVAILABLE_IN_ALL
121 gint gtk_text_iter_get_line        (const GtkTextIter *iter);
122 GDK_AVAILABLE_IN_ALL
123 gint gtk_text_iter_get_line_offset (const GtkTextIter *iter);
124 GDK_AVAILABLE_IN_ALL
125 gint gtk_text_iter_get_line_index  (const GtkTextIter *iter);
126 
127 GDK_AVAILABLE_IN_ALL
128 gint gtk_text_iter_get_visible_line_offset (const GtkTextIter *iter);
129 GDK_AVAILABLE_IN_ALL
130 gint gtk_text_iter_get_visible_line_index (const GtkTextIter *iter);
131 
132 
133 /*
134  * “Dereference” operators
135  */
136 GDK_AVAILABLE_IN_ALL
137 gunichar gtk_text_iter_get_char          (const GtkTextIter  *iter);
138 
139 /* includes the 0xFFFC char for pixmaps/widgets, so char offsets
140  * into the returned string map properly into buffer char offsets
141  */
142 GDK_AVAILABLE_IN_ALL
143 gchar   *gtk_text_iter_get_slice         (const GtkTextIter  *start,
144                                           const GtkTextIter  *end);
145 
146 /* includes only text, no 0xFFFC */
147 GDK_AVAILABLE_IN_ALL
148 gchar   *gtk_text_iter_get_text          (const GtkTextIter  *start,
149                                           const GtkTextIter  *end);
150 /* exclude invisible chars */
151 GDK_AVAILABLE_IN_ALL
152 gchar   *gtk_text_iter_get_visible_slice (const GtkTextIter  *start,
153                                           const GtkTextIter  *end);
154 GDK_AVAILABLE_IN_ALL
155 gchar   *gtk_text_iter_get_visible_text  (const GtkTextIter  *start,
156                                           const GtkTextIter  *end);
157 
158 GDK_AVAILABLE_IN_ALL
159 GdkPixbuf* gtk_text_iter_get_pixbuf (const GtkTextIter *iter);
160 GDK_AVAILABLE_IN_ALL
161 GSList  *  gtk_text_iter_get_marks  (const GtkTextIter *iter);
162 
163 GDK_AVAILABLE_IN_ALL
164 GtkTextChildAnchor* gtk_text_iter_get_child_anchor (const GtkTextIter *iter);
165 
166 /* Return list of tags toggled at this point (toggled_on determines
167  * whether the list is of on-toggles or off-toggles)
168  */
169 GDK_AVAILABLE_IN_ALL
170 GSList  *gtk_text_iter_get_toggled_tags  (const GtkTextIter  *iter,
171                                           gboolean            toggled_on);
172 
173 GDK_AVAILABLE_IN_3_20
174 gboolean gtk_text_iter_starts_tag        (const GtkTextIter  *iter,
175                                           GtkTextTag         *tag);
176 
177 GDK_DEPRECATED_IN_3_20_FOR(gtk_text_iter_starts_tag)
178 gboolean gtk_text_iter_begins_tag        (const GtkTextIter  *iter,
179                                           GtkTextTag         *tag);
180 
181 GDK_AVAILABLE_IN_ALL
182 gboolean gtk_text_iter_ends_tag          (const GtkTextIter  *iter,
183                                           GtkTextTag         *tag);
184 
185 GDK_AVAILABLE_IN_ALL
186 gboolean gtk_text_iter_toggles_tag       (const GtkTextIter  *iter,
187                                           GtkTextTag         *tag);
188 
189 GDK_AVAILABLE_IN_ALL
190 gboolean gtk_text_iter_has_tag           (const GtkTextIter   *iter,
191                                           GtkTextTag          *tag);
192 GDK_AVAILABLE_IN_ALL
193 GSList  *gtk_text_iter_get_tags          (const GtkTextIter   *iter);
194 
195 GDK_AVAILABLE_IN_ALL
196 gboolean gtk_text_iter_editable          (const GtkTextIter   *iter,
197                                           gboolean             default_setting);
198 GDK_AVAILABLE_IN_ALL
199 gboolean gtk_text_iter_can_insert        (const GtkTextIter   *iter,
200                                           gboolean             default_editability);
201 
202 GDK_AVAILABLE_IN_ALL
203 gboolean gtk_text_iter_starts_word        (const GtkTextIter   *iter);
204 GDK_AVAILABLE_IN_ALL
205 gboolean gtk_text_iter_ends_word          (const GtkTextIter   *iter);
206 GDK_AVAILABLE_IN_ALL
207 gboolean gtk_text_iter_inside_word        (const GtkTextIter   *iter);
208 GDK_AVAILABLE_IN_ALL
209 gboolean gtk_text_iter_starts_sentence    (const GtkTextIter   *iter);
210 GDK_AVAILABLE_IN_ALL
211 gboolean gtk_text_iter_ends_sentence      (const GtkTextIter   *iter);
212 GDK_AVAILABLE_IN_ALL
213 gboolean gtk_text_iter_inside_sentence    (const GtkTextIter   *iter);
214 GDK_AVAILABLE_IN_ALL
215 gboolean gtk_text_iter_starts_line        (const GtkTextIter   *iter);
216 GDK_AVAILABLE_IN_ALL
217 gboolean gtk_text_iter_ends_line          (const GtkTextIter   *iter);
218 GDK_AVAILABLE_IN_ALL
219 gboolean gtk_text_iter_is_cursor_position (const GtkTextIter   *iter);
220 
221 GDK_AVAILABLE_IN_ALL
222 gint     gtk_text_iter_get_chars_in_line (const GtkTextIter   *iter);
223 GDK_AVAILABLE_IN_ALL
224 gint     gtk_text_iter_get_bytes_in_line (const GtkTextIter   *iter);
225 
226 GDK_AVAILABLE_IN_ALL
227 gboolean       gtk_text_iter_get_attributes (const GtkTextIter *iter,
228 					     GtkTextAttributes *values);
229 GDK_AVAILABLE_IN_ALL
230 PangoLanguage* gtk_text_iter_get_language   (const GtkTextIter *iter);
231 GDK_AVAILABLE_IN_ALL
232 gboolean       gtk_text_iter_is_end         (const GtkTextIter *iter);
233 GDK_AVAILABLE_IN_ALL
234 gboolean       gtk_text_iter_is_start       (const GtkTextIter *iter);
235 
236 /*
237  * Moving around the buffer
238  */
239 
240 GDK_AVAILABLE_IN_ALL
241 gboolean gtk_text_iter_forward_char         (GtkTextIter *iter);
242 GDK_AVAILABLE_IN_ALL
243 gboolean gtk_text_iter_backward_char        (GtkTextIter *iter);
244 GDK_AVAILABLE_IN_ALL
245 gboolean gtk_text_iter_forward_chars        (GtkTextIter *iter,
246                                              gint         count);
247 GDK_AVAILABLE_IN_ALL
248 gboolean gtk_text_iter_backward_chars       (GtkTextIter *iter,
249                                              gint         count);
250 GDK_AVAILABLE_IN_ALL
251 gboolean gtk_text_iter_forward_line         (GtkTextIter *iter);
252 GDK_AVAILABLE_IN_ALL
253 gboolean gtk_text_iter_backward_line        (GtkTextIter *iter);
254 GDK_AVAILABLE_IN_ALL
255 gboolean gtk_text_iter_forward_lines        (GtkTextIter *iter,
256                                              gint         count);
257 GDK_AVAILABLE_IN_ALL
258 gboolean gtk_text_iter_backward_lines       (GtkTextIter *iter,
259                                              gint         count);
260 GDK_AVAILABLE_IN_ALL
261 gboolean gtk_text_iter_forward_word_end     (GtkTextIter *iter);
262 GDK_AVAILABLE_IN_ALL
263 gboolean gtk_text_iter_backward_word_start  (GtkTextIter *iter);
264 GDK_AVAILABLE_IN_ALL
265 gboolean gtk_text_iter_forward_word_ends    (GtkTextIter *iter,
266                                              gint         count);
267 GDK_AVAILABLE_IN_ALL
268 gboolean gtk_text_iter_backward_word_starts (GtkTextIter *iter,
269                                              gint         count);
270 
271 GDK_AVAILABLE_IN_ALL
272 gboolean gtk_text_iter_forward_visible_line   (GtkTextIter *iter);
273 GDK_AVAILABLE_IN_ALL
274 gboolean gtk_text_iter_backward_visible_line  (GtkTextIter *iter);
275 GDK_AVAILABLE_IN_ALL
276 gboolean gtk_text_iter_forward_visible_lines  (GtkTextIter *iter,
277                                                gint         count);
278 GDK_AVAILABLE_IN_ALL
279 gboolean gtk_text_iter_backward_visible_lines (GtkTextIter *iter,
280                                                gint         count);
281 
282 GDK_AVAILABLE_IN_ALL
283 gboolean gtk_text_iter_forward_visible_word_end     (GtkTextIter *iter);
284 GDK_AVAILABLE_IN_ALL
285 gboolean gtk_text_iter_backward_visible_word_start  (GtkTextIter *iter);
286 GDK_AVAILABLE_IN_ALL
287 gboolean gtk_text_iter_forward_visible_word_ends    (GtkTextIter *iter,
288                                              gint         count);
289 GDK_AVAILABLE_IN_ALL
290 gboolean gtk_text_iter_backward_visible_word_starts (GtkTextIter *iter,
291                                              gint         count);
292 
293 GDK_AVAILABLE_IN_ALL
294 gboolean gtk_text_iter_forward_sentence_end     (GtkTextIter *iter);
295 GDK_AVAILABLE_IN_ALL
296 gboolean gtk_text_iter_backward_sentence_start  (GtkTextIter *iter);
297 GDK_AVAILABLE_IN_ALL
298 gboolean gtk_text_iter_forward_sentence_ends    (GtkTextIter *iter,
299                                                  gint         count);
300 GDK_AVAILABLE_IN_ALL
301 gboolean gtk_text_iter_backward_sentence_starts (GtkTextIter *iter,
302                                                  gint         count);
303 /* cursor positions are almost equivalent to chars, but not quite;
304  * in some languages, you can’t put the cursor between certain
305  * chars. Also, you can’t put the cursor between \r\n at the end
306  * of a line.
307  */
308 GDK_AVAILABLE_IN_ALL
309 gboolean gtk_text_iter_forward_cursor_position   (GtkTextIter *iter);
310 GDK_AVAILABLE_IN_ALL
311 gboolean gtk_text_iter_backward_cursor_position  (GtkTextIter *iter);
312 GDK_AVAILABLE_IN_ALL
313 gboolean gtk_text_iter_forward_cursor_positions  (GtkTextIter *iter,
314                                                   gint         count);
315 GDK_AVAILABLE_IN_ALL
316 gboolean gtk_text_iter_backward_cursor_positions (GtkTextIter *iter,
317                                                   gint         count);
318 
319 GDK_AVAILABLE_IN_ALL
320 gboolean gtk_text_iter_forward_visible_cursor_position   (GtkTextIter *iter);
321 GDK_AVAILABLE_IN_ALL
322 gboolean gtk_text_iter_backward_visible_cursor_position  (GtkTextIter *iter);
323 GDK_AVAILABLE_IN_ALL
324 gboolean gtk_text_iter_forward_visible_cursor_positions  (GtkTextIter *iter,
325                                                           gint         count);
326 GDK_AVAILABLE_IN_ALL
327 gboolean gtk_text_iter_backward_visible_cursor_positions (GtkTextIter *iter,
328                                                           gint         count);
329 
330 GDK_AVAILABLE_IN_ALL
331 void     gtk_text_iter_set_offset         (GtkTextIter *iter,
332                                            gint         char_offset);
333 GDK_AVAILABLE_IN_ALL
334 void     gtk_text_iter_set_line           (GtkTextIter *iter,
335                                            gint         line_number);
336 GDK_AVAILABLE_IN_ALL
337 void     gtk_text_iter_set_line_offset    (GtkTextIter *iter,
338                                            gint         char_on_line);
339 GDK_AVAILABLE_IN_ALL
340 void     gtk_text_iter_set_line_index     (GtkTextIter *iter,
341                                            gint         byte_on_line);
342 GDK_AVAILABLE_IN_ALL
343 void     gtk_text_iter_forward_to_end     (GtkTextIter *iter);
344 GDK_AVAILABLE_IN_ALL
345 gboolean gtk_text_iter_forward_to_line_end (GtkTextIter *iter);
346 
347 GDK_AVAILABLE_IN_ALL
348 void     gtk_text_iter_set_visible_line_offset (GtkTextIter *iter,
349                                                 gint         char_on_line);
350 GDK_AVAILABLE_IN_ALL
351 void     gtk_text_iter_set_visible_line_index  (GtkTextIter *iter,
352                                                 gint         byte_on_line);
353 
354 /* returns TRUE if a toggle was found; NULL for the tag pointer
355  * means “any tag toggle”, otherwise the next toggle of the
356  * specified tag is located.
357  */
358 GDK_AVAILABLE_IN_ALL
359 gboolean gtk_text_iter_forward_to_tag_toggle (GtkTextIter *iter,
360                                               GtkTextTag  *tag);
361 
362 GDK_AVAILABLE_IN_ALL
363 gboolean gtk_text_iter_backward_to_tag_toggle (GtkTextIter *iter,
364                                                GtkTextTag  *tag);
365 
366 typedef gboolean (* GtkTextCharPredicate) (gunichar ch, gpointer user_data);
367 
368 GDK_AVAILABLE_IN_ALL
369 gboolean gtk_text_iter_forward_find_char  (GtkTextIter          *iter,
370                                            GtkTextCharPredicate  pred,
371                                            gpointer              user_data,
372                                            const GtkTextIter    *limit);
373 GDK_AVAILABLE_IN_ALL
374 gboolean gtk_text_iter_backward_find_char (GtkTextIter          *iter,
375                                            GtkTextCharPredicate  pred,
376                                            gpointer              user_data,
377                                            const GtkTextIter    *limit);
378 
379 GDK_AVAILABLE_IN_ALL
380 gboolean gtk_text_iter_forward_search  (const GtkTextIter *iter,
381                                         const gchar       *str,
382                                         GtkTextSearchFlags flags,
383                                         GtkTextIter       *match_start,
384                                         GtkTextIter       *match_end,
385                                         const GtkTextIter *limit);
386 
387 GDK_AVAILABLE_IN_ALL
388 gboolean gtk_text_iter_backward_search (const GtkTextIter *iter,
389                                         const gchar       *str,
390                                         GtkTextSearchFlags flags,
391                                         GtkTextIter       *match_start,
392                                         GtkTextIter       *match_end,
393                                         const GtkTextIter *limit);
394 
395 /*
396  * Comparisons
397  */
398 GDK_AVAILABLE_IN_ALL
399 gboolean gtk_text_iter_equal           (const GtkTextIter *lhs,
400                                         const GtkTextIter *rhs);
401 GDK_AVAILABLE_IN_ALL
402 gint     gtk_text_iter_compare         (const GtkTextIter *lhs,
403                                         const GtkTextIter *rhs);
404 GDK_AVAILABLE_IN_ALL
405 gboolean gtk_text_iter_in_range        (const GtkTextIter *iter,
406                                         const GtkTextIter *start,
407                                         const GtkTextIter *end);
408 
409 /* Put these two in ascending order */
410 GDK_AVAILABLE_IN_ALL
411 void     gtk_text_iter_order           (GtkTextIter *first,
412                                         GtkTextIter *second);
413 
414 G_END_DECLS
415 
416 #endif
417