From 2985d526ebcac1af1efa00629e32a144c2b9ab22 Mon Sep 17 00:00:00 2001
From: Andrea Zagli <azagli@libero.it>
Date: Sun, 5 Jun 2011 11:01:29 +0200
Subject: [PATCH] Added number and date formatting.

Bugfixes.
---
 src/gdaex.c      | 12 +++---
 src/grid.c       | 99 +++++++++++++++++++++++++++++++++++++++++++++++-
 src/gridcolumn.c |  8 ++--
 src/gridcolumn.h |  6 +--
 4 files changed, 111 insertions(+), 14 deletions(-)

diff --git a/src/gdaex.c b/src/gdaex.c
index d27976d..0b9fe38 100644
--- a/src/gdaex.c
+++ b/src/gdaex.c
@@ -1312,9 +1312,9 @@ GDateTime
 			else if (gda_value_isa (v, G_TYPE_DATE))
 				{
 					gdate = gdaex_data_model_get_value_gdate_at (data_model, row, col);
-					ret = g_date_time_new_local ((gint)gdate->year,
-					                             (gint)gdate->month,
-					                             (gint)gdate->day,
+					ret = g_date_time_new_local ((gint)g_date_get_year (gdate),
+					                             (gint)g_date_get_month (gdate),
+					                             (gint)g_date_get_day (gdate),
 					                             0,
 					                             0,
 					                             0.0);
@@ -2034,9 +2034,9 @@ GDateTime
 			else if (gda_value_isa (v, G_TYPE_DATE))
 				{
 					gdate = gdaex_data_model_iter_get_value_gdate_at (iter, col);
-					ret = g_date_time_new_local ((gint)gdate->year,
-					                             (gint)gdate->month,
-					                             (gint)gdate->day,
+					ret = g_date_time_new_local ((gint)g_date_get_year (gdate),
+					                             (gint)g_date_get_month (gdate),
+					                             (gint)g_date_get_day (gdate),
 					                             0,
 					                             0,
 					                             0.0);
diff --git a/src/grid.c b/src/grid.c
index f4d9304..e60527b 100644
--- a/src/grid.c
+++ b/src/grid.c
@@ -44,6 +44,10 @@ static void gdaex_grid_get_property (GObject *object,
 static GtkTreeModel *gdaex_grid_get_model (GdaExGrid *grid);
 static GtkTreeView *gdaex_grid_get_view (GdaExGrid *grid);
 
+static gchar *grid_format_money (gdouble number,
+                      gint decimals,
+                      gboolean with_currency_symbol);
+
 #define GDAEX_GRID_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GDAEX_TYPE_GRID, GdaExGridPrivate))
 
 typedef struct _GdaExGridPrivate GdaExGridPrivate;
@@ -181,6 +185,9 @@ gdaex_grid_fill_from_datamodel (GdaExGrid *grid, GdaDataModel *dm, GError **erro
 	gint *columns;
 	GValue *values;
 
+	GDateTime *gdatetime;
+	gdouble dval;
+
 	g_return_val_if_fail (GDAEX_IS_GRID (grid), FALSE);
 	g_return_val_if_fail (GDA_IS_DATA_MODEL (dm), FALSE);
 
@@ -230,8 +237,25 @@ gdaex_grid_fill_from_datamodel (GdaExGrid *grid, GdaDataModel *dm, GError **erro
 											g_value_set_string (&gval, gdaex_data_model_iter_get_value_boolean_at (dm_iter, col) ? "X" : "");
 											break;
 
+										case G_TYPE_INT:
+										case G_TYPE_FLOAT:
+										case G_TYPE_DOUBLE:
+											dval = gdaex_data_model_iter_get_value_double_at (dm_iter, col);
+											g_value_set_string (&gval, grid_format_money (dval, gdaex_grid_column_get_decimals ((GdaExGridColumn *)g_ptr_array_index (priv->columns, col)), FALSE));
+											break;
+
 										default:
-											g_value_set_string (&gval, gda_value_stringify (gda_data_model_iter_get_value_at (dm_iter, col)));
+											if (gcol_gtype == G_TYPE_DATE
+											    || gcol_gtype == G_TYPE_DATE_TIME
+											    || gcol_gtype == GDA_TYPE_TIMESTAMP)
+												{
+													gdatetime = gdaex_data_model_iter_get_value_gdatetime_at (dm_iter, col);
+													g_value_set_string (&gval, g_date_time_format (gdatetime, gcol_gtype == G_TYPE_DATE ? "%d/%m/%Y" : "%d/%m/%Y %H.%M.%S"));
+												}
+											else
+												{
+													g_value_set_string (&gval, gda_value_stringify (gda_data_model_iter_get_value_at (dm_iter, col)));
+												}
 											break;
 									}
 
@@ -365,6 +389,8 @@ static GtkTreeView
 	model = gdaex_grid_get_model (grid);
 	view = gtk_tree_view_new_with_model (model);
 
+	gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (view), TRUE);
+
 	for (col = 0; col < priv->columns->len; col++)
 		{
 			gcolumn = (GdaExGridColumn *)g_ptr_array_index (priv->columns, col);
@@ -392,3 +418,74 @@ static GtkTreeView
 
 	return GTK_TREE_VIEW (view);
 }
+
+static gchar
+*grid_format_money (gdouble number,
+                      gint decimals,
+                      gboolean with_currency_symbol)
+{
+	gchar *ret;
+
+	GRegex *regex;
+	GError *error;
+
+	gchar *str_format;
+	gchar *str;
+	gssize str_len;
+
+	/* TODO
+	 * - get number of decimals from locale
+	 * - get grouping char from locale
+	 * - get currency symbol from locale
+	 */
+
+	ret = g_strdup ("");
+
+	error = NULL;
+	regex = g_regex_new ("(^[-\\d]?\\d+)(\\d\\d\\d)", 0, 0, &error);
+	if (error != NULL)
+		{
+			g_warning ("Error on creating regex: %s.",
+			           error->message != NULL ? error->message : "no details");
+			return "";
+		}
+
+	str_format = g_strdup_printf ("%%0%sf", decimals == 0 ? ".0" : (decimals < 0 ? ".2" : g_strdup_printf (".%d", decimals)));
+	ret = g_strdup_printf (str_format, number);
+
+	while (TRUE)
+		{
+			error = NULL;
+			str_len = g_utf8_strlen (ret, -1);
+			str = g_regex_replace ((const GRegex *)regex,
+			                       ret, str_len, 0,
+			                       "\\1.\\2", 0,
+			                       &error);
+			if (error != NULL)
+				{
+					g_warning ("Error on regex replacing: %s.",
+					           error->message != NULL ? error->message : "no details");
+					g_regex_unref (regex);
+					return "";
+				}
+			if (g_strcmp0 (ret, str) != 0)
+				{
+					ret = g_strdup (str);
+					g_free (str);
+				}
+			else
+				{
+					break;
+				}
+		}
+
+	if (with_currency_symbol)
+		{
+			ret = g_strconcat ("€ ", ret, NULL);
+		}
+
+	g_regex_unref (regex);
+
+	return ret;
+}
+
diff --git a/src/gridcolumn.c b/src/gridcolumn.c
index 8926c6a..8967058 100644
--- a/src/gridcolumn.c
+++ b/src/gridcolumn.c
@@ -53,7 +53,7 @@ struct _GdaExGridColumnPrivate
 		gboolean resizable;
 		gboolean sortable;
 		gboolean reorderable;
-		guint decimals;
+		gint decimals;
 
 		GtkTreeViewColumn *vcolumn;
 	};
@@ -94,7 +94,7 @@ GdaExGridColumn
                         gboolean resizable,
                         gboolean sortable,
                         gboolean reorderable,
-                        guint decimals)
+                        gint decimals)
 {
 	GdaExGridColumn *gdaex_grid_column = GDAEX_GRID_COLUMN (g_object_new (gdaex_grid_column_get_type (), NULL));
 
@@ -255,7 +255,7 @@ gdaex_grid_column_get_reorderable (GdaExGridColumn *column)
 }
 
 void
-gdaex_grid_column_set_decimals (GdaExGridColumn *column, guint decimals)
+gdaex_grid_column_set_decimals (GdaExGridColumn *column, gint decimals)
 {
 	g_return_if_fail (GDAEX_IS_GRID_COLUMN (column));
 
@@ -264,7 +264,7 @@ gdaex_grid_column_set_decimals (GdaExGridColumn *column, guint decimals)
 	priv->decimals = decimals;
 }
 
-guint
+gint
 gdaex_grid_column_get_decimals (GdaExGridColumn *column)
 {
 	g_return_val_if_fail (GDAEX_IS_GRID_COLUMN (column), FALSE);
diff --git a/src/gridcolumn.h b/src/gridcolumn.h
index 7703bfc..0131a43 100644
--- a/src/gridcolumn.h
+++ b/src/gridcolumn.h
@@ -63,7 +63,7 @@ GdaExGridColumn *gdaex_grid_column_new (const gchar *title,
                                         gboolean resizable,
                                         gboolean sortable,
                                         gboolean reorderable,
-                                        guint decimals);
+                                        gint decimals);
 
 void gdaex_grid_column_set_title (GdaExGridColumn *column, const gchar *title);
 const gchar *gdaex_grid_column_get_title (GdaExGridColumn *column);
@@ -86,8 +86,8 @@ gboolean gdaex_grid_column_get_sortable (GdaExGridColumn *column);
 void gdaex_grid_column_set_reorderable (GdaExGridColumn *column, gboolean reorderable);
 gboolean gdaex_grid_column_get_reorderable (GdaExGridColumn *column);
 
-void gdaex_grid_column_set_decimals (GdaExGridColumn *column, guint decimals);
-guint gdaex_grid_column_get_decimals (GdaExGridColumn *column);
+void gdaex_grid_column_set_decimals (GdaExGridColumn *column, gint decimals);
+gint gdaex_grid_column_get_decimals (GdaExGridColumn *column);
 
 GtkTreeViewColumn *gdaex_grid_column_get_column (GdaExGridColumn *column);
 
-- 
2.49.0