gnumeric r16776 - in trunk: . src



Author: mortenw
Date: Fri Sep  5 15:09:00 2008
New Revision: 16776
URL: http://svn.gnome.org/viewvc/gnumeric?rev=16776&view=rev

Log:
2008-09-05  Morten Welinder  <terra gnome org>

	* src/cell.c (gnm_cell_get_displayed_text): New function.

	* src/rendered-value.c (gnm_rendered_value_new): Use
	gnm_cell_get_displayed_text.  Fixes #550902.
	* src/workbook-view.c (wb_view_edit_line_set): Ditto.



Modified:
   trunk/ChangeLog
   trunk/NEWS
   trunk/src/cell.c
   trunk/src/cell.h
   trunk/src/rendered-value.c
   trunk/src/workbook-view.c

Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS	(original)
+++ trunk/NEWS	Fri Sep  5 15:09:00 2008
@@ -17,6 +17,9 @@
 	* Understand and ignore byte-order markers for CSV/stf probing and
 	  importing. [#549743]
 
+Morten:
+	* Fix display of array formulas.  [#550902]
+
 --------------------------------------------------------------------------
 Gnumeric 1.9.2
 

Modified: trunk/src/cell.c
==============================================================================
--- trunk/src/cell.c	(original)
+++ trunk/src/cell.c	Fri Sep  5 15:09:00 2008
@@ -26,6 +26,7 @@
 #include "sheet-style.h"
 #include "parse-util.h"
 #include <goffice/utils/go-glib-extras.h>
+#include <goffice/utils/go-locale.h>
 
 /**
  * gnm_cell_cleanout :
@@ -564,6 +565,50 @@
 }
 
 
+char *
+gnm_cell_get_displayed_text (GnmCell const *cell)
+{
+	if (gnm_cell_has_expr (cell)) {
+		GnmExprTop const *texpr = cell->base.texpr;
+		GnmCell const *corner = NULL;
+		int x = 0, y = 0;
+
+		if (gnm_expr_top_is_array_corner (texpr))
+			corner = cell;
+		else if (gnm_expr_top_is_array_elem (texpr, &x, &y)) {
+			corner = sheet_cell_get
+				(cell->base.sheet,
+				 cell->pos.col - x,
+				 cell->pos.row - y);
+		}
+
+		if (corner) {
+			GnmExprArrayCorner const *ac =
+				gnm_cell_is_array_corner (corner);
+			GnmParsePos pp;
+			GnmConventionsOut out;
+
+			out.accum = g_string_new ("={");
+			out.pp = parse_pos_init_cell (&pp, cell);
+			out.convs = cell->base.sheet->convs;
+
+			gnm_expr_top_as_gstring (cell->base.texpr, &out);
+
+			g_string_append_printf (out.accum,
+						"}(%d%c%d)[%d][%d]",
+						ac->cols,
+						go_locale_get_arg_sep (),
+						ac->rows,
+						x, y);
+
+			return g_string_free (out.accum, FALSE);
+		}
+	}
+
+	return gnm_cell_get_entered_text (cell);
+}
+
+
 /*
  * Return the height of the rendered layout after rotation.
  */

Modified: trunk/src/cell.h
==============================================================================
--- trunk/src/cell.h	(original)
+++ trunk/src/cell.h	Fri Sep  5 15:09:00 2008
@@ -83,11 +83,12 @@
 void	gnm_cell_set_format		(GnmCell *cell, char const *format);
 
 void	gnm_cell_render_value		(GnmCell *cell, gboolean allow_variable_width);
-int	gnm_cell_rendered_height	(GnmCell const * cell);
-int	gnm_cell_rendered_width		(GnmCell const * cell);	/* excludes offset */
-int	gnm_cell_rendered_offset	(GnmCell const * cell);
-GOColor gnm_cell_get_render_color	(GnmCell const * cell);
-char *	gnm_cell_get_entered_text	(GnmCell const * cell);
+int	gnm_cell_rendered_height	(GnmCell const *cell);
+int	gnm_cell_rendered_width		(GnmCell const *cell);	/* excludes offset */
+int	gnm_cell_rendered_offset	(GnmCell const *cell);
+GOColor gnm_cell_get_render_color	(GnmCell const *cell);
+char *	gnm_cell_get_entered_text	(GnmCell const *cell);
+char *  gnm_cell_get_displayed_text     (GnmCell const *cell);
 char *  gnm_cell_get_rendered_text	(GnmCell *cell);
 
 G_END_DECLS

Modified: trunk/src/rendered-value.c
==============================================================================
--- trunk/src/rendered-value.c	(original)
+++ trunk/src/rendered-value.c	Fri Sep  5 15:09:00 2008
@@ -341,17 +341,9 @@
 	res->numeric_overflow = FALSE;
 
 	if (displayed_formula) {
-		GnmParsePos pp;
-		GnmConventionsOut out;
-
-		out.accum = g_string_new ("=");
-		out.convs = sheet->convs;
-		out.pp    = &pp;
-
-		parse_pos_init_cell (&pp, cell),
-		gnm_expr_top_as_gstring (cell->base.texpr, &out);
-		pango_layout_set_text (layout, out.accum->str, out.accum->len);
-		g_string_free (out.accum, TRUE);
+		char *text = gnm_cell_get_displayed_text (cell);
+		pango_layout_set_text (layout, text, -1);
+		g_free (text);
 		fore = 0;
 		res->might_overflow = FALSE;
 	} else if (sheet->hide_zero && gnm_cell_is_zero (cell)) {

Modified: trunk/src/workbook-view.c
==============================================================================
--- trunk/src/workbook-view.c	(original)
+++ trunk/src/workbook-view.c	Fri Sep  5 15:09:00 2008
@@ -54,7 +54,6 @@
 #include <goffice/app/io-context.h>
 #include <goffice/utils/go-file.h>
 #include <goffice/utils/go-glib-extras.h>
-#include <goffice/utils/go-locale.h>
 #include <gsf/gsf.h>
 #include <gsf/gsf-impl-utils.h>
 #include <gsf/gsf-output-stdio.h>
@@ -387,49 +386,12 @@
 	sv = wbv->current_sheet_view;
 	if (sv != NULL) {
 		char *text;
-		Sheet *sheet = sv->sheet;
-		GnmCell const *cell = sheet_cell_get (sheet,
+		GnmCell const *cell = sheet_cell_get (sv->sheet,
 			sv->edit_pos.col, sv->edit_pos.row);
 
-		if (NULL != cell) {
-			text = gnm_cell_get_entered_text (cell);
-
-			if (gnm_cell_has_expr (cell)) {
-				GnmExprTop const *texpr = cell->base.texpr;
-				GnmCell const *corner = NULL;
-				int x = 0, y = 0;
-
-				/*
-				 * If this is part of an array we add '{' '}'
-				 * and size information to the display.  That
-				 * is not actually part of the parsable
-				 * expression, but it is a useful extension to
-				 * the simple '{' '}' that MS excel(tm) uses.
-				 */
-				if (gnm_expr_top_is_array_corner (texpr))
-					corner = cell;
-				else if (gnm_expr_top_is_array_elem (texpr, &x, &y)) {
-					corner = sheet_cell_get
-						(sheet,
-						 cell->pos.col - x,
-						 cell->pos.row - y);
-				}
-
-				if (corner) {
-					GnmExprArrayCorner const *ac = gnm_cell_is_array_corner (corner);
-
-					char *tmp = g_strdup_printf
-						("{%s}(%d%c%d)[%d][%d]",
-						 text,
-						 ac->cols,
-						 go_locale_get_arg_sep (),
-						 ac->rows,
-						 x, y);
-					g_free (text);
-					text = tmp;
-				}
-			}
-		} else
+		if (NULL != cell)
+			text = gnm_cell_get_displayed_text (cell);
+		else
 			text = g_strdup ("");
 
 		if (optional_wbc == NULL) {



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