1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
// included by gtk2.pas
{$IFDEF read_forward_definitions}
{$ENDIF read_forward_definitions}
//------------------------------------------------------------------------------
{$IFDEF read_interface_types}
PGtkTextLineSegment = ^TGtkTextLineSegment;
PGtkTextLineSegmentClass = ^TGtkTextLineSegmentClass;
{
Segments: each line is divided into one or more segments, where each
segment is one of several things, such as a group of characters, a
tag toggle, a mark, or an embedded widget. Each segment starts with
a standard header followed by a body that varies from type to type.
}
{ This header has the segment type, and two specific segments
(character and toggle segments) }
{ Information a BTree stores about a tag. }
{ highest-level node containing the tag }
{ total toggles of this tag below tag_root }
PGtkTextTagInfo = ^TGtkTextTagInfo;
TGtkTextTagInfo = record
tag : PGtkTextTag;
tag_root : PGtkTextBTreeNode;
toggle_count : gint;
end;
{ Body of a segment that toggles a tag on or off }
{ Tag that starts or ends here. }
{ TRUE means this toggle has been
accounted for in node toggle
counts; FALSE means it hasn't, yet. }
PGtkTextToggleBody = ^TGtkTextToggleBody;
TGtkTextToggleBody = record
info : PGtkTextTagInfo;
inNodeCounts : gboolean;
end;
{
The data structure below defines line segments.
}
{ Pointer to record describing
segment's type. }
{ Next in list of segments for this
line, or NULL for theEnd of list. }
{ # of chars of index space occupied }
{ Size of this segment (# of bytes
of index space it occupies). }
{ Characters that make up character
info. Actual length varies to
hold as many characters as needed. }
{ Information about tag toggle. }
{ Information about mark. }
{ Child pixbuf }
{ Child widget }
TGtkTextLineSegment = record
_type : PGtkTextLineSegmentClass;
next : PGtkTextLineSegment;
char_count : longint;
byte_count : longint;
body : record
case longint of
0 : ( chars : array[0..3] of char );
1 : ( toggle : TGtkTextToggleBody );
2 : ( mark : TGtkTextMarkBody );
3 : ( pixbuf : TGtkTextPixbuf );
4 : ( child : TGtkTextChildBody );
end;
end;
{ Class struct for segments }
{ Split seg at index, returning list of two new segments, and freeing seg }
PGtkTextSegSplitFunc = ^TGtkTextSegSplitFunc;
TGtkTextSegSplitFunc = TGtkTextLineSegment;
{ Delete seg which is contained in line; if tree_gone, the tree is being
freed in its entirety, which may matter for some reason (?)
Return TRUE if the segment is not deleteable, e.g. a mark.
}
TGtkTextSegDeleteFunc = function (seg:PGtkTextLineSegment; line:PGtkTextLine; tree_gone:gboolean):gboolean; cdecl;
{ Called after segment structure of line changes, so segments can
cleanup (e.g. merge with adjacent segments). Returns a segment list
to replace the original segment list with. The line argument is
the current line.
}
PGtkTextSegCleanupFunc = ^TGtkTextSegCleanupFunc;
TGtkTextSegCleanupFunc = TGtkTextLineSegment;
{ Called when a segment moves from one line to another. CleanupFunc is also
called in that case, so many segments just use CleanupFunc, I'm not sure
what's up with that (this function may not be needed...)
}
TGtkTextSegLineChangeFunc = procedure (seg:PGtkTextLineSegment; line:PGtkTextLine); cdecl;
{ Called to do debug checks on the segment. }
TGtkTextSegCheckFunc = procedure (seg:PGtkTextLineSegment; line:PGtkTextLine); cdecl;
{ Name of this kind of segment. }
{ If a segment has zero size (e.g. a
mark or tag toggle), does it
attach to character to its left
or right? 1 means left, 0 means
right. }
{ Procedure to split large segment
into two smaller ones. }
{ Procedure to call to delete
segment. }
{ After any change to a line, this
procedure is invoked for all
segments left in the line to
perform any cleanup they wish
(e.g. joining neighboring
segments). }
{ Invoked when a segment is about
to be moved from its current line
to an earlier line because of
a deletion. The line is that
for the segment's old line.
CleanupFunc will be invoked after
the deletion is finished. }
{ Called during consistency checks
to check internal consistency of
segment. }
TGtkTextLineSegmentClass = record
name : Pchar;
leftGravity : gboolean;
splitFunc : TGtkTextSegSplitFunc;
deleteFunc : TGtkTextSegDeleteFunc;
cleanupFunc : TGtkTextSegCleanupFunc;
lineChangeFunc : TGtkTextSegLineChangeFunc;
checkFunc : TGtkTextSegCheckFunc;
end;
{$ENDIF read_interface_types}
//------------------------------------------------------------------------------
{$IFDEF read_interface_rest}
function gtk_text_line_segment_split(iter:PGtkTextIter):PGtkTextLineSegment; cdecl; external gtklib;
function _gtk_char_segment_new(text:Pgchar; len:guint):PGtkTextLineSegment; cdecl; external gtklib;
function _gtk_char_segment_new_from_two_strings(text1:Pgchar; len1:guint; text2:Pgchar; len2:guint):PGtkTextLineSegment; cdecl; external gtklib;
function _gtk_toggle_segment_new(info:PGtkTextTagInfo; StateOn:gboolean):PGtkTextLineSegment; cdecl; external gtklib;
{$ENDIF read_interface_rest}
|