[gnumeric] remove duplicate code



commit bbfcfc5da53cbe6eb1834c88d53aa8b47f67c29c
Author: Andreas J Guelzow <aguelzow pyrshep ca>
Date:   Wed Sep 28 23:32:34 2011 -0600

    remove duplicate code
    
    2011-09-28 Andreas J. Guelzow <aguelzow pyrshep ca>
    
    	* src/gnm-pane.c (cb_so_menu_activate): delete
    	(build_so_menu): delete
    	(gnm_pane_display_object_menu): use sheet_object_build_menu instead of
    	build_so_menu
    	* src/print.c (gnm_print_so): new stub
    	* src/print.h (gnm_print_so): new
    	* src/sheet-object-impl.h (SheetObjectAction): add field
    	* src/sheet-object.c (build_so_menu): rename to sheet_object_build_menu
    	(cb_so_print): new
    	(sheet_object_can_prop): new
    	(sheet_object_populate_menu_real): use enabler/disabler
    	(sheet_object_populate_menu): do not recurse infinitely
    	(cb_so_menu_activate): combine with the function of same name from src/gnm-pane.c
    	(sheet_object_view_button_pressed): use sheet_object_build_menu instead of
    	build_so_menu
    	* src/sheet-object.h (sheet_object_build_menu): new

 ChangeLog               |   19 ++++++
 src/gnm-pane.c          |   51 +----------------
 src/print.c             |    6 ++
 src/print.h             |    2 +
 src/sheet-object-impl.h |    2 +
 src/sheet-object.c      |  141 ++++++++++++++++++++++++++--------------------
 src/sheet-object.h      |    4 +-
 7 files changed, 115 insertions(+), 110 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index d71cb03..d38b84f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,24 @@
 2011-09-28 Andreas J. Guelzow <aguelzow pyrshep ca>
 
+	* src/gnm-pane.c (cb_so_menu_activate): delete
+	(build_so_menu): delete
+	(gnm_pane_display_object_menu): use sheet_object_build_menu instead of
+	build_so_menu
+	* src/print.c (gnm_print_so): new stub
+	* src/print.h (gnm_print_so): new
+	* src/sheet-object-impl.h (SheetObjectAction): add field
+	* src/sheet-object.c (build_so_menu): rename to sheet_object_build_menu
+	(cb_so_print): new
+	(sheet_object_can_prop): new
+	(sheet_object_populate_menu_real): use enabler/disabler
+	(sheet_object_populate_menu): do not recurse infinitely
+	(cb_so_menu_activate): combine with the function of same name from src/gnm-pane.c
+	(sheet_object_view_button_pressed): use sheet_object_build_menu instead of
+	build_so_menu
+	* src/sheet-object.h (sheet_object_build_menu): new
+
+2011-09-28 Andreas J. Guelzow <aguelzow pyrshep ca>
+
 	* src/stf-parse.c (stf_parse_options_csv_set_stringindicator): allow \0
 	as stringindicator
 	(stf_parse_options_valid): ditto
diff --git a/src/gnm-pane.c b/src/gnm-pane.c
index ea06c7b..7161fd1 100644
--- a/src/gnm-pane.c
+++ b/src/gnm-pane.c
@@ -2354,51 +2354,6 @@ cb_slide_handler (GnmPane *pane, GnmPaneSlideInfo const *info)
 }
 
 static void
