[gnumeric] Show input messages. [705310]



commit 55aa911c22ccd0c2c5458c717aa885bea5f59ea7
Author: Andreas J Guelzow <aguelzow pyrshep ca>
Date:   Sun Aug 4 16:23:17 2013 -0600

    Show input messages. [705310]
    
    2013-08-04  Andreas J. Guelzow <aguelzow pyrshep ca>
    
        * src/sheet-control-gui-priv.h (_SheetControlGUI): add fields
        * src/sheet-control-gui.c (scg_init): init new fields
        (scg_im_destroy): new
        (scg_finalize): call scg_im_destroy
        (cb_cell_im_timer): new
        (scg_find_pane): new
        (scg_show_im_tooltip): new
        (scg_class_init): init new field
        * src/sheet-control-priv.h: add field
        * src/sheet-control.c: add virtual
        * src/sheet-control.h: add virtual
        * src/sheet-view.c (sheet_view_edit_pos_tool_tips): new
        (sv_update): call sheet_view_edit_pos_tool_tips
        * src/sheet.c (sheet_col_get_distance_pixels): the defaults need to be
        in pixels
        (sheet_row_get_distance_pixels): new
        * src/sheet.h (sheet_row_get_distance_pixels): new

 ChangeLog                    |   20 +++++++
 NEWS                         |    1 +
 src/sheet-control-gui-priv.h |    6 ++
 src/sheet-control-gui.c      |  127 ++++++++++++++++++++++++++++++++++++++++++
 src/sheet-control-priv.h     |    2 +
 src/sheet-control.c          |    3 +
 src/sheet-control.h          |    3 +
 src/sheet-view.c             |   21 +++++++
 src/sheet.c                  |   39 +++++++++++++-
 src/sheet.h                  |    2 +-
 10 files changed, 222 insertions(+), 2 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 34217a5..3dbc1bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2013-08-04  Andreas J. Guelzow <aguelzow pyrshep ca>
+
+       * src/sheet-control-gui-priv.h (_SheetControlGUI): add fields
+       * src/sheet-control-gui.c (scg_init): init new fields
+       (scg_im_destroy): new
+       (scg_finalize): call scg_im_destroy
+       (cb_cell_im_timer): new
+       (scg_find_pane): new
+       (scg_show_im_tooltip): new
+       (scg_class_init): init new field
+       * src/sheet-control-priv.h: add field
+       * src/sheet-control.c: add virtual
+       * src/sheet-control.h: add virtual
+       * src/sheet-view.c (sheet_view_edit_pos_tool_tips): new
+       (sv_update): call sheet_view_edit_pos_tool_tips
+       * src/sheet.c (sheet_col_get_distance_pixels): the defaults need to be
+       in pixels
+       (sheet_row_get_distance_pixels): new
+       * src/sheet.h (sheet_row_get_distance_pixels): new
+
 2013-08-03  Jean Brefort  <jean brefort normalesup org>
 
        * src/sheet-object-graph.c (gnm_sogg_prep_sax_parser): accept <graph:Type>
diff --git a/NEWS b/NEWS
index 4f345c1..1fb55f0 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,7 @@ Andreas:
        * Implement input message editing. [Part of #705310]
        * Fix export of input-message only validations. [#705384]
        * Fix warnings. [Part of #705313]
+       * Show input messages. [705310]
 
 Jean:
        * Fix text wrap inside sheet objects. [#704417]
diff --git a/src/sheet-control-gui-priv.h b/src/sheet-control-gui-priv.h
index 3ec919a..c666aed 100644
--- a/src/sheet-control-gui-priv.h
+++ b/src/sheet-control-gui-priv.h
@@ -55,6 +55,12 @@ struct _SheetControlGUI {
                int          x, y;
        } comment;
 
+       /* im */
+       struct {
+               GtkWidget   *item;
+               int          timer;
+       } im;
+
        struct {
                int             timer, counter, n;
                gboolean        jump, horiz;
diff --git a/src/sheet-control-gui.c b/src/sheet-control-gui.c
index 341dae9..d6aac39 100644
--- a/src/sheet-control-gui.c
+++ b/src/sheet-control-gui.c
@@ -63,6 +63,7 @@
 #include "item-cursor.h"
 #include "widgets/gnumeric-expr-entry.h"
 #include "gnm-sheet-slicer.h"
+#include "input-msg.h"
 
 #include <go-data-slicer-field.h>
 #include <goffice/goffice.h>
@@ -717,6 +718,9 @@ scg_init (SheetControlGUI *scg)
 
        scg->grab_stack = 0;
        scg->selected_objects = NULL;
+
+       scg->im.item = NULL;
+       scg->im.timer = 0;
 }
 
 /*************************************************************************/
@@ -1740,6 +1744,18 @@ scg_comment_timer_clear (SheetControlGUI *scg)
 }
 
 static void
+scg_im_destroy (SheetControlGUI *scg) {
+       if (scg->im.timer != 0) {
+               g_source_remove (scg->im.timer);
+               scg->im.timer = 0;
+       }
+       if (scg->im.item) {
+               gtk_widget_destroy (scg->im.item);
+               scg->im.item = NULL;
+       }       
+}
+
+static void
 scg_finalize (GObject *object)
 {
        SheetControlGUI *scg = SHEET_CONTROL_GUI (object);
@@ -1769,6 +1785,8 @@ scg_finalize (GObject *object)
        }
        scg_comment_unselect (scg, scg->comment.selected);
 
+       scg_im_destroy (scg);
+
        if (sc->view) {
                Sheet *sheet = sv_sheet (sc->view);
                g_signal_handlers_disconnect_by_func (sheet, scg_adjust_preferences, scg);
@@ -3665,6 +3683,114 @@ scg_scale_changed (SheetControl *sc)
                sheet_object_update_bounds (SHEET_OBJECT (ptr->data), NULL);
 }
 
+static gboolean
+cb_cell_im_timer (SheetControlGUI *scg)
+{
+       g_return_val_if_fail (IS_SHEET_CONTROL_GUI (scg), FALSE);
+       g_return_val_if_fail (scg->im.timer != 0, FALSE);
+
+       scg->im.timer = 0;
+       scg_im_destroy (scg);
+       return FALSE;
+}
+
+static GnmPane *
+scg_find_pane (SheetControlGUI *scg, GnmCellPos *pos)
+{
+       int i;
+
+       for (i = 0; i < scg->active_panes; i++) {
+               GnmPane *pane = scg->pane[i];
+
+               if (pane->first.col <= pos->col &&
+                   pane->first.row <= pos->row &&
+                   pane->last_visible.col >= pos->col &&
+                   pane->last_visible.row >= pos->row)
+                       return pane;
+       }
+       return NULL;
+}
+
+static void
+scg_show_im_tooltip (SheetControl *sc, GnmInputMsg *im, GnmCellPos *pos)
+{
+       SheetControlGUI *scg = (SheetControlGUI *)sc;
+       GnmPane *pane;
+
+       g_return_if_fail (IS_SHEET_CONTROL_GUI (scg));
+
+       scg_im_destroy (scg);
+
+       pane = scg_find_pane (scg, pos);
+
+       if (im && pane) {
+               GtkWidget *label, *box;
+               char const *text, *title;
+               int len_text, len_title;
+               int x, y, x_origin, y_origin;
+               GtkAllocation allocation;
+       
+               text = gnm_input_msg_get_msg   (im);
+               title = gnm_input_msg_get_title (im);
+               len_text = (text == NULL) ? 0 : strlen (text);
+               len_title = (title == NULL) ? 0 : strlen (title);
+
+               if ((len_text == 0) && (len_title == 0))
+                       return;
+
+               box = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE);
+
+               if (len_title > 0) {
+                       PangoAttrList *attrs;
+                       PangoAttribute *attr;
+
+                       label = gtk_label_new (title);
+
+                       attrs = pango_attr_list_new ();
+                       attr = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
+                       attr->start_index = 0;
+                       attr->end_index = G_MAXINT;
+                       pango_attr_list_insert (attrs, attr);
+                       gtk_label_set_attributes (GTK_LABEL (label), attrs);
+                       pango_attr_list_unref (attrs);
+
+                       gtk_widget_set_halign (label, GTK_ALIGN_START);
+                       gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
+               }
+               if (len_text > 0) {
+                       label = gtk_label_new (text);
+
+                       gtk_widget_set_halign (label, GTK_ALIGN_START);
+                       gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
+                       if (len_title > 0)
+                               gtk_box_set_spacing (GTK_BOX (box), 10);
+               }               
+               gnumeric_convert_to_tooltip (GTK_WIDGET (scg->grid), box);
+               scg->im.item = gtk_widget_get_toplevel (box);
+
+               x = sheet_col_get_distance_pixels
+                       (scg_sheet (scg), pane->first.col, pos->col + 1);
+               
+               y = sheet_row_get_distance_pixels
+                       (scg_sheet (scg), pane->first.row, pos->row + 1);
+
+               gtk_widget_get_allocation (GTK_WIDGET (pane), &allocation);
+               x += allocation.x;
+               y += allocation.y;
+
+               gdk_window_get_position 
+                       (gtk_widget_get_parent_window (GTK_WIDGET (pane)), 
+                        &x_origin, &y_origin);
+               x += x_origin;
+               y += y_origin;
+
+               gtk_window_move (GTK_WINDOW (scg->im.item), x + 10, y + 10);
+               gtk_widget_show_all (scg->im.item);
+               scg->im.timer = g_timeout_add (1500, (GSourceFunc)cb_cell_im_timer, scg);
+       }
+}
+
+
 
 static void
 scg_class_init (GObjectClass *object_class)
@@ -3691,6 +3817,7 @@ scg_class_init (GObjectClass *object_class)
        sc_class->set_panes                = scg_set_panes;
        sc_class->object_create_view       = scg_object_create_view;
        sc_class->scale_changed            = scg_scale_changed;
+       sc_class->show_im_tooltip          = scg_show_im_tooltip;
 }
 
 GSF_CLASS (SheetControlGUI, sheet_control_gui,
diff --git a/src/sheet-control-priv.h b/src/sheet-control-priv.h
index 26ddcd0..a48b1b6 100644
--- a/src/sheet-control-priv.h
+++ b/src/sheet-control-priv.h
@@ -35,6 +35,8 @@ typedef struct {
        void (*set_panes)               (SheetControl *sc);
        void (*object_create_view)      (SheetControl *sc, SheetObject *so);
        void (*scale_changed)           (SheetControl *sc);
+       void (*show_im_tooltip)         (SheetControl *sc, 
+                                        GnmInputMsg *im, GnmCellPos *pos);
 } SheetControlClass;
 
 #define SHEET_CONTROL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), SHEET_CONTROL_TYPE, SheetControlClass))
diff --git a/src/sheet-control.c b/src/sheet-control.c
index 87f6a4f..acb4695 100644
--- a/src/sheet-control.c
+++ b/src/sheet-control.c
@@ -136,3 +136,6 @@ SC_VIRTUAL (set_panes, (SheetControl *sc), (sc))
 SC_VIRTUAL (object_create_view,        (SheetControl *sc, SheetObject *so), (sc, so))
 SC_VIRTUAL (scale_changed,     (SheetControl *sc), (sc))
 
+SC_VIRTUAL (show_im_tooltip,   (SheetControl *sc, GnmInputMsg *im, GnmCellPos *pos), (sc, im, pos))
+
+
diff --git a/src/sheet-control.h b/src/sheet-control.h
index bc0772a..0d8e736 100644
--- a/src/sheet-control.h
+++ b/src/sheet-control.h
@@ -46,6 +46,9 @@ void sc_set_panes             (SheetControl *sc);
 void sc_object_create_view     (SheetControl *sc, SheetObject *so);
 void sc_scale_changed          (SheetControl *sc);
 
+void sc_show_im_tooltip         (SheetControl *sc, 
+                                GnmInputMsg *im, GnmCellPos *pos);
+
 G_END_DECLS
 
 #endif /* _GNM_SHEET_CONTROL_H_ */
diff --git a/src/sheet-view.c b/src/sheet-view.c
index a2033e1..c9e3508 100644
--- a/src/sheet-view.c
+++ b/src/sheet-view.c
@@ -1,3 +1,4 @@
+/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
  * sheet-view.c:
  *
@@ -42,6 +43,8 @@
 #include "expr-name.h"
 #include "command-context.h"
 #include "gnumeric-conf.h"
+#include "sheet-style.h"
+#include "mstyle.h"
 
 #include <gsf/gsf-impl-utils.h>
 
@@ -636,6 +639,23 @@ sv_flag_selection_change (SheetView *sv)
        sv->selection_content_changed = TRUE;
 }
 
+static void
+sheet_view_edit_pos_tool_tips (SheetView *sv)
+{
+       GnmStyle const *style;
+       GnmInputMsg     *im = NULL;
+
+       style = sheet_style_get (sv->sheet,
+                                sv->edit_pos.col,
+                                sv->edit_pos.row);
+       if (style != NULL && gnm_style_is_element_set (style, MSTYLE_INPUT_MSG))
+               im = gnm_style_get_input_msg (style);
+
+       /* We need to call these even with im == NULL to remove the old tooltip.*/
+       SHEET_VIEW_FOREACH_CONTROL (sv, control,
+                                   sc_show_im_tooltip (control, im, &sv->edit_pos););
+}
+
 void
 sv_update (SheetView *sv)
 {
@@ -661,6 +681,7 @@ sv_update (SheetView *sv)
                                (sv, sc, wb_control_menu_state_update
                                 (sc_wbc (sc),
                                  MS_COMMENT_LINKS | MS_PAGE_BREAKS););
+                       sheet_view_edit_pos_tool_tips (sv);
                }
        }
 
diff --git a/src/sheet.c b/src/sheet.c
index 1d03996..f2a5f23 100644
--- a/src/sheet.c
+++ b/src/sheet.c
@@ -5580,7 +5580,7 @@ sheet_col_get_distance_pixels (Sheet const *sheet, int from, int to)
        g_return_val_if_fail (to <= gnm_sheet_get_max_cols (sheet), 1);
 
        /* Do not use colrow_foreach, it ignores empties */
-       dflt =  sheet->cols.default_style.size_pts;
+       dflt =  sheet_col_get_default_size_pixels (sheet);
        for (i = from ; i < to ; ++i) {
                if (NULL == (ci = sheet_col_get (sheet, i)))
                        pixels += dflt;
@@ -5748,6 +5748,43 @@ sheet_row_get_distance_pts (Sheet const *sheet, int from, int to)
 }
 
 /**
+ * sheet_row_get_distance_pixels:
+ *
+ * Return the number of pixels between from_row to to_row
+ * measured from the upper left corner.
+ */
+int
+sheet_row_get_distance_pixels (Sheet const *sheet, int from, int to)
+{
+       ColRowInfo const *ci;
+       int dflt, pixels = 0, sign = 1;
+       int i;
+
+       g_return_val_if_fail (IS_SHEET (sheet), 1.);
+
+       if (from > to) {
+               int const tmp = to;
+               to = from;
+               from = tmp;
+               sign = -1;
+       }
+
+       g_return_val_if_fail (from >= 0, 1);
+       g_return_val_if_fail (to <= gnm_sheet_get_max_rows (sheet), 1);
+
+       /* Do not use colrow_foreach, it ignores empties */
+       dflt =  sheet_row_get_default_size_pixels (sheet);
+       for (i = from ; i < to ; ++i) {
+               if (NULL == (ci = sheet_row_get (sheet, i)))
+                       pixels += dflt;
+               else if (ci->visible)
+                       pixels += ci->size_pixels;
+       }
+
+       return pixels * sign;
+}
+
+/**
  * sheet_row_set_size_pts:
  * @sheet:      The sheet
  * @row:        The row
diff --git a/src/sheet.h b/src/sheet.h
index e216bad..6d9a565 100644
--- a/src/sheet.h
+++ b/src/sheet.h
@@ -237,7 +237,7 @@ void    sheet_col_set_default_size_pixels (Sheet *sheet, int width_pixels);
 
 /* Row height */
 double  sheet_row_get_distance_pts       (Sheet const *sheet, int from_row, int to_row);
-
+int     sheet_row_get_distance_pixels     (Sheet const *sheet, int from, int to);
 void    sheet_row_set_size_pts           (Sheet *sheet, int row, double height_pts,
                                           gboolean set_by_user);
 void    sheet_row_set_size_pixels        (Sheet *sheet, int row, int height_pixels,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]