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