-cb_so_menu_activate (GObject *menu, GocItem *view)
-{
-	SheetObjectAction const *a = g_object_get_data (menu, "action");
-	if (a->func)
-		(a->func) (sheet_object_view_get_so (SHEET_OBJECT_VIEW (view)),
-			   SHEET_CONTROL (GNM_SIMPLE_CANVAS (view->canvas)->scg));
-}
-
-static GtkWidget *
-build_so_menu (GnmPane *pane, SheetObjectView *view,
-	       GPtrArray const *actions, unsigned *i)
-{
-	SheetObjectAction const *a;
-	GtkWidget *item, *menu = gtk_menu_new ();
-
-	while (*i < actions->len) {
-		a = g_ptr_array_index (actions, *i);
-		(*i)++;
-		if (a->submenu < 0)
-			break;
-		if (a->icon != NULL) {
-			if (a->label != NULL) {
-				item = gtk_image_menu_item_new_with_mnemonic (_(a->label));
-				gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item),
-					gtk_image_new_from_stock (a->icon, GTK_ICON_SIZE_MENU));
-			} else
-				item = gtk_image_menu_item_new_from_stock (a->icon, NULL);
-		} else if (a->label != NULL)
-			item = gtk_menu_item_new_with_mnemonic (_(a->label));
-		else
-			item = gtk_separator_menu_item_new ();
-		if (a->submenu > 0)
-			gtk_menu_item_set_submenu (GTK_MENU_ITEM (item),
-				build_so_menu (pane, view, actions, i));
-		else if (a->label != NULL || a->icon != NULL) { /* not a separator or menu */
-			g_object_set_data (G_OBJECT (item), "action", (gpointer)a);
-			g_signal_connect_object (G_OBJECT (item), "activate",
-				G_CALLBACK (cb_so_menu_activate), view, 0);
-		}
-		gtk_menu_shell_append (GTK_MENU_SHELL (menu),  item);
-	}
-	return menu;
-}
-
-static void
 cb_ptr_array_free (GPtrArray *actions)
 {
 	g_ptr_array_free (actions, TRUE);
@@ -2424,9 +2379,9 @@ gnm_pane_display_object_menu (GnmPane *pane, SheetObject *so, GdkEvent *event)
 		return;
 	}
 
-	menu = build_so_menu (pane,
-		sheet_object_get_view (so, (SheetObjectViewContainer *) pane),
-		actions, &i);
+	menu = sheet_object_build_menu 
+		(sheet_object_get_view (so, (SheetObjectViewContainer *) pane),
+		 actions, &i);
 	g_object_set_data_full (G_OBJECT (menu), "actions", actions,
 		(GDestroyNotify)cb_ptr_array_free);
 	gtk_widget_show_all (menu);
diff --git a/src/print.c b/src/print.c
index d3047dd..cb6342c 100644
--- a/src/print.c
+++ b/src/print.c
@@ -1816,3 +1816,9 @@ gnm_print_sheet (WorkbookControl *wbc, Sheet *sheet,
 
 	g_object_unref (print);
 }
+
+void 
+gnm_print_so (WorkbookControl *wbc, SheetObject *so)
+{
+	g_print ("gnm_print_so\n");
+}
diff --git a/src/print.h b/src/print.h
index a3ba61e..3ab2cd2 100644
--- a/src/print.h
+++ b/src/print.h
@@ -28,6 +28,8 @@ void gnm_print_sheet (WorkbookControl *wbc, Sheet *sheet,
 		      gboolean preview, PrintRange default_range,
 		      GsfOutput *export_dst);
 
+void gnm_print_so (WorkbookControl *wbc, SheetObject *so);
+
 void gnm_print_sheet_objects (cairo_t *cr,
 			      Sheet const *sheet,
 			      GnmRange *range,
diff --git a/src/sheet-object-impl.h b/src/sheet-object-impl.h
index 12b2704..924d1c7 100644
--- a/src/sheet-object-impl.h
+++ b/src/sheet-object-impl.h
@@ -34,12 +34,14 @@ struct _SheetObject {
 };
 
 typedef void (*SheetObjectActionFunc) (SheetObject *so, SheetControl *sc);
+typedef gboolean (*SheetObjectEnableActionFunc) (SheetObject const *so);
 typedef struct {
 	char const *icon;	/* optionally NULL */
 	char const *label;	/* NULL for separators */
 	char const *msg_domain;	/* for plugins to specify translations */
 	int  submenu;		/* > 1 starts a menu, < 1 end one */
 	SheetObjectActionFunc	func;
+	SheetObjectEnableActionFunc	enable_func;
 } SheetObjectAction;
 
 typedef struct {
diff --git a/src/sheet-object.c b/src/sheet-object.c
index 4f02f1c..6ab9118 100644
--- a/src/sheet-object.c
+++ b/src/sheet-object.c
@@ -36,6 +36,7 @@
 #include "sheet-object-image.h"
 #include "wbc-gtk-impl.h"
 #include "graph.h"
+#include "print.h"
 #include <goffice/goffice.h>
 #include "application.h"
 #include "gutils.h"
@@ -129,6 +130,11 @@ cb_so_delete (SheetObject *so, SheetControl *sc)
 	cmd_objects_delete (sc_wbc (sc),
 		go_slist_create (so, NULL), NULL);
 }
+static void
+cb_so_print (SheetObject *so, SheetControl *sc)
+{
+	gnm_print_so (sc_wbc (sc), so);
+}
 void
 sheet_object_get_editor (SheetObject *so, SheetControl *sc)
 {
@@ -162,57 +168,85 @@ cb_so_copy (SheetObject *so, SheetControl *sc)
 		go_slist_create (so, NULL));
 }
 
+gboolean
+sheet_object_can_print (SheetObject const *so)
+{
+	g_return_val_if_fail (IS_SHEET_OBJECT (so), FALSE);
+	return  (so->flags & SHEET_OBJECT_IS_VISIBLE) &&
+		(so->flags & SHEET_OBJECT_PRINT) &&
+		SO_CLASS (so)->draw_cairo != NULL;
+}
+
+gboolean
+sheet_object_can_resize (SheetObject const *so)
+{
+	g_return_val_if_fail (IS_SHEET_OBJECT (so), FALSE);
+	return  so->flags & SHEET_OBJECT_CAN_RESIZE;
+}
+
+gboolean
+sheet_object_can_edit (SheetObject const *so)
+{
+	g_return_val_if_fail (IS_SHEET_OBJECT (so), FALSE);
+	return  so->flags & SHEET_OBJECT_CAN_EDIT;
+}
+
+static gboolean
+sheet_object_can_prop (SheetObject const *so)
+{
+	g_return_val_if_fail (IS_SHEET_OBJECT (so), FALSE);
+	return (sheet_object_can_edit (so) && (SO_CLASS(so)->user_config != NULL));
+}
+
 static void
 sheet_object_populate_menu_real (SheetObject *so, GPtrArray *actions)
 {
 	unsigned i;
 	if (so->sheet->sheet_type == GNM_SHEET_OBJECT) {
 		static SheetObjectAction const so_actions [] = {
-			{ "gtk-properties",	NULL,		NULL,  0, sheet_object_get_editor },
-			{ NULL,	NULL, NULL, 0, NULL },
-			{ "gtk-copy",		NULL,		NULL,  0, cb_so_copy },
+			{ "gtk-properties",	NULL,		NULL,  0, sheet_object_get_editor, sheet_object_can_prop},
+			{ NULL,	NULL, NULL, 0, NULL, NULL },
+			{ "gtk-copy",		NULL,		NULL,  0, cb_so_copy, NULL },
 		};
 		for (i = 0 ; i < G_N_ELEMENTS (so_actions); i++)
-			if (i != 0 || SO_CLASS(so)->user_config != NULL)
 				g_ptr_array_add (actions, (gpointer) (so_actions + i));
 	} else {
 		static SheetObjectAction const so_actions [] = {
-			{ "gtk-properties",	NULL,		NULL,  0, sheet_object_get_editor },
-			{ NULL,	NULL, NULL, 0, NULL },
-			{ GTK_STOCK_LEAVE_FULLSCREEN, N_("Size _& Position"),	NULL,  0, cb_so_size_position },
-			{ "gtk-fullscreen",	N_("_Snap to Grid"),	NULL,  0, cb_so_snap_to_grid },
-			{ NULL,			N_("_Order"),	NULL,  1, NULL },
-				{ NULL,			N_("Pul_l to Front"),	NULL,  0, cb_so_pull_to_front },
-				{ NULL,			N_("Pull _Forward"),	NULL,  0, cb_so_pull_forward },
-				{ NULL,			N_("Push _Backward"),	NULL,  0, cb_so_push_backward },
-				{ NULL,			N_("Pus_h to Back"),	NULL,  0, cb_so_push_to_back },
-				{ NULL,			NULL,			NULL, -1, NULL },
-			{ NULL,	NULL, NULL, 0, NULL },
-			{ "gtk-cut",		NULL,		NULL,  0, cb_so_cut },
-			{ "gtk-copy",		NULL,		NULL,  0, cb_so_copy },
-			{ "gtk-delete",		NULL,		NULL, 0, cb_so_delete },
+			{ GTK_STOCK_PROPERTIES,	        NULL, NULL,  0, sheet_object_get_editor, sheet_object_can_prop},
+			{ NULL,	NULL, NULL, 0, NULL, NULL },
+			{ GTK_STOCK_LEAVE_FULLSCREEN,   N_("Size _& Position"),	NULL,  0, cb_so_size_position, NULL },
+			{ GTK_STOCK_FULLSCREEN,	        N_("_Snap to Grid"),	NULL,  0, cb_so_snap_to_grid, NULL },
+			{ NULL,			        N_("_Order"),	        NULL,  1, NULL, NULL },
+				{ NULL,			N_("Pul_l to Front"),	NULL,  0, cb_so_pull_to_front, NULL },
+				{ NULL,			N_("Pull _Forward"),	NULL,  0, cb_so_pull_forward, NULL },
+				{ NULL,			N_("Push _Backward"),	NULL,  0, cb_so_push_backward, NULL },
+				{ NULL,			N_("Pus_h to Back"),	NULL,  0, cb_so_push_to_back, NULL },
+				{ NULL,			NULL,			NULL, -1, NULL, NULL },
+			{ NULL,	NULL, NULL, 0, NULL, NULL },
+			{ GTK_STOCK_CUT,		NULL,		NULL,  0, cb_so_cut, NULL },
+			{ GTK_STOCK_COPY,		NULL,		NULL,  0, cb_so_copy, NULL },
+			{ GTK_STOCK_DELETE,		NULL,		NULL,  0, cb_so_delete, NULL },
+			/* { NULL,	NULL, NULL, 0, NULL, NULL }, */
+			/* { GTK_STOCK_PRINT,		NULL,		NULL,  0, cb_so_print, sheet_object_can_print}, */
 		};
-		for (i = sheet_object_can_edit (so)? 0: 1 ; i < G_N_ELEMENTS (so_actions); i++)
-			if (i != 0 || SO_CLASS(so)->user_config != NULL)
+		for (i =  0; i < G_N_ELEMENTS (so_actions); i++)
 				g_ptr_array_add (actions, (gpointer) (so_actions + i));
 	}
 }
 
 /**
  * sheet_object_populate_menu :
- * @so : #SheetObject optionally NULL
+ * @so : #SheetObject
  * @actions : #GPtrArray
  *
- * Get a list of the actions that can be performed on @so, if @so is NULL use
- * the default set.
+ * Get a list of the actions that can be performed on @so
  **/
 void
 sheet_object_populate_menu (SheetObject *so, GPtrArray *actions)
 {
-	if (NULL != so)
-		SHEET_OBJECT_CLASS (G_OBJECT_GET_CLASS(so))->populate_menu (so, actions);
-	else
-		sheet_object_populate_menu (NULL, actions);
+	g_return_if_fail  (NULL != so);
+
+	SHEET_OBJECT_CLASS (G_OBJECT_GET_CLASS(so))->populate_menu (so, actions);
 }
 
 /**
@@ -634,29 +668,6 @@ sheet_object_new_view (SheetObject *so, SheetObjectViewContainer *container)
 	return view;
 }
 
-gboolean
-sheet_object_can_print (SheetObject const *so)
-{
-	g_return_val_if_fail (IS_SHEET_OBJECT (so), FALSE);
-	return  (so->flags & SHEET_OBJECT_IS_VISIBLE) &&
-		(so->flags & SHEET_OBJECT_PRINT) &&
-		SO_CLASS (so)->draw_cairo != NULL;
-}
-
-gboolean
-sheet_object_can_resize (SheetObject const *so)
-{
-	g_return_val_if_fail (IS_SHEET_OBJECT (so), FALSE);
-	return  so->flags & SHEET_OBJECT_CAN_RESIZE;
-}
-
-gboolean
-sheet_object_can_edit (SheetObject const *so)
-{
-	g_return_val_if_fail (IS_SHEET_OBJECT (so), FALSE);
-	return  so->flags & SHEET_OBJECT_CAN_EDIT;
-}
-
 /**
  * sheet_object_draw_cairo :
  *
@@ -1261,10 +1272,16 @@ static void
 cb_so_menu_activate (GObject *menu, GocItem *view)
 {
 	SheetObjectAction const *a = g_object_get_data (menu, "action");
-	SheetObject *so = sheet_object_view_get_so (SHEET_OBJECT_VIEW (view));
-	if (a->func)
-		(a->func) (so,
-			   SHEET_CONTROL (g_object_get_data (G_OBJECT (view->canvas), "sheet-control")));
+
+	if (a->func) {
+		SheetObject *so = sheet_object_view_get_so (SHEET_OBJECT_VIEW (view));
+		gpointer data = g_object_get_data (G_OBJECT (view->canvas), "sheet-control");
+		
+		if (data == NULL)
+			data = GNM_SIMPLE_CANVAS (view->canvas)->scg;
+
+		(a->func) (so, SHEET_CONTROL (data));
+	}
 }
 
 static void
@@ -1273,9 +1290,9 @@ cb_ptr_array_free (GPtrArray *actions)
 	g_ptr_array_free (actions, TRUE);
 }
 
-static GtkWidget *
-build_so_menu (SheetObjectViewContainer *cont, SheetObjectView *view,
-	       GPtrArray const *actions, unsigned *i)
+GtkWidget *
+sheet_object_build_menu (SheetObjectView *view,
+			 GPtrArray const *actions, unsigned *i)
 {
 	SheetObjectAction const *a;
 	GtkWidget *item, *menu = gtk_menu_new ();
@@ -1298,11 +1315,13 @@ build_so_menu (SheetObjectViewContainer *cont, SheetObjectView *view,
 			item = gtk_separator_menu_item_new ();
 		if (a->submenu > 0)
 			gtk_menu_item_set_submenu (GTK_MENU_ITEM (item),
-				build_so_menu (cont, view, actions, i));
+						   sheet_object_build_menu (view, actions, i));
 		else if (a->label != NULL || a->icon != NULL) { /* not a separator or menu */
 			g_object_set_data (G_OBJECT (item), "action", (gpointer)a);
 			g_signal_connect_object (G_OBJECT (item), "activate",
 				G_CALLBACK (cb_so_menu_activate), view, 0);
+			gtk_widget_set_sensitive (item, a->enable_func == NULL 
+						  || a->enable_func (sheet_object_view_get_so (view)));
 		}
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu),  item);
 	}
@@ -1362,9 +1381,9 @@ sheet_object_view_button_pressed (GocItem *item, int button, double x, double y)
 				return FALSE;
 			}
 
-			menu = build_so_menu ((SheetObjectViewContainer *) item->canvas,
-				sheet_object_get_view (so, (SheetObjectViewContainer *) item->canvas),
-				actions, &i);
+			menu = sheet_object_build_menu 
+				(sheet_object_get_view (so, (SheetObjectViewContainer *) item->canvas),
+				 actions, &i);
 			g_object_set_data_full (G_OBJECT (menu), "actions", actions,
 				(GDestroyNotify) cb_ptr_array_free);
 			gtk_widget_show_all (menu);
diff --git a/src/sheet-object.h b/src/sheet-object.h
index cc11e6d..be33615 100644
--- a/src/sheet-object.h
+++ b/src/sheet-object.h
@@ -75,7 +75,9 @@ gboolean      sheet_object_can_edit	 (SheetObject const *so);
 
 void	     sheet_object_get_editor	 (SheetObject *so, SheetControl *sc);
 void	     sheet_object_populate_menu  (SheetObject *so, GPtrArray *actions);
-
+GtkWidget *  sheet_object_build_menu     (SheetObjectView *view, 
+					  GPtrArray const *actions,
+					  unsigned *i);
 void	     sheet_object_update_bounds  (SheetObject *so, GnmCellPos const *p);
 void	     sheet_object_default_size	 (SheetObject *so, double *w, double *h);
 gint	     sheet_object_adjust_stacking(SheetObject *so, gint positions);



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