[gnumeric] Add auto expression menu items to add formula. [#8872]



commit 4aa18a359bacc111b62488706d6de4fe8d89ab63
Author: Andreas J. Guelzow <aguelzow pyrshep ca>
Date:   Thu Dec 31 15:04:04 2009 -0700

    Add auto expression menu items to add formula. [#8872]
    
    2009-12-31 Andreas J. Guelzow <aguelzow pyrshep ca>
    
    	* analysis-auto-expression.c (analysis_tool_auto_expression_engine_run):
    	  also handle adding formula to the side
    	(analysis_tool_auto_expression_engine): ditto
    	* analysis-auto-expression.h (analysis_tools_data_auto_expression_t):
    	  add field
    
    2009-12-31 Andreas J. Guelzow <aguelzow pyrshep ca>
    
    	* wbc-gtk.c (cb_auto_expr_insert_formula): new
    	(cb_auto_expr_insert_formula_below): use cb_auto_expr_insert_formula
    	(cb_auto_expr_insert_formula_to_side): new
    	(cb_select_auto_expr): add menu item

 ChangeLog                            |    7 +++
 NEWS                                 |    2 +-
 src/tools/ChangeLog                  |    8 +++
 src/tools/analysis-auto-expression.c |   53 ++++++++++++++-------
 src/tools/analysis-auto-expression.h |    1 +
 src/wbc-gtk.c                        |   88 +++++++++++++++++++++-------------
 6 files changed, 108 insertions(+), 51 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index c6acf46..2ed5cf4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2009-12-31 Andreas J. Guelzow <aguelzow pyrshep ca>
 
+	* wbc-gtk.c (cb_auto_expr_insert_formula): new
+	(cb_auto_expr_insert_formula_below): use cb_auto_expr_insert_formula
+	(cb_auto_expr_insert_formula_to_side): new
+	(cb_select_auto_expr): add menu item
+	
+2009-12-31 Andreas J. Guelzow <aguelzow pyrshep ca>
+
 	* wbc-gtk.c (cb_auto_expr_insert_formula_below): new
 	(cb_select_auto_expr): add separator and menu item
 
diff --git a/NEWS b/NEWS
index 4b75356..64a1e1c 100644
--- a/NEWS
+++ b/NEWS
@@ -22,7 +22,7 @@ Andreas:
 	* Add GET.LINK. [#128534]
 	* Add "Don't change formulae" to paste special. [#123326]
 	* Select pasted objects. [#604227]
-	* Add auto expression menuitem to add formula. Part of [#8872]
+	* Add auto expression menu items to add formula. [#8872]
 
 Jean
 	* Fix import export of line type in scatter plots. [#605043]
diff --git a/src/tools/ChangeLog b/src/tools/ChangeLog
index 273cd4c..5b4ecdf 100644
--- a/src/tools/ChangeLog
+++ b/src/tools/ChangeLog
@@ -1,5 +1,13 @@
 2009-12-31 Andreas J. Guelzow <aguelzow pyrshep ca>
 
+	* analysis-auto-expression.c (analysis_tool_auto_expression_engine_run):
+	  also handle adding formula to the side
+	(analysis_tool_auto_expression_engine): ditto
+	* analysis-auto-expression.h (analysis_tools_data_auto_expression_t):
+	  add field
+
+2009-12-31 Andreas J. Guelzow <aguelzow pyrshep ca>
+
 	* analysis-auto-expression.c: new
 	* analysis-auto-expression.h: new
 	* Makefile.am: add the above
diff --git a/src/tools/analysis-auto-expression.c b/src/tools/analysis-auto-expression.c
index 7d7ce7a..be970a8 100644
--- a/src/tools/analysis-auto-expression.c
+++ b/src/tools/analysis-auto-expression.c
@@ -41,20 +41,35 @@ analysis_tool_auto_expression_engine_run (data_analysis_output_t *dao,
 	guint     col;
 	GSList *data = info->base.input;
 
-	for (col = 0; data != NULL; data = data->next, col++)
-		dao_set_cell_expr
-			(dao, col, 0,
-			 gnm_expr_new_funcall1
-			 (info->func,
-			  gnm_expr_new_constant (value_dup (data->data))));
-
-	if (info->multiple)
-		dao_set_cell_expr
-			(dao, col, 0,
-			 gnm_expr_new_funcall1
-			 (info->func,
-			  make_rangeref (-col,0,-1,0)));
-
+	if (info->below) {
+		for (col = 0; data != NULL; data = data->next, col++)
+			dao_set_cell_expr
+				(dao, col, 0,
+				 gnm_expr_new_funcall1
+				 (info->func,
+				  gnm_expr_new_constant (value_dup (data->data))));
+		
+		if (info->multiple)
+			dao_set_cell_expr
+				(dao, col, 0,
+				 gnm_expr_new_funcall1
+				 (info->func,
+				  make_rangeref (- col, 0, -1, 0)));
+	} else {
+		for (col = 0; data != NULL; data = data->next, col++)
+			dao_set_cell_expr
+				(dao, 0, col,
+				 gnm_expr_new_funcall1
+				 (info->func,
+				  gnm_expr_new_constant (value_dup (data->data))));
+		
+		if (info->multiple)
+			dao_set_cell_expr
+				(dao, 0, col,
+				 gnm_expr_new_funcall1
+				 (info->func,
+				  make_rangeref (0, - col, 0, -1)));
+	}
 	dao_redraw_respan (dao);
 
 	return FALSE;
@@ -84,9 +99,13 @@ analysis_tool_auto_expression_engine (data_analysis_output_t *dao, gpointer spec
 			== NULL);
 	case TOOL_ENGINE_UPDATE_DAO:
 		prepare_input_range (&info->base.input, info->base.group_by);
-		dao_adjust (dao, 
-			    (info->multiple ? 1 : 0)  + g_slist_length (info->base.input),
-			    1);
+		if (info->below)
+			dao_adjust (dao, 
+				    (info->multiple ? 1 : 0)  + g_slist_length (info->base.input),
+				    1);
+		else
+			dao_adjust (dao, 1,
+				    (info->multiple ? 1 : 0)  + g_slist_length (info->base.input));			
 		return FALSE;
 	case TOOL_ENGINE_CLEAN_UP:
 		return analysis_tool_auto_expression_engine_clean (specs);
diff --git a/src/tools/analysis-auto-expression.h b/src/tools/analysis-auto-expression.h
index 602296f..b079b38 100644
--- a/src/tools/analysis-auto-expression.h
+++ b/src/tools/analysis-auto-expression.h
@@ -37,6 +37,7 @@
 typedef struct {
 	analysis_tools_data_generic_t base;
 	gboolean multiple;
+	gboolean below;
 	GnmFunc *func;
 } analysis_tools_data_auto_expression_t;
 
diff --git a/src/wbc-gtk.c b/src/wbc-gtk.c
index ca46e57..9276e91 100644
--- a/src/wbc-gtk.c
+++ b/src/wbc-gtk.c
@@ -4140,38 +4140,52 @@ cb_auto_expr_precision_toggled (GtkWidget *item, WBCGtk *wbcg)
 }
 
 static void
-cb_auto_expr_insert_formula_below (GtkWidget *item, WBCGtk *wbcg)
+cb_auto_expr_insert_formula (WBCGtk *wbcg, gboolean below)
 {
 	SheetControlGUI *scg = wbcg_cur_scg (wbcg);
 	GnmRange const *selection = selection_first_range (scg_view (scg), NULL, NULL);
 	GnmRange output;
 	GnmRange *input;
-	gboolean multiple, use_last_row;
+	gboolean multiple, use_last_cr;
 	data_analysis_output_t *dao;
 	analysis_tools_data_auto_expression_t *specs;
 
-	if (selection == NULL || range_height (selection) < 2)
-		return;
-
-	multiple = (range_width (selection) > 1);
-	output = *selection;
-	range_normalize (&output);
-	output.start.row = output.end.row;
-	
-	use_last_row = sheet_is_region_empty (scg_sheet (scg), &output);
+	g_return_if_fail (selection != NULL);
 
-	if (!use_last_row) {
-		if (range_translate (&output, scg_sheet (scg), 0, 1))
-			return;
-		if (multiple && 
-		    (gnm_sheet_get_last_col (scg_sheet (scg)) > output.end.col))
-			output.end.col++;
+	if (below) {
+		multiple = (range_width (selection) > 1);
+		output = *selection;
+		range_normalize (&output);
+		output.start.row = output.end.row;
+		use_last_cr = (range_height (selection) > 1) && sheet_is_region_empty (scg_sheet (scg), &output);
+		if (!use_last_cr) {
+			if (range_translate (&output, scg_sheet (scg), 0, 1))
+				return;
+			if (multiple && gnm_sheet_get_last_col (scg_sheet (scg)) > output.end.col)
+				output.end.col++;
+		}
+		input = gnm_range_dup (selection);
+		range_normalize (input);
+		if (use_last_cr)
+			input->end.row--;
+	} else {
+		multiple = (range_height (selection) > 1);
+		output = *selection;
+		range_normalize (&output);
+		output.start.col = output.end.col;
+		use_last_cr = (range_width (selection) > 1) && sheet_is_region_empty (scg_sheet (scg), &output);
+		if (!use_last_cr) {
+			if (range_translate (&output, scg_sheet (scg), 1, 0))
+				return;
+			if (multiple && gnm_sheet_get_last_row (scg_sheet (scg)) > output.end.row)
+				output.end.row++;
+		}
+		input = gnm_range_dup (selection);
+		range_normalize (input);
+		if (use_last_cr)
+			input->end.col--;
 	}
-
-	input = gnm_range_dup (selection);
-	range_normalize (input);
-	if (use_last_row)
-		input->end.row--;
+	
 
 	dao = dao_init (NULL, RangeOutput);
 	dao->start_col         = output.start.col;
@@ -4186,9 +4200,10 @@ cb_auto_expr_insert_formula_below (GtkWidget *item, WBCGtk *wbcg)
 	specs->base.wbc = WORKBOOK_CONTROL (wbcg);
 	specs->base.input = g_slist_prepend (NULL, value_new_cellrange_r (scg_sheet (scg), input));
 	g_free (input);
-	specs->base.group_by = GROUPED_BY_COL;
+	specs->base.group_by = below ? GROUPED_BY_COL : GROUPED_BY_ROW;
 	specs->base.labels = FALSE;
 	specs->multiple = multiple;
+	specs->below = below;
 	specs->func = NULL;
 	g_object_get (G_OBJECT (wb_control_view (WORKBOOK_CONTROL (wbcg))), 
 		      "auto-expr-func", &(specs->func), NULL);
@@ -4201,10 +4216,17 @@ cb_auto_expr_insert_formula_below (GtkWidget *item, WBCGtk *wbcg)
 			   dao, specs, analysis_tool_auto_expression_engine);
 }
 
-/* static void */
-/* cb_auto_expr_insert_formula_to_side (GtkWidget *item, WBCGtk *wbcg) */
-/* { */
-/* } */
+static void
+cb_auto_expr_insert_formula_below (G_GNUC_UNUSED GtkWidget *item, WBCGtk *wbcg)
+{
+	cb_auto_expr_insert_formula (wbcg, TRUE);
+}
+
+static void
+cb_auto_expr_insert_formula_to_side (G_GNUC_UNUSED GtkWidget *item, WBCGtk *wbcg)
+{
+	cb_auto_expr_insert_formula (wbcg, FALSE);
+}
 
 
 static gboolean
@@ -4302,11 +4324,11 @@ cb_select_auto_expr (GtkWidget *widget, GdkEventButton *event, WBCGtk *wbcg)
 	gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
 	gtk_widget_show (item);
 
-/* 	item = gtk_menu_item_new_with_label (_("Insert formula to side.")); */
-/* 	g_signal_connect (G_OBJECT (item), "activate", */
-/* 		G_CALLBACK (cb_auto_expr_insert_formula_to_side), wbcg); */
-/* 	gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); */
-/* 	gtk_widget_show (item); */
+	item = gtk_menu_item_new_with_label (_("Insert formula to side."));
+	g_signal_connect (G_OBJECT (item), "activate",
+		G_CALLBACK (cb_auto_expr_insert_formula_to_side), wbcg);
+	gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+	gtk_widget_show (item);
 
 	gnumeric_popup_menu (GTK_MENU (menu), event);
 	return TRUE;



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