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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
|
/*
* e-text.h - Text item for evolution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with the program; if not, see <http://www.gnu.org/licenses/>
*
*
* Authors:
* Chris Lahey <clahey@ximian.com>
* Jon Trowbridge <trow@ximian.com>
*
* A majority of code taken from:
*
* Text item type for GnomeCanvas widget
*
* GnomeCanvas is basically a port of the Tk toolkit's most excellent
* canvas widget. Tk is copyrighted by the Regents of the University
* of California, Sun Microsystems, and other parties.
*
* Copyright (C) 1998 The Free Software Foundation
*
* Author: Federico Mena <federico@nuclecu.unam.mx>
*
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
*
*/
#ifndef E_TEXT_H
#define E_TEXT_H
#include <gtk/gtk.h>
#include <e-util/e-text-event-processor.h>
#include <text/e-text-model.h>
#include <misc/e-canvas.h>
G_BEGIN_DECLS
/* Text item for the canvas. Text items are positioned by an anchor point and an anchor direction.
*
* A clipping rectangle may be specified for the text. The rectangle is anchored at the text's anchor
* point, and is specified by clipping width and height parameters. If the clipping rectangle is
* enabled, it will clip the text.
*
* In addition, x and y offset values may be specified. These specify an offset from the anchor
* position. If used in conjunction with the clipping rectangle, these could be used to implement
* simple scrolling of the text within the clipping rectangle.
*
* The following object arguments are available:
*
* name type read/write description
* ------------------------------------------------------------------------------------------
* text string RW The string of the text label
* bold boolean RW Bold?
* justification GtkJustification RW Justification for multiline text
* fill_color string W X color specification for text
* fill_color_gdk GdkColor* RW Pointer to an allocated GdkColor
* clip_width gdouble RW Width of clip rectangle
* clip_height gdouble RW Height of clip rectangle
* clip boolean RW Use clipping rectangle?
* fill_clip_rect boolean RW Whether the text item represents itself as being the size of the clipping rectangle.
* x_offset gdouble RW Horizontal offset distance from anchor position
* y_offset gdouble RW Vertical offset distance from anchor position
* text_width gdouble R Used to query the width of the rendered text
* text_height gdouble R Used to query the rendered height of the text
* width gdouble RW A synonym for clip_width
* height gdouble R A synonym for text_height
*
* These are currently ignored in the AA version:
* editable boolean RW Can this item be edited
* use_ellipsis boolean RW Whether to use ellipsises if text gets cut off. Meaningless if clip == false.
* ellipsis string RW The characters to use as ellipsis. NULL = "...".
* line_wrap boolean RW Line wrap when not editing.
* break_characters string RW List of characters to optionally break on.
* max_lines gint RW Number of lines possible when doing line wrap.
* draw_borders boolean RW Whether to draw borders.
* draw_background boolean RW Whether to draw the background.
* draw_button boolean RW This makes EText handle being the child of a button properly and highlighting as it should.
*/
#define E_TYPE_TEXT (e_text_get_type ())
#define E_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_TEXT, EText))
#define E_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_TEXT, ETextClass))
#define E_IS_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_TEXT))
#define E_IS_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_TEXT))
typedef struct _EText EText;
typedef struct _ETextClass ETextClass;
struct _EText {
GnomeCanvasItem item;
ETextModel *model;
gint model_changed_signal_id;
gint model_repos_signal_id;
const gchar *text; /* Text to display --- from the ETextModel */
gint preedit_len; /* preedit length to display */
gint preedit_pos; /* preedit cursor position */
PangoLayout *layout;
gint num_lines; /* Number of lines of text */
gchar *revert; /* Text to revert to */
GtkJustification justification; /* Justification for text */
gdouble clip_width; /* Width of optional clip rectangle */
gdouble clip_height; /* Height of optional clip rectangle */
gdouble xofs, yofs; /* Text offset distance from anchor position */
GdkColor color; /* Fill color */
gint cx, cy; /* Top-left canvas coordinates for text */
gint text_cx, text_cy; /* Top-left canvas coordinates for text */
gint clip_cx, clip_cy; /* Top-left canvas coordinates for clip rectangle */
gint clip_cwidth, clip_cheight; /* Size of clip rectangle in pixels */
gint max_width; /* Maximum width of text lines */
gint width; /* Rendered text width in pixels */
gint height; /* Rendered text height in pixels */
guint32 rgba; /* RGBA color for text */
gdouble affine[6]; /* The item -> canvas affine */
gchar *ellipsis; /* The ellipsis characters. NULL = "...". */
gdouble ellipsis_width; /* The width of the ellipsis. */
gint xofs_edit; /* Offset because of editing */
gint yofs_edit; /* Offset because of editing */
/* This needs to be reworked a bit once we get line wrapping. */
gint selection_start; /* Start of selection IN BYTES */
gint selection_end; /* End of selection IN BYTES */
gboolean select_by_word; /* Current selection is by word */
/* This section is for drag scrolling and blinking cursor. */
gint timeout_id; /* Current timeout id for scrolling */
GTimer *timer; /* Timer for blinking cursor and scrolling */
gint lastx, lasty; /* Last x and y motion events */
gint last_state; /* Last state */
gulong scroll_start; /* Starting time for scroll (microseconds) */
gint show_cursor; /* Is cursor currently shown */
gboolean button_down; /* Is mouse button 1 down */
ETextEventProcessor *tep; /* Text Event Processor */
gint tep_command_id;
gboolean has_selection; /* TRUE if we have the selection */
guint clip : 1; /* Use clip rectangle? */
guint fill_clip_rectangle : 1; /* Fill the clipping rectangle. */
guint pointer_in : 1; /* Is the pointer currently over us? */
guint default_cursor_shown : 1; /* Is the default cursor currently shown? */
guint draw_borders : 1; /* Draw borders? */
guint draw_background : 1; /* Draw background? */
guint draw_button : 1; /* Draw button? */
guint line_wrap : 1; /* Do line wrap */
guint needs_redraw : 1; /* Needs redraw */
guint needs_recalc_bounds : 1; /* Need recalc_bounds */
guint needs_calc_height : 1; /* Need calc_height */
guint needs_split_into_lines : 1; /* Needs split_into_lines */
guint needs_reset_layout : 1; /* Needs split_into_lines */
guint bold : 1;
guint strikeout : 1;
guint tooltip_owner : 1;
guint allow_newlines : 1;
guint use_ellipsis : 1; /* Whether to use the ellipsis. */
guint editable : 1; /* Item is editable */
guint editing : 1; /* Item is currently being edited */
gchar *break_characters; /* Characters to optionally break after */
gint max_lines; /* Max number of lines (-1 = infinite) */
GdkCursor *default_cursor; /* Default cursor (arrow) */
GdkCursor *i_cursor; /* I beam cursor */
gint tooltip_timeout; /* Timeout for the tooltip */
gint tooltip_count; /* GDK_ENTER_NOTIFY count. */
gint dbl_timeout; /* Double click timeout */
gint tpl_timeout; /* Triple click timeout */
gint last_type_request; /* Last selection type requested. */
guint32 last_time_request; /* The time of the last selection request. */
GdkAtom last_selection_request; /* The time of the last selection request. */
GList *queued_requests; /* Queued selection requests. */
GtkIMContext *im_context;
gboolean need_im_reset;
gboolean im_context_signals_registered;
gboolean handle_popup;
PangoFontDescription *font_desc;
};
struct _ETextClass {
GnomeCanvasItemClass parent_class;
void (* changed) (EText *text);
void (* activate) (EText *text);
void (* keypress) (EText *text, guint keyval, guint state);
void (* populate_popup) (EText *text, GdkEventButton *ev, gint pos, GtkMenu *menu);
void (* style_set) (EText *text, GtkStyle *previous_style);
};
/* Standard Gtk function */
GType e_text_get_type (void);
void e_text_cancel_editing (EText *text);
void e_text_stop_editing (EText *text);
void e_text_delete_selection (EText *text);
void e_text_cut_clipboard (EText *text);
void e_text_copy_clipboard (EText *text);
void e_text_paste_clipboard (EText *text);
void e_text_select_all (EText *text);
G_END_DECLS
#endif
|