aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--widgets/text/e-text-model-test.c8
-rw-r--r--widgets/text/e-text-model-uri.c231
-rw-r--r--widgets/text/e-text-model.c51
-rw-r--r--widgets/text/e-text-model.h5
-rw-r--r--widgets/text/e-text.c97
-rw-r--r--widgets/text/e-text.h4
6 files changed, 333 insertions, 63 deletions
diff --git a/widgets/text/e-text-model-test.c b/widgets/text/e-text-model-test.c
index 0c758cd4ba..8f528efce1 100644
--- a/widgets/text/e-text-model-test.c
+++ b/widgets/text/e-text-model-test.c
@@ -38,7 +38,9 @@ main (int argc, gchar **argv)
gnome_init ("ETextModelTest", "0.0", argc, argv);
model = e_text_model_uri_new ();
- e_text_model_set_text (model, "My favorite website is http://www.ximian.com. My next favorite is http://www.gnome.org.");
+ e_text_model_set_text (model, "My favorite website is http://www.ximian.com. My next favorite is www.assbarn.com.");
+
+ describe_model (model);
win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
@@ -52,9 +54,9 @@ main (int argc, gchar **argv)
e_text_get_type (),
"model", model,
"font", "-adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1",
- "anchor", GTK_ANCHOR_SOUTH_WEST,
+ "anchor", GTK_ANCHOR_NORTH_WEST,
"line_wrap", TRUE,
- "width", 150.0,
+ "width", 300.0,
"editable", TRUE,
NULL);
diff --git a/widgets/text/e-text-model-uri.c b/widgets/text/e-text-model-uri.c
index bd8dbb18e8..b769d0b70a 100644
--- a/widgets/text/e-text-model-uri.c
+++ b/widgets/text/e-text-model-uri.c
@@ -9,15 +9,21 @@
#include <config.h>
#include <ctype.h>
+#include <sys/types.h>
+#include <regex.h>
#include "e-text-model-uri.h"
static void e_text_model_uri_class_init (ETextModelURIClass *class);
static void e_text_model_uri_init (ETextModelURI *model);
static void e_text_model_uri_destroy (GtkObject *object);
-static void objectify_uris (ETextModelURI *model);
+static void objectify_uris (ETextModelURI *model, gint position);
static void e_text_model_uri_set_text (ETextModel *model, gchar *text);
+static void e_text_model_uri_insert (ETextModel *model, gint position, gchar *text);
+static void e_text_model_uri_insert_length (ETextModel *model, gint position, gchar *text, gint length);
+static void e_text_model_uri_delete (ETextModel *model, gint position, gint length);
+
static const gchar *e_text_model_uri_get_nth_object (ETextModel *model, gint);
static void e_text_model_uri_activate_nth_object (ETextModel *model, gint);
@@ -60,6 +66,10 @@ e_text_model_uri_class_init (ETextModelURIClass *klass)
object_class->destroy = e_text_model_uri_destroy;
model_class->set_text = e_text_model_uri_set_text;
+ model_class->insert = e_text_model_uri_insert;
+ model_class->insert_length = e_text_model_uri_insert_length;
+ model_class->delete = e_text_model_uri_delete;
+
model_class->get_nth_obj = e_text_model_uri_get_nth_object;
model_class->activate_nth_obj = e_text_model_uri_activate_nth_object;
}
@@ -78,66 +88,169 @@ e_text_model_uri_destroy (GtkObject *object)
}
-static gchar *
-extract_uri (gchar **in_str)
+/* URL regexps taken from gnome-terminal */
+static const gchar *url_regexs[3] = {
+ "(((news|telnet|nttp|file|http|ftp|https)://)|(www|ftp))[-A-Za-z0-9\\.]+(:[0-9]*)?/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\) ,\\\"]",
+ "(((news|telnet|nttp|file|http|ftp|https)://)|(www|ftp))[-A-Za-z0-9\\.]+[-A-Za-z0-9](:[0-9]*)?",
+ "mailto:[A-Za-z0-9_]+@[-A-Za-z0-9_]+\\.[-A-Za-z0-9\\.]+[-A-Za-z0-9]"
+};
+
+static void
+objectify_uris (ETextModelURI *model_uri, gint position)
{
- gchar *s = *in_str;
- if (strncmp (s, "http://", 7) == 0) {
- gint periods=0;
- gchar *uri;
+ static gboolean initialized = FALSE;
+ static regex_t re_full, re_part, re_mail;
- s += 7;
+ ETextModel *model = E_TEXT_MODEL (model_uri);
+ regmatch_t match;
+ GList *uris = NULL, *iter;
+ gint i, j, offset, last, len, objN;
+ gchar *in_str, *new_str;
+ gint new_position = position, pos_adjust=0;
- while (*s && (isalnum((gint) *s) || (*s == '.' && periods < 2))) {
- if (*s == '.')
- ++periods;
- ++s;
- }
+ if (model->text == NULL)
+ return;
+
+ if (!initialized) {
- uri = g_strndup (*in_str, s - *in_str);
- *in_str = s;
- return uri;
+ if (regcomp (&re_full, url_regexs[0], REG_EXTENDED))
+ g_error ("Regex compile failed: %s", url_regexs[0]);
+ if (regcomp (&re_part, url_regexs[1], REG_EXTENDED))
+ g_error ("Regex compile failed: %s", url_regexs[1]);
+ if (regcomp (&re_mail, url_regexs[2], REG_EXTENDED))
+ g_error ("Regex compile failed: %s", url_regexs[2]);
- } else {
- *in_str = s+1;
- return NULL;
+
+ initialized = TRUE;
}
-}
-static void
-objectify_uris (ETextModelURI *model_uri)
-{
- ETextModel *model = E_TEXT_MODEL (model_uri);
- gchar *new_text;
- gchar *src, *dest;
- GList *uris = NULL;
+ /*** Expand objects in string, keeping track of position shifts ***/
+
+ objN = e_text_model_object_count (model);
+ if (objN == 0)
+ in_str = g_strdup (model->text);
+ else {
+ gchar *src, *dest;
+
+ /* Calculate length of expanded string. */
+ len = strlen (model->text) - objN;
+ for (i=0; i<objN; ++i)
+ len += strlen (e_text_model_get_nth_object (model, i));
+
+ in_str = g_new0 (gchar, len+1);
+
+ src = model->text;
+ dest = in_str;
+ i = 0; /* object numbers */
+ j = 0; /* string position */
+ while (*src) {
+ if (*src == '\1') {
+ const gchar *src_obj;
+
+ src_obj = e_text_model_get_nth_object (model, i);
+
+ if (j < position)
+ new_position += strlen (src_obj)-1;
+
+ if (src_obj) {
+ while (*src_obj) {
+ *dest = *src_obj;
+ ++dest;
+ ++src_obj;
+ }
+ }
+
+ ++src;
+ ++i;
+ ++j;
+
+ } else {
+
+ *dest = *src;
+ ++src;
+ ++dest;
+ ++j;
+ }
+ }
+ }
- if (model->text == NULL)
- return;
+ len = strlen (in_str);
+ new_str = g_new0 (gchar, len+1);
+
+ offset = 0;
+ j = 0;
+ last = 0;
+ while (offset < len
+ && (regexec (&re_full, in_str+offset, 1, &match, 0) == 0
+ || regexec (&re_part, in_str+offset, 1, &match, 0) == 0
+ || regexec (&re_mail, in_str+offset, 1, &match, 0) == 0)) {
- new_text = g_new0 (gchar, strlen (model->text)+1);
+ gchar *uri_txt;
- src = model->text;
- dest = new_text;
+ if (offset+match.rm_so <= new_position
+ && new_position <= offset+match.rm_eo) {
+
+ /* We don't do transformations that straddle our cursor. */
+ new_str[j] = in_str[offset];
+ ++j;
+ ++offset;
- while (*src) {
- gchar *uri_str;
- gchar *next = src;
- if ( (uri_str = extract_uri (&next)) ) {
- uris = g_list_append (uris, uri_str);
- *dest = '\1';
} else {
- *dest = *src;
+
+ for (i=offset; i<offset+match.rm_so; ++i) {
+ new_str[j] = in_str[i];
+ ++j;
+ }
+
+ new_str[j] = '\1';
+ ++j;
+
+ uri_txt = g_strndup (in_str+offset+match.rm_so,
+ match.rm_eo - match.rm_so);
+ uris = g_list_append (uris, uri_txt);
+
+ if (offset+match.rm_so < new_position)
+ pos_adjust += match.rm_eo - match.rm_so - 1;
+
+ offset += match.rm_eo;
}
- ++dest;
- src = next;
+ }
+ new_position -= pos_adjust;
+
+ /* Copy the last bit over. */
+ while (offset < len) {
+ new_str[j] = in_str[offset];
+ ++j;
+ ++offset;
}
- g_free (model->text);
- model->text = new_text;
+#if 0
+ for (i=0; i<strlen(new_str); ++i) {
+ if (i == new_position)
+ putchar ('#');
+ if (new_str[i] == '\1')
+ g_print ("[\1]");
+ else
+ putchar (new_str[i]);
+ }
+ putchar ('\n');
+#endif
- /* Leaking old list */
+ for (iter = model_uri->uris; iter != NULL; iter = g_list_next (iter))
+ g_free (iter->data);
+ g_list_free (model_uri->uris);
model_uri->uris = uris;
+
+ g_free (in_str);
+
+ if (E_TEXT_MODEL_CLASS(parent_class)->set_text)
+ E_TEXT_MODEL_CLASS(parent_class)->set_text (model, new_str);
+
+ g_free (new_str);
+
+
+ if (new_position != position)
+ e_text_model_suggest_position (model, new_position);
}
static void
@@ -146,7 +259,35 @@ e_text_model_uri_set_text (ETextModel *model, gchar *text)
if (E_TEXT_MODEL_CLASS(parent_class)->set_text)
E_TEXT_MODEL_CLASS(parent_class)->set_text (model, text);
- objectify_uris (E_TEXT_MODEL_URI (model));
+ objectify_uris (E_TEXT_MODEL_URI (model), 0);
+}
+
+static void
+e_text_model_uri_insert (ETextModel *model, gint position, gchar *text)
+{
+ if (E_TEXT_MODEL_CLASS(parent_class)->insert)
+ E_TEXT_MODEL_CLASS(parent_class)->insert (model, position, text);
+
+ objectify_uris (E_TEXT_MODEL_URI (model), position + strlen (text));
+}
+
+static void
+e_text_model_uri_insert_length (ETextModel *model, gint position, gchar *text, gint length)
+{
+
+ if (E_TEXT_MODEL_CLASS(parent_class)->insert_length)
+ E_TEXT_MODEL_CLASS(parent_class)->insert_length (model, position, text, length);
+
+ objectify_uris (E_TEXT_MODEL_URI (model), position + length);
+}
+
+static void
+e_text_model_uri_delete (ETextModel *model, gint position, gint length)
+{
+ if (E_TEXT_MODEL_CLASS(parent_class)->delete)
+ E_TEXT_MODEL_CLASS(parent_class)->delete (model, position, length);
+
+ objectify_uris (E_TEXT_MODEL_URI (model), position);
}
static const gchar *
diff --git a/widgets/text/e-text-model.c b/widgets/text/e-text-model.c
index acd08ecb04..bbd442b46c 100644
--- a/widgets/text/e-text-model.c
+++ b/widgets/text/e-text-model.c
@@ -22,6 +22,7 @@
enum {
E_TEXT_MODEL_CHANGED,
+ E_TEXT_MODEL_POSITION,
E_TEXT_MODEL_LAST_SIGNAL
};
@@ -33,9 +34,9 @@ static void e_text_model_destroy (GtkObject *object);
static gchar *e_text_model_real_get_text(ETextModel *model);
static void e_text_model_real_set_text(ETextModel *model, gchar *text);
-static void e_text_model_real_insert(ETextModel *model, gint postion, gchar *text);
-static void e_text_model_real_insert_length(ETextModel *model, gint postion, gchar *text, gint length);
-static void e_text_model_real_delete(ETextModel *model, gint postion, gint length);
+static void e_text_model_real_insert(ETextModel *model, gint position, gchar *text);
+static void e_text_model_real_insert_length(ETextModel *model, gint position, gchar *text, gint length);
+static void e_text_model_real_delete(ETextModel *model, gint position, gint length);
static gint e_text_model_real_object_count(ETextModel *model);
static const gchar *e_text_model_real_get_nth_object(ETextModel *model, gint n);
@@ -95,6 +96,14 @@ e_text_model_class_init (ETextModelClass *klass)
GTK_SIGNAL_OFFSET (ETextModelClass, changed),
gtk_marshal_NONE__NONE,
GTK_TYPE_NONE, 0);
+
+ e_text_model_signals[E_TEXT_MODEL_POSITION] =
+ gtk_signal_new ("position",
+ GTK_RUN_LAST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (ETextModelClass, position),
+ gtk_marshal_NONE__INT,
+ GTK_TYPE_NONE, 1, GTK_TYPE_INT);
gtk_object_class_add_signals (object_class, e_text_model_signals, E_TEXT_MODEL_LAST_SIGNAL);
@@ -157,26 +166,42 @@ e_text_model_real_set_text(ETextModel *model, gchar *text)
static void
e_text_model_real_insert(ETextModel *model, gint position, gchar *text)
{
- gchar *temp = g_strdup_printf("%.*s%s%s", position, model->text, text, model->text + position);
+ gchar *temp;
+
+ g_return_if_fail (0<= position && position <= strlen (model->text));
+
+ temp = g_strdup_printf("%.*s%s%s", position, model->text, text, model->text + position);
+
if (model->text)
g_free(model->text);
model->text = temp;
e_text_model_changed(model);
+
+ e_text_model_suggest_position (model, position + strlen(text));
}
static void
e_text_model_real_insert_length(ETextModel *model, gint position, gchar *text, gint length)
{
- gchar *temp = g_strdup_printf("%.*s%.*s%s", position, model->text, length, text, model->text + position);
+ gchar *temp;
+
+ g_return_if_fail (0 <= position && position <= strlen (model->text));
+
+ temp = g_strdup_printf("%.*s%.*s%s", position, model->text, length, text, model->text + position);
+
if (model->text)
g_free(model->text);
model->text = temp;
e_text_model_changed(model);
+
+ e_text_model_suggest_position (model, position + length);
}
static void
e_text_model_real_delete(ETextModel *model, gint position, gint length)
{
+ g_return_if_fail (0 <= position && position <= strlen (model->text));
+
memmove(model->text + position, model->text + position + length, strlen(model->text + position + length) + 1);
e_text_model_changed(model);
}
@@ -271,6 +296,17 @@ e_text_model_delete(ETextModel *model, gint position, gint length)
E_TEXT_MODEL_CLASS(GTK_OBJECT(model)->klass)->delete(model, position, length);
}
+void
+e_text_model_suggest_position(ETextModel *model, gint position)
+{
+ g_return_if_fail (model != NULL);
+ g_return_if_fail (E_IS_TEXT_MODEL (model));
+ g_return_if_fail (0 <= position);
+ g_return_if_fail (position <= strlen (model->text));
+
+ gtk_signal_emit (GTK_OBJECT (model), e_text_model_signals[E_TEXT_MODEL_POSITION], position);
+}
+
gint
e_text_model_object_count(ETextModel *model)
{
@@ -330,11 +366,10 @@ e_text_model_strdup_expanded_text(ETextModel *model)
len -= N; /* Subtract out the \1s that signify the objects. */
for (i=0; i<N; ++i)
- len += strlen (e_text_model_get_nth_object (model ,i));
-
+ len += strlen (e_text_model_get_nth_object (model, i));
/* Next, allocate and build the expanded string. */
- expanded = g_new0 (gchar, len+1);
+ expanded = g_new0 (gchar, len+2);
src = model->text;
dest = expanded;
diff --git a/widgets/text/e-text-model.h b/widgets/text/e-text-model.h
index 7006b24eca..b8029c0e9e 100644
--- a/widgets/text/e-text-model.h
+++ b/widgets/text/e-text-model.h
@@ -43,7 +43,8 @@ struct _ETextModelClass {
GtkObjectClass parent_class;
/* Signal */
- void (* changed) (ETextModel *model);
+ void (* changed) (ETextModel *model);
+ void (* position) (ETextModel *model, gint position);
/* Virtual methods */
char *(* get_text) (ETextModel *model);
@@ -68,6 +69,8 @@ void e_text_model_insert(ETextModel *model, gint position, gchar *text);
void e_text_model_insert_length(ETextModel *model, gint position, gchar *text, gint length);
void e_text_model_delete(ETextModel *model, gint position, gint length);
+void e_text_model_suggest_position(ETextModel *model, gint position);
+
gint e_text_model_object_count(ETextModel *model);
const gchar *e_text_model_get_nth_object(ETextModel *model, gint n);
void e_text_model_activate_nth_object(ETextModel *model, gint n);
diff --git a/widgets/text/e-text.c b/widgets/text/e-text.c
index fbbe77dc0d..1427a078ca 100644
--- a/widgets/text/e-text.c
+++ b/widgets/text/e-text.c
@@ -128,6 +128,7 @@ static void e_text_get_selection(EText *text, GdkAtom selection, guint32 time);
static void e_text_supply_selection (EText *text, guint time, GdkAtom selection, guchar *data, gint length);
static void e_text_text_model_changed(ETextModel *model, EText *text);
+static void e_text_text_model_position(ETextModel *model, gint position, EText *text);
static void _get_tep(EText *text);
@@ -331,6 +332,11 @@ e_text_init (EText *text)
"changed",
GTK_SIGNAL_FUNC(e_text_text_model_changed),
text);
+ text->model_position_signal_id =
+ gtk_signal_connect(GTK_OBJECT(text->model),
+ "position",
+ GTK_SIGNAL_FUNC(e_text_text_model_position),
+ text);
text->anchor = GTK_ANCHOR_CENTER;
text->justification = GTK_JUSTIFY_LEFT;
@@ -387,6 +393,8 @@ e_text_init (EText *text)
text->dbl_timeout = 0;
text->tpl_timeout = 0;
+ text->rgba_object = 0x0000ffff;
+
text->draw_background = FALSE;
e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(text), e_text_reflow);
@@ -406,6 +414,9 @@ e_text_destroy (GtkObject *object)
if (text->model_changed_signal_id)
gtk_signal_disconnect(GTK_OBJECT(text->model),
text->model_changed_signal_id);
+ if (text->model_position_signal_id)
+ gtk_signal_disconnect(GTK_OBJECT(text->model),
+ text->model_position_signal_id);
if (text->model)
gtk_object_unref(GTK_OBJECT(text->model));
@@ -465,16 +476,48 @@ e_text_destroy (GtkObject *object)
}
static void
+fix_selection (EText *text)
+{
+ gint len = strlen (text->text);
+
+ if (text->selection_start > len) {
+ text->selection_start = len;
+ }
+ if (text->selection_end > len) {
+ text->selection_end = len;
+ }
+}
+
+static void
e_text_text_model_changed (ETextModel *model, EText *text)
{
+ gint len;
+
text->text = e_text_model_get_text(model);
+ len = strlen (text->text);
+
+ fix_selection (text);
+
e_text_free_lines(text);
gtk_signal_emit (GTK_OBJECT (text), e_text_signals[E_TEXT_CHANGED]);
+ text->needs_redraw = 1;
text->needs_split_into_lines = 1;
e_canvas_item_request_reflow (GNOME_CANVAS_ITEM(text));
}
static void
+e_text_text_model_position (ETextModel *model, gint position, EText *text)
+{
+ /*
+ For now, something very simple. We can worry about things
+ like preserving a multi-char selection later.
+ */
+
+ text->selection_start = position;
+ text->selection_end = position;
+}
+
+static void
get_bounds_item_relative (EText *text, double *px1, double *py1, double *px2, double *py2)
{
GnomeCanvasItem *item;
@@ -798,6 +841,9 @@ text_width_with_objects (ETextModel *model, gint object_num,
gchar *c;
gint width = 0;
+ if (text == NULL)
+ return 0;
+
while (*text && numbytes > 0) {
c = text;
@@ -849,11 +895,14 @@ static void
text_draw_with_objects (ETextModel *model, gint object_num,
GdkDrawable *drawable,
EFont *font, EFontStyle style,
- GdkGC *gc,
+ GdkGC *gc, GdkGC *obj_gc,
gint x, gint y,
gchar *text, gint numbytes)
{
gchar *c;
+
+ if (text == NULL)
+ return;
while (*text && numbytes > 0) {
@@ -871,16 +920,20 @@ text_draw_with_objects (ETextModel *model, gint object_num,
const gchar *obj_str;
gint start_x = x;
gint len;
+
+ if (obj_gc == NULL)
+ obj_gc = gc;
+
g_assert (object_num < e_text_model_object_count (model));
obj_str = e_text_model_get_nth_object (model, object_num);
len = strlen (obj_str);
- e_font_draw_utf8_text (drawable, font, style, gc, x, y, obj_str, len);
+ e_font_draw_utf8_text (drawable, font, style, obj_gc, x, y, obj_str, len);
x += e_font_utf8_text_width (font, style, obj_str, len);
/* We underline our objects. */
- gdk_draw_line (drawable, gc, start_x, y+1, x, y+1);
+ gdk_draw_line (drawable, obj_gc, start_x, y+1, x, y+1);
++object_num;
++c;
@@ -1169,6 +1222,9 @@ e_text_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
if ( text->model_changed_signal_id )
gtk_signal_disconnect(GTK_OBJECT(text->model),
text->model_changed_signal_id);
+ if ( text->model_position_signal_id )
+ gtk_signal_disconnect(GTK_OBJECT(text->model),
+ text->model_position_signal_id);
gtk_object_unref(GTK_OBJECT(text->model));
text->model = E_TEXT_MODEL(GTK_VALUE_OBJECT (*arg));
gtk_object_ref(GTK_OBJECT(text->model));
@@ -1178,6 +1234,11 @@ e_text_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
"changed",
GTK_SIGNAL_FUNC(e_text_text_model_changed),
text);
+ text->model_position_signal_id =
+ gtk_signal_connect(GTK_OBJECT(text->model),
+ "position",
+ GTK_SIGNAL_FUNC(e_text_text_model_position),
+ text);
e_text_free_lines(text);
@@ -1773,7 +1834,7 @@ e_text_realize (GnomeCanvasItem *item)
(* parent_class->realize) (item);
text->gc = gdk_gc_new (item->canvas->layout.bin_window);
-
+
text->i_cursor = gdk_cursor_new (GDK_XTERM);
text->default_cursor = gdk_cursor_new (GDK_LEFT_PTR);
if (text->font == NULL) {
@@ -1948,6 +2009,16 @@ e_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
canvas = GNOME_CANVAS_ITEM(text)->canvas;
fg_gc = GTK_WIDGET(canvas)->style->fg_gc[text->has_selection ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE];
+
+ if (text->rgba_object && text->gc_object == NULL && text->gc) {
+ GdkColor c;
+ c.pixel = gnome_canvas_get_color_pixel (item->canvas, text->rgba_object);
+
+ text->gc_object = gdk_gc_new (item->canvas->layout.bin_window);
+ gdk_gc_copy (text->gc_object, text->gc);
+ gdk_gc_set_foreground (text->gc_object, &c);
+ }
+
if (text->draw_borders || text->draw_background) {
gdouble thisx = item->x1 - x;
@@ -2071,6 +2142,7 @@ e_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
drawable,
text->font, E_FONT_PLAIN,
text->gc,
+ text->gc_object,
xpos - x,
ypos - y,
lines->text,
@@ -2079,6 +2151,7 @@ e_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
drawable,
text->font, E_FONT_PLAIN,
fg_gc,
+ text->gc_object,
xpos - x + text_width_with_objects (text->model, lines->first_obj,
text->font, E_FONT_PLAIN,
lines->text,
@@ -2090,6 +2163,7 @@ e_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
drawable,
text->font, E_FONT_PLAIN,
text->gc,
+ text->gc_object,
xpos - x + text_width_with_objects (text->model, lines->first_obj,
text->font, E_FONT_PLAIN,
lines->text,
@@ -2102,6 +2176,7 @@ e_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
drawable,
text->font, E_FONT_PLAIN,
text->gc,
+ text->gc_object,
xpos - x,
ypos - y,
lines->text,
@@ -2128,6 +2203,7 @@ e_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
drawable,
text->font, E_FONT_PLAIN,
text->gc,
+ text->gc_object,
xpos - x,
ypos - y,
lines->text,
@@ -2144,6 +2220,7 @@ e_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
drawable,
text->font, E_FONT_PLAIN,
text->gc,
+ text->gc_object,
xpos - x,
ypos - y,
lines->text,
@@ -3297,6 +3374,8 @@ _delete_selection(EText *text)
e_text_model_delete(text->model, text->selection_end, text->selection_start - text->selection_end);
text->selection_start = text->selection_end;
}
+
+ fix_selection (text);
}
static void
@@ -3305,8 +3384,13 @@ _insert(EText *text, char *string, int value)
if (value > 0) {
e_text_model_insert_length(text->model, text->selection_start, string, value);
- text->selection_start += value;
- text->selection_end = text->selection_start;
+ /*
+ text->selection_start += value;
+ text->selection_end = text->selection_start;
+ */
+
+ fix_selection (text);
+
}
}
@@ -3315,6 +3399,7 @@ e_text_command(ETextEventProcessor *tep, ETextEventProcessorCommand *command, gp
{
EText *text = E_TEXT(data);
int sel_start, sel_end;
+
switch (command->action) {
case E_TEP_MOVE:
text->selection_start = _get_position(text, command);
diff --git a/widgets/text/e-text.h b/widgets/text/e-text.h
index 5a1e843b7d..568402417c 100644
--- a/widgets/text/e-text.h
+++ b/widgets/text/e-text.h
@@ -110,6 +110,7 @@ struct _EText {
ETextModel *model;
gint model_changed_signal_id;
+ gint model_position_signal_id;
char *text; /* Text to display */
gpointer lines; /* Text split into lines (private field) */
@@ -210,6 +211,9 @@ struct _EText {
gint dbl_timeout; /* Double click timeout */
gint tpl_timeout; /* Triple click timeout */
+
+ guint32 rgba_object; /* RGBA color for objects */
+ GdkGC *gc_object; /* GC for drawing objects */
};
struct _ETextClass {