summaryrefslogtreecommitdiff
path: root/e-util/e-text.h
blob: 4ff99bdd962de20a365a683091d380ad22fb6be7 (plain)
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
241
242
243
244
245
246
247
248
249
250
251
252
253
/*
 * 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 Lesser General Public License as published by
 * published by the Free Software Foundation; either the
 *
 * 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 General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this 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)
 *
 */

#if !defined (__E_UTIL_H_INSIDE__) && !defined (LIBEUTIL_COMPILATION)
#error "Only <e-util/e-util.h> should be included directly."
#endif

#ifndef E_TEXT_H
#define E_TEXT_H

#include <gtk/gtk.h>

#include <e-util/e-canvas.h>
#include <e-util/e-text-event-processor.h>
#include <e-util/e-text-model.h>

/* 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.
 */

/* Standard GObject macros */
#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(cls) \
	(G_TYPE_CHECK_CLASS_CAST \
	((cls), E_TYPE_TEXT, ETextClass))
#define E_IS_TEXT(obj) \
	(G_TYPE_CHECK_INSTANCE_TYPE \
	((obj), E_TYPE_TEXT))
#define E_IS_TEXT_CLASS(cls) \
	(G_TYPE_CHECK_CLASS_TYPE \
	((cls), E_TYPE_TEXT))
#define E_TEXT_GET_CLASS(obj) \
	(G_TYPE_INSTANCE_GET_CLASS \
	((obj), E_TYPE_TEXT, ETextClass))

G_BEGIN_DECLS

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 */

	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 */
	gboolean rgba_set;		/* whether RGBA is set */

	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 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 italic : 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,
						 GdkEvent *button_event,
						 gint pos,
						 GtkMenu *menu);
	void		(*style_updated)	(EText *text);
};

GType		e_text_get_type			(void) G_GNUC_CONST;
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 /* E_TEXT_H */