[gnumeric] Match item edit to entry field
- From: Andreas J. Guelzow <guelzow src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] Match item edit to entry field
- Date: Mon, 28 Nov 2011 15:58:53 +0000 (UTC)
commit 28c1d05e57b18275b6b11408b91d9dc507d2525e
Author: Andreas J Guelzow <aguelzow pyrshep ca>
Date: Mon Nov 28 08:57:47 2011 -0700
Match item edit to entry field
2011-11-28 Andreas J. Guelzow <aguelzow pyrshep ca>
* src/item-edit.c (gnm_apply_attribute_list_cb): new
(gnm_apply_attribute_list): new
(item_edit_draw): retrieve and apply range selection colour
highlights
ChangeLog | 7 ++++++
src/item-edit.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 61 insertions(+), 3 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 438eb7f..ed38228 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2011-11-28 Andreas J. Guelzow <aguelzow pyrshep ca>
+
+ * src/item-edit.c (gnm_apply_attribute_list_cb): new
+ (gnm_apply_attribute_list): new
+ (item_edit_draw): retrieve and apply range selection colour
+ highlights
+
2011-11-27 Morten Welinder <terra gnome org>
* src/gnm-pane.c (gnm_pane_rangesel_start)
diff --git a/src/item-edit.c b/src/item-edit.c
index a893946..782a07d 100644
--- a/src/item-edit.c
+++ b/src/item-edit.c
@@ -91,6 +91,28 @@ get_top_left (ItemEdit const *ie, int *top, int *left, PangoDirection dir)
}
}
+static gboolean
+gnm_apply_attribute_list_cb (PangoAttribute *attribute,
+ gpointer data)
+{
+ PangoAttrList *attrs = data;
+ if (attribute->klass->type == PANGO_ATTR_FOREGROUND) {
+ PangoAttribute *copy = pango_attribute_copy (attribute);
+ pango_attr_list_change (attrs, copy);
+ }
+ return FALSE;
+}
+
+static void
+gnm_apply_attribute_list (PangoAttrList *attrs, PangoAttrList *added_attrs)
+{
+ if (added_attrs == NULL)
+ return;
+ pango_attr_list_unref (pango_attr_list_filter (added_attrs,
+ gnm_apply_attribute_list_cb,
+ attrs));
+}
+
static void
item_edit_draw (GocItem const *item, cairo_t *cr)
{
@@ -102,6 +124,23 @@ item_edit_draw (GocItem const *item, cairo_t *cr)
PangoRectangle pos, weak;
char const *text = gtk_entry_get_text (ie->entry);
PangoDirection dir = pango_find_base_dir (text, -1);
+ PangoLayout *layout = gtk_entry_get_layout (ie->entry);
+ PangoAttrList *entry_attributes = pango_layout_get_attributes (layout);
+ int len;
+
+ if (go_pango_attr_list_is_empty (entry_attributes))
+ entry_attributes = NULL;
+ else if (0 == (len = gtk_entry_text_index_to_layout_index (ie->entry, 0))) {
+ entry_attributes = pango_attr_list_copy (entry_attributes);
+ } else {
+ PangoAttrList *attributes = pango_attr_list_copy (entry_attributes);
+ go_pango_attr_list_erase (attributes, 0, len);
+ if (go_pango_attr_list_is_empty (attributes)) {
+ pango_attr_list_unref (attributes);
+ entry_attributes = NULL;
+ } else
+ entry_attributes = attributes;
+ }
get_top_left (ie, &top, &left, dir);
if (goc_canvas_get_direction (item->canvas) == GOC_DIRECTION_RTL) {
@@ -158,13 +197,24 @@ item_edit_draw (GocItem const *item, cairo_t *cr)
attr->start_index = start;
attr->end_index = end;
pango_attr_list_change (attrs, attr);
+ gnm_apply_attribute_list (attrs, entry_attributes);
+ pango_layout_set_attributes (ie->layout, attrs);
+ pango_attr_list_unref (attrs);
+ pango_cairo_show_layout (cr, ie->layout);
+ pango_layout_set_attributes (ie->layout, orig);
+ pango_attr_list_unref (orig);
+ } else if (entry_attributes != NULL) {
+ PangoAttrList *orig = pango_attr_list_ref (pango_layout_get_attributes (ie->layout)),
+ *attrs = pango_attr_list_copy (orig);
+ gnm_apply_attribute_list (attrs, entry_attributes);
pango_layout_set_attributes (ie->layout, attrs);
pango_attr_list_unref (attrs);
pango_cairo_show_layout (cr, ie->layout);
pango_layout_set_attributes (ie->layout, orig);
pango_attr_list_unref (orig);
- } else
+ } else {
pango_cairo_show_layout (cr, ie->layout);
+ }
if (ie->cursor_visible) {
int cursor_pos = gtk_editable_get_position (GTK_EDITABLE (ie->entry));
double incr = (dir == PANGO_DIRECTION_RTL)? -.5: .5, x, ytop, ybottom;
@@ -222,7 +272,7 @@ item_edit_distance (GocItem *item, double cx, double cy,
}
static gboolean
-item_edit_enter_notify (GocItem *item, double x, double y)
+item_edit_enter_notify (GocItem *item, G_GNUC_UNUSED double x, G_GNUC_UNUSED double y)
{
gnm_widget_set_cursor_type (GTK_WIDGET (item->canvas), GDK_XTERM);
return TRUE;
@@ -340,7 +390,8 @@ item_edit_motion (GocItem *item, double x, double y)
}
static gboolean
-item_edit_button_released (GocItem *item, int button, G_GNUC_UNUSED double x, G_GNUC_UNUSED double y)
+item_edit_button_released (GocItem *item, G_GNUC_UNUSED int button,
+ G_GNUC_UNUSED double x, G_GNUC_UNUSED double y)
{
ItemEdit *ie = ITEM_EDIT (item);
if (ie->sel_start >= 0) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]