[gnumeric] Show input messages. [705310]
- From: Andreas J. Guelzow <guelzow src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] Show input messages. [705310]
- Date: Sun, 4 Aug 2013 22:24:25 +0000 (UTC)
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]