]> Pileus Git - ~andy/gtk/blob - gtk/gtktextbtree.h
fix assertion failure by creating the line data, but not validating it at
[~andy/gtk] / gtk / gtktextbtree.h
1 #ifndef GTK_TEXT_BTREE_H
2 #define GTK_TEXT_BTREE_H
3
4 #include <gtk/gtktextbuffer.h>
5 #include <gtk/gtktexttag.h>
6 #include <gtk/gtktextmark.h>
7 #include <gtk/gtktextchild.h>
8 #include <gtk/gtktextsegment.h>
9 #include <gtk/gtktextiter.h>
10
11 #ifdef __cplusplus
12 extern "C" {
13 #endif /* __cplusplus */
14
15 GtkTextBTree  *_gtk_text_btree_new        (GtkTextTagTable *table,
16                                            GtkTextBuffer   *buffer);
17 void           _gtk_text_btree_ref        (GtkTextBTree    *tree);
18 void           _gtk_text_btree_unref      (GtkTextBTree    *tree);
19 GtkTextBuffer *_gtk_text_btree_get_buffer (GtkTextBTree    *tree);
20
21
22 guint _gtk_text_btree_get_chars_changed_stamp    (GtkTextBTree *tree);
23 guint _gtk_text_btree_get_segments_changed_stamp (GtkTextBTree *tree);
24 void  _gtk_text_btree_segments_changed           (GtkTextBTree *tree);
25
26 gboolean _gtk_text_btree_is_end (GtkTextBTree       *tree,
27                                  GtkTextLine        *line,
28                                  GtkTextLineSegment *seg,
29                                  int                 byte_index,
30                                  int                 char_offset);
31
32 /* Indexable segment mutation */
33
34 void _gtk_text_btree_delete        (GtkTextIter *start,
35                                     GtkTextIter *end);
36 void _gtk_text_btree_insert        (GtkTextIter *iter,
37                                     const gchar *text,
38                                     gint         len);
39 void _gtk_text_btree_insert_pixbuf (GtkTextIter *iter,
40                                     GdkPixbuf   *pixbuf);
41
42 void _gtk_text_btree_insert_child_anchor (GtkTextIter        *iter,
43                                           GtkTextChildAnchor *anchor);
44
45 void _gtk_text_btree_unregister_child_anchor (GtkTextChildAnchor *anchor);
46
47 /* View stuff */
48 GtkTextLine *_gtk_text_btree_find_line_by_y    (GtkTextBTree      *tree,
49                                                 gpointer           view_id,
50                                                 gint               ypixel,
51                                                 gint              *line_top_y);
52 gint         _gtk_text_btree_find_line_top     (GtkTextBTree      *tree,
53                                                 GtkTextLine       *line,
54                                                 gpointer           view_id);
55 void         _gtk_text_btree_add_view          (GtkTextBTree      *tree,
56                                                 GtkTextLayout     *layout);
57 void         _gtk_text_btree_remove_view       (GtkTextBTree      *tree,
58                                                 gpointer           view_id);
59 void         _gtk_text_btree_invalidate_region (GtkTextBTree      *tree,
60                                                 const GtkTextIter *start,
61                                                 const GtkTextIter *end);
62 void         _gtk_text_btree_get_view_size     (GtkTextBTree      *tree,
63                                                 gpointer           view_id,
64                                                 gint              *width,
65                                                 gint              *height);
66 gboolean     _gtk_text_btree_is_valid          (GtkTextBTree      *tree,
67                                                 gpointer           view_id);
68 gboolean     _gtk_text_btree_validate          (GtkTextBTree      *tree,
69                                                 gpointer           view_id,
70                                                 gint               max_pixels,
71                                                 gint              *y,
72                                                 gint              *old_height,
73                                                 gint              *new_height);
74 void         _gtk_text_btree_validate_line     (GtkTextBTree      *tree,
75                                                 GtkTextLine       *line,
76                                                 gpointer           view_id);
77
78 /* Tag */
79
80 void _gtk_text_btree_tag (const GtkTextIter *start,
81                           const GtkTextIter *end,
82                           GtkTextTag        *tag,
83                           gboolean           apply);
84
85 /* "Getters" */
86
87 GtkTextLine * _gtk_text_btree_get_line          (GtkTextBTree      *tree,
88                                                  gint               line_number,
89                                                  gint              *real_line_number);
90 GtkTextLine * _gtk_text_btree_get_line_no_last  (GtkTextBTree      *tree,
91                                                  gint               line_number,
92                                                  gint              *real_line_number);
93 GtkTextLine * _gtk_text_btree_get_end_iter_line (GtkTextBTree      *tree);
94 GtkTextLine * _gtk_text_btree_get_line_at_char  (GtkTextBTree      *tree,
95                                                  gint               char_index,
96                                                  gint              *line_start_index,
97                                                  gint              *real_char_index);
98 GtkTextTag**  _gtk_text_btree_get_tags          (const GtkTextIter *iter,
99                                                  gint              *num_tags);
100 gchar        *_gtk_text_btree_get_text          (const GtkTextIter *start,
101                                                  const GtkTextIter *end,
102                                                  gboolean           include_hidden,
103                                                  gboolean           include_nonchars);
104 gint          _gtk_text_btree_line_count        (GtkTextBTree      *tree);
105 gint          _gtk_text_btree_char_count        (GtkTextBTree      *tree);
106 gboolean      _gtk_text_btree_char_is_invisible (const GtkTextIter *iter);
107
108
109
110 /* Get iterators (these are implemented in gtktextiter.c) */
111 void     _gtk_text_btree_get_iter_at_char         (GtkTextBTree       *tree,
112                                                    GtkTextIter        *iter,
113                                                    gint                char_index);
114 void     _gtk_text_btree_get_iter_at_line_char    (GtkTextBTree       *tree,
115                                                    GtkTextIter        *iter,
116                                                    gint                line_number,
117                                                    gint                char_index);
118 void     _gtk_text_btree_get_iter_at_line_byte    (GtkTextBTree       *tree,
119                                                    GtkTextIter        *iter,
120                                                    gint                line_number,
121                                                    gint                byte_index);
122 gboolean _gtk_text_btree_get_iter_from_string     (GtkTextBTree       *tree,
123                                                    GtkTextIter        *iter,
124                                                    const gchar        *string);
125 gboolean _gtk_text_btree_get_iter_at_mark_name    (GtkTextBTree       *tree,
126                                                    GtkTextIter        *iter,
127                                                    const gchar        *mark_name);
128 void     _gtk_text_btree_get_iter_at_mark         (GtkTextBTree       *tree,
129                                                    GtkTextIter        *iter,
130                                                    GtkTextMark        *mark);
131 void     _gtk_text_btree_get_end_iter             (GtkTextBTree       *tree,
132                                                    GtkTextIter        *iter);
133 void     _gtk_text_btree_get_iter_at_line         (GtkTextBTree       *tree,
134                                                    GtkTextIter        *iter,
135                                                    GtkTextLine        *line,
136                                                    gint                byte_offset);
137 gboolean _gtk_text_btree_get_iter_at_first_toggle (GtkTextBTree       *tree,
138                                                    GtkTextIter        *iter,
139                                                    GtkTextTag         *tag);
140 gboolean _gtk_text_btree_get_iter_at_last_toggle  (GtkTextBTree       *tree,
141                                                    GtkTextIter        *iter,
142                                                    GtkTextTag         *tag);
143
144 void     _gtk_text_btree_get_iter_at_child_anchor  (GtkTextBTree       *tree,
145                                                     GtkTextIter        *iter,
146                                                     GtkTextChildAnchor *anchor);
147
148
149
150 /* Manipulate marks */
151 GtkTextMark        *_gtk_text_btree_set_mark                (GtkTextBTree       *tree,
152                                                              GtkTextMark         *existing_mark,
153                                                              const gchar        *name,
154                                                              gboolean            left_gravity,
155                                                              const GtkTextIter  *index,
156                                                              gboolean           should_exist);
157 void                _gtk_text_btree_remove_mark_by_name     (GtkTextBTree       *tree,
158                                                              const gchar        *name);
159 void                _gtk_text_btree_remove_mark             (GtkTextBTree       *tree,
160                                                              GtkTextMark        *segment);
161 gboolean            _gtk_text_btree_get_selection_bounds    (GtkTextBTree       *tree,
162                                                              GtkTextIter        *start,
163                                                              GtkTextIter        *end);
164 void                _gtk_text_btree_place_cursor            (GtkTextBTree       *tree,
165                                                              const GtkTextIter  *where);
166 gboolean            _gtk_text_btree_mark_is_insert          (GtkTextBTree       *tree,
167                                                              GtkTextMark        *segment);
168 gboolean            _gtk_text_btree_mark_is_selection_bound (GtkTextBTree       *tree,
169                                                              GtkTextMark        *segment);
170 GtkTextMark        *_gtk_text_btree_get_mark_by_name        (GtkTextBTree       *tree,
171                                                              const gchar        *name);
172 GtkTextLine *       _gtk_text_btree_first_could_contain_tag (GtkTextBTree       *tree,
173                                                              GtkTextTag         *tag);
174 GtkTextLine *       _gtk_text_btree_last_could_contain_tag  (GtkTextBTree       *tree,
175                                                              GtkTextTag         *tag);
176
177 /* Lines */
178
179 /* Chunk of data associated with a line; views can use this to store
180    info at the line. They should "subclass" the header struct here. */
181 struct _GtkTextLineData {
182   gpointer view_id;
183   GtkTextLineData *next;
184   gint height;
185   gint width : 24;
186   gint valid : 8;
187 };
188
189 /*
190  * The data structure below defines a single line of text (from newline
191  * to newline, not necessarily what appears on one line of the screen).
192  *
193  * You can consider this line a "paragraph" also
194  */
195
196 struct _GtkTextLine {
197   GtkTextBTreeNode *parent;             /* Pointer to parent node containing
198                                          * line. */
199   GtkTextLine *next;            /* Next in linked list of lines with
200                                  * same parent node in B-tree.  NULL
201                                  * means end of list. */
202   GtkTextLineSegment *segments; /* First in ordered list of segments
203                                  * that make up the line. */
204   GtkTextLineData *views;      /* data stored here by views */
205 };
206
207
208 gint                _gtk_text_line_get_number                 (GtkTextLine         *line);
209 gboolean            _gtk_text_line_char_has_tag               (GtkTextLine         *line,
210                                                                GtkTextBTree        *tree,
211                                                                gint                 char_in_line,
212                                                                GtkTextTag          *tag);
213 gboolean            _gtk_text_line_byte_has_tag               (GtkTextLine         *line,
214                                                                GtkTextBTree        *tree,
215                                                                gint                 byte_in_line,
216                                                                GtkTextTag          *tag);
217 gboolean            _gtk_text_line_is_last                    (GtkTextLine         *line,
218                                                                GtkTextBTree        *tree);
219 gboolean            _gtk_text_line_contains_end_iter          (GtkTextLine         *line,
220                                                                GtkTextBTree        *tree);
221 GtkTextLine *       _gtk_text_line_next                       (GtkTextLine         *line);
222 GtkTextLine *       _gtk_text_line_next_excluding_last        (GtkTextLine         *line);
223 GtkTextLine *       _gtk_text_line_previous                   (GtkTextLine         *line);
224 void                _gtk_text_line_add_data                   (GtkTextLine         *line,
225                                                                GtkTextLineData     *data);
226 gpointer            _gtk_text_line_remove_data                (GtkTextLine         *line,
227                                                                gpointer             view_id);
228 gpointer            _gtk_text_line_get_data                   (GtkTextLine         *line,
229                                                                gpointer             view_id);
230 void                _gtk_text_line_invalidate_wrap            (GtkTextLine         *line,
231                                                                GtkTextLineData     *ld);
232 gint                _gtk_text_line_char_count                 (GtkTextLine         *line);
233 gint                _gtk_text_line_byte_count                 (GtkTextLine         *line);
234 gint                _gtk_text_line_char_index                 (GtkTextLine         *line);
235 GtkTextLineSegment *_gtk_text_line_byte_to_segment            (GtkTextLine         *line,
236                                                                gint                 byte_offset,
237                                                                gint                *seg_offset);
238 GtkTextLineSegment *_gtk_text_line_char_to_segment            (GtkTextLine         *line,
239                                                                gint                 char_offset,
240                                                                gint                *seg_offset);
241 gboolean            _gtk_text_line_byte_locate                (GtkTextLine         *line,
242                                                                gint                 byte_offset,
243                                                                GtkTextLineSegment **segment,
244                                                                GtkTextLineSegment **any_segment,
245                                                                gint                *seg_byte_offset,
246                                                                gint                *line_byte_offset);
247 gboolean            _gtk_text_line_char_locate                (GtkTextLine         *line,
248                                                                gint                 char_offset,
249                                                                GtkTextLineSegment **segment,
250                                                                GtkTextLineSegment **any_segment,
251                                                                gint                *seg_char_offset,
252                                                                gint                *line_char_offset);
253 void                _gtk_text_line_byte_to_char_offsets       (GtkTextLine         *line,
254                                                                gint                 byte_offset,
255                                                                gint                *line_char_offset,
256                                                                gint                *seg_char_offset);
257 void                _gtk_text_line_char_to_byte_offsets       (GtkTextLine         *line,
258                                                                gint                 char_offset,
259                                                                gint                *line_byte_offset,
260                                                                gint                *seg_byte_offset);
261 GtkTextLineSegment *_gtk_text_line_byte_to_any_segment        (GtkTextLine         *line,
262                                                                gint                 byte_offset,
263                                                                gint                *seg_offset);
264 GtkTextLineSegment *_gtk_text_line_char_to_any_segment        (GtkTextLine         *line,
265                                                                gint                 char_offset,
266                                                                gint                *seg_offset);
267 gint                _gtk_text_line_byte_to_char               (GtkTextLine         *line,
268                                                                gint                 byte_offset);
269 gint                _gtk_text_line_char_to_byte               (GtkTextLine         *line,
270                                                                gint                 char_offset);
271 GtkTextLine    *    _gtk_text_line_next_could_contain_tag     (GtkTextLine         *line,
272                                                                GtkTextBTree        *tree,
273                                                                GtkTextTag          *tag);
274 GtkTextLine    *    _gtk_text_line_previous_could_contain_tag (GtkTextLine         *line,
275                                                                GtkTextBTree        *tree,
276                                                                GtkTextTag          *tag);
277
278 GtkTextLineData    *_gtk_text_line_data_new                   (GtkTextLayout     *layout,
279                                                                GtkTextLine       *line);
280
281 /* Debug */
282 void _gtk_text_btree_check (GtkTextBTree *tree);
283 void _gtk_text_btree_spew (GtkTextBTree *tree);
284 extern gboolean _gtk_text_view_debug_btree;
285
286 /* ignore, exported only for gtktextsegment.c */
287 void _gtk_toggle_segment_check_func (GtkTextLineSegment *segPtr,
288                                      GtkTextLine        *line);
289 void _gtk_change_node_toggle_count  (GtkTextBTreeNode   *node,
290                                      GtkTextTagInfo     *info,
291                                      gint                delta);
292
293 /* for gtktextmark.c */
294 void _gtk_text_btree_release_mark_segment (GtkTextBTree       *tree,
295                                            GtkTextLineSegment *segment);
296
297 /* for coordination with the tag table */
298 void _gtk_text_btree_notify_will_remove_tag (GtkTextBTree *tree,
299                                              GtkTextTag   *tag);
300
301 #ifdef __cplusplus
302 }
303 #endif /* __cplusplus */
304
305 #endif
306
307