gnumeric r16635 - in trunk: . src



Author: jody
Date: Thu Jun 19 13:02:01 2008
New Revision: 16635
URL: http://svn.gnome.org/viewvc/gnumeric?rev=16635&view=rev

Log:
* Make object insertion more flexible. [#97216]


Modified:
   trunk/ChangeLog
   trunk/NEWS
   trunk/src/gnm-pane.c
   trunk/src/item-bar.c
   trunk/src/item-grid.c
   trunk/src/sheet-control-gui-priv.h
   trunk/src/sheet-control-gui.c
   trunk/src/sheet-control-gui.h
   trunk/src/wbc-gtk-actions.c
   trunk/src/wbc-gtk-edit.c
   trunk/src/wbc-gtk-impl.h
   trunk/src/wbc-gtk.c
   trunk/src/wbc-gtk.h

Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS	(original)
+++ trunk/NEWS	Thu Jun 19 13:02:01 2008
@@ -15,6 +15,7 @@
 	* Fix range highlighting while editing.
 	* Fix highlighting of merged cells. [#127415]
 	* Fix PageSetup on windows.
+	* Make object insertion more flexible. [#97216]
 
 Morten:
 	* Fix Excel export problem for strings that need quoting.  [#530704]

Modified: trunk/src/gnm-pane.c
==============================================================================
--- trunk/src/gnm-pane.c	(original)
+++ trunk/src/gnm-pane.c	Thu Jun 19 13:02:01 2008
@@ -565,7 +565,8 @@
 	}
 
 	/* Object manipulation */
-	if ((scg->selected_objects != NULL || scg->new_object != NULL)) {
+	if (scg->selected_objects != NULL ||
+	     scg->wbcg->new_object != NULL) {
 		if (wbc_gtk_get_guru (scg->wbcg) == NULL  &&
 		    gnm_pane_object_key_press (pane, event))
 			return TRUE;

Modified: trunk/src/item-bar.c
==============================================================================
--- trunk/src/item-bar.c	(original)
+++ trunk/src/item-bar.c	Thu Jun 19 13:02:01 2008
@@ -19,7 +19,7 @@
 #include "sheet-control-gui-priv.h"
 #include "application.h"
 #include "selection.h"
-#include "wbc-gtk.h"
+#include "wbc-gtk-impl.h"
 #include "gui-util.h"
 #include "parse-util.h"
 #include "commands.h"
@@ -338,7 +338,7 @@
 	int prev_level;
 	GdkRectangle rect;
 	GdkPoint points[3];
-	gboolean const has_object = scg->new_object != NULL || scg->selected_objects != NULL;
+	gboolean const has_object = scg->wbcg->new_object != NULL || scg->selected_objects != NULL;
 	gboolean const rtl = sheet->text_is_rtl != FALSE;
 	int shadow;
 	int first_line_offset = 1;

Modified: trunk/src/item-grid.c
==============================================================================
--- trunk/src/item-grid.c	(original)
+++ trunk/src/item-grid.c	Thu Jun 19 13:02:01 2008
@@ -395,7 +395,7 @@
 
 	gboolean const draw_selection =
 		ig->scg->selected_objects == NULL &&
-		ig->scg->new_object == NULL;
+		wbcg->new_object == NULL;
 
 	if (dir < 0) {
 		start_col = gnm_pane_find_col (pane, expose->area.x+width+2, &start_x);
@@ -769,12 +769,12 @@
 ig_obj_create_begin (ItemGrid *ig, GdkEventButton *event)
 {
 	GnmPane *pane = GNM_PANE (FOO_CANVAS_ITEM (ig)->canvas);
-	SheetObject *so = ig->scg->new_object;
+	SheetObject *so = ig->scg->wbcg->new_object;
 	SheetObjectAnchor anchor;
 	double coords[4];
 
 	g_return_val_if_fail (ig->scg->selected_objects == NULL, TRUE);
-	g_return_val_if_fail (ig->scg->new_object != NULL, TRUE);
+	g_return_val_if_fail (so != NULL, TRUE);
 
 	coords[0] = coords[2] = event->x;
 	coords[1] = coords[3] = event->y;
@@ -819,7 +819,7 @@
 		return TRUE;
 
 	/* A new object is ready to be realized and inserted */
-	if (scg->new_object != NULL)
+	if (wbcg->new_object != NULL)
 		return ig_obj_create_begin (ig, event);
 
 	/* If we are not configuring an object then clicking on the sheet

Modified: trunk/src/sheet-control-gui-priv.h
==============================================================================
--- trunk/src/sheet-control-gui-priv.h	(original)
+++ trunk/src/sheet-control-gui-priv.h	Thu Jun 19 13:02:01 2008
@@ -39,7 +39,6 @@
 	guint 		 pane_drag_handler;
 
 	/* SheetObject support */
-	SheetObject	 *new_object;	/* A newly created object that has yet to be realized */
 	GHashTable	 *selected_objects;
 
 	/* Keep track of a rangeselector state */

Modified: trunk/src/sheet-control-gui.c
==============================================================================
--- trunk/src/sheet-control-gui.c	(original)
+++ trunk/src/sheet-control-gui.c	Thu Jun 19 13:02:01 2008
@@ -690,7 +690,6 @@
 	scg->delayedMovement.handler = NULL;
 
 	scg->grab_stack = 0;
-	scg->new_object = NULL;
 	scg->selected_objects = NULL;
 }
 
@@ -725,7 +724,6 @@
 {
 	FooCanvas *colc;
 	int col_offset;
-	Sheet *sheet = ((SheetControl*) pane->simple.scg)->sheet;
 
 	g_return_val_if_fail (0 <= new_first_col && new_first_col < gnm_sheet_get_max_cols (sheet), 0);
 
@@ -792,7 +790,6 @@
 {
 	FooCanvas *rowc;
 	int row_offset;
-	Sheet *sheet = ((SheetControl*) pane->simple.scg)->sheet;
 
 	g_return_val_if_fail (0 <= new_first_row && new_first_row < gnm_sheet_get_max_rows (sheet), 0);
 
@@ -1913,7 +1910,7 @@
 	return TRUE;
 }
 
-static void
+void
 scg_cursor_visible (SheetControlGUI *scg, gboolean is_visible)
 {
 	SheetControl *sc = (SheetControl *) scg;
@@ -1930,25 +1927,6 @@
 
 /***************************************************************************/
 
-static gboolean
-scg_mode_clear (SheetControlGUI *scg)
-{
-	WorkbookControl *wbc;
-
-	g_return_val_if_fail (IS_SHEET_CONTROL_GUI (scg), FALSE);
-
-	if (scg->new_object != NULL) {
-		g_object_unref (G_OBJECT (scg->new_object));
-		scg->new_object = NULL;
-	}
-	scg_object_unselect (scg, NULL);
-	wbc = scg_wbc (scg);
-	if (wbc != NULL) /* during destruction */
-		wb_control_update_action_sensitivity (wbc);
-
-	return TRUE;
-}
-
 /**
  * scg_mode_edit:
  * @sc:  The sheet control
@@ -1962,13 +1940,15 @@
 {
 	g_return_if_fail (IS_SHEET_CONTROL_GUI (scg));
 
-	scg_mode_clear (scg);
+	if (scg->wbcg != NULL) /* Can be NULL during destruction */
+		wbcg_insert_object_clear (scg->wbcg);
 
 	/* During destruction we have already been disconnected
 	 * so don't bother changing the cursor */
 	if (scg->table != NULL &&
 	    scg_sheet (scg) != NULL &&
 	    scg_view (scg) != NULL) {
+		scg_object_unselect (scg, NULL);
 		scg_set_display_cursor (scg);
 		scg_cursor_visible (scg, TRUE);
 	}
@@ -1984,28 +1964,6 @@
 	scg_mode_edit ((SheetControlGUI *)sc);
 }
 
-/**
- * scg_mode_create_object :
- * @so : The object the needs to be placed
- *
- * Takes a newly created SheetObject that has not yet been realized and
- * prepares to place it on the sheet.
- * NOTE : Absorbs a reference to the object.
- **/
-void
-scg_mode_create_object (SheetControlGUI *scg, SheetObject *so)
-{
-	g_return_if_fail (IS_SHEET_OBJECT (so));
-
-	if (scg_mode_clear (scg)) {
-		scg->new_object = so;
-		scg_cursor_visible (scg, FALSE);
-		scg_take_focus (scg);
-		scg_set_display_cursor (scg);
-		wb_control_update_action_sensitivity (scg_wbc (scg));
-	}
-}
-
 static int
 calc_obj_place (GnmPane *pane, int canvas_coord, gboolean is_col,
 		float *offset)
@@ -2052,7 +2010,8 @@
 		    !wbcg_edit_finish (scg->wbcg, WBC_EDIT_ACCEPT, NULL))
 			return;
 		g_object_ref (so);
-		scg_mode_clear (scg);
+
+		wbcg_insert_object_clear (scg->wbcg);
 		scg_cursor_visible (scg, FALSE);
 		scg_set_display_cursor (scg);
 		scg_unant (SHEET_CONTROL (scg));
@@ -2357,7 +2316,7 @@
 		   int drag_type, double dx, double dy, gboolean symmetric, gboolean snap_to_grid)
 {
 	/* no nudging if we are creating an object */
-	if (!scg->new_object) {
+	if (!scg->wbcg->new_object) {
 		scg_objects_drag (scg, pane, NULL, &dx, &dy, drag_type, symmetric, snap_to_grid, FALSE);
 		scg_objects_drag_commit (scg, drag_type, FALSE);
 	}
@@ -2798,7 +2757,7 @@
 
 	g_return_if_fail (IS_SHEET_CONTROL_GUI (scg));
 
-	if (scg->new_object != NULL)
+	if (scg->wbcg->new_object != NULL)
 		cursor = GDK_CROSSHAIR;
 
 	SCG_FOREACH_PANE (scg, pane, {

Modified: trunk/src/sheet-control-gui.h
==============================================================================
--- trunk/src/sheet-control-gui.h	(original)
+++ trunk/src/sheet-control-gui.h	Thu Jun 19 13:02:01 2008
@@ -19,8 +19,6 @@
 
 void scg_take_focus             (SheetControlGUI *scg);
 
-void scg_mode_create_object	(SheetControlGUI *scg, SheetObject *so);
-
 void scg_context_menu		(SheetControlGUI *scg, GdkEventButton *event,
 				 gboolean is_col, gboolean is_row);
 
@@ -75,6 +73,7 @@
 				 gboolean force_scroll, gboolean couple_panes);
 
 void scg_set_display_cursor	(SheetControlGUI *scg);
+void scg_cursor_visible		(SheetControlGUI *scg, gboolean is_visible);
 void scg_cursor_move		(SheetControlGUI *scg, int dir,
 				 gboolean jump_to_bound, gboolean horiz);
 void scg_cursor_extend		(SheetControlGUI *scg, int n,

Modified: trunk/src/wbc-gtk-actions.c
==============================================================================
--- trunk/src/wbc-gtk-actions.c	(original)
+++ trunk/src/wbc-gtk-actions.c	Thu Jun 19 13:02:01 2008
@@ -963,7 +963,7 @@
 			guint8 const *data = gsf_input_read (input, len, NULL);
 			SheetObjectImage *soi = g_object_new (SHEET_OBJECT_IMAGE_TYPE, NULL);
 			sheet_object_image_set_image (soi, "", (guint8 *)data, len, TRUE);
-			scg_mode_create_object (wbcg_cur_scg (wbcg), SHEET_OBJECT (soi));
+			wbcg_insert_object (wbcg, SHEET_OBJECT (soi));
 			g_object_unref (input);
 		} else
 			go_cmd_context_error (GO_CMD_CONTEXT (wbcg), err);
@@ -1038,8 +1038,7 @@
 static void
 cb_add_graph (GogGraph *graph, gpointer wbcg)
 {
-	SheetControlGUI *scg = wbcg_cur_scg (WBC_GTK (wbcg));
-	scg_mode_create_object (scg, sheet_object_graph_new (graph));
+	wbcg_insert_object (WBC_GTK (wbcg), sheet_object_graph_new (graph));
 }
 
 static GNM_ACTION_DEF (cb_launch_chart_guru)
@@ -1055,17 +1054,11 @@
 	       char const *first_property_name,
 	       ...)
 {
-	SheetControlGUI *scg = wbcg_cur_scg (wbcg);
-	Sheet *sheet = scg_sheet (scg);
 	va_list	args;
-
 	va_start (args, first_property_name);
-	scg_mode_create_object (scg, (SheetObject *)
+	wbcg_insert_object (wbcg, (SheetObject *)
 		g_object_new_valist (t, first_property_name, args));
 	va_end (args);
-
-	workbook_recalc (sheet->workbook);
-	sheet_update (sheet);
 }
 
 static GNM_ACTION_DEF (cmd_create_label)

Modified: trunk/src/wbc-gtk-edit.c
==============================================================================
--- trunk/src/wbc-gtk-edit.c	(original)
+++ trunk/src/wbc-gtk-edit.c	Thu Jun 19 13:02:01 2008
@@ -977,6 +977,68 @@
 }
 
 /**
+ * wbcg_insert_object :
+ * @wbcg : #WBCGtk *
+ * @so : The object the needs to be placed
+ *
+ * Takes a newly created #SheetObject that has not yet been realized and
+ * prepares to place it on the sheet.
+ *
+ * NOTE : Absorbs a reference to the object.
+ **/
+void
+wbcg_insert_object (WBCGtk *wbcg, SheetObject *so)
+{
+	int i, npages;
+	SheetControlGUI *scg;
+
+	g_return_if_fail (IS_WBC_GTK (wbcg));
+	g_return_if_fail (IS_SHEET_OBJECT (so));
+
+	wbcg_insert_object_clear (wbcg);
+	wbcg->new_object = so;
+
+	npages = gtk_notebook_get_n_pages (wbcg->notebook);
+	for (i = 0; i < npages; i++)
+		if (NULL != (scg = wbcg_get_nth_scg (wbcg, i))) {
+			scg_object_unselect (scg, NULL);
+			scg_cursor_visible (scg, FALSE);
+			scg_set_display_cursor (scg);
+			sc_unant (SHEET_CONTROL (scg));
+		}
+
+	wb_control_update_action_sensitivity (WORKBOOK_CONTROL (wbcg));
+}
+
+/**
+ * wbcg_insert_object_clear :
+ * @wbcg : #WBCGtk
+ * 
+ * If we are preparing to insert a new object, unref the object, and restore
+ * a normal state to the scgs that was changed in wbcg_insert_object
+ * (e.g.  visiblity of cursors)
+ **/
+void
+wbcg_insert_object_clear (WBCGtk *wbcg)
+{
+	g_return_if_fail (IS_WBC_GTK (wbcg));
+
+	if (NULL != wbcg->new_object) {
+		int i, npages;
+		SheetControlGUI *scg;
+
+		g_object_unref (G_OBJECT (wbcg->new_object));
+		wbcg->new_object = NULL;
+
+		npages = gtk_notebook_get_n_pages (wbcg->notebook);
+		for (i = 0; i < npages; i++)
+			if (NULL != (scg = wbcg_get_nth_scg (wbcg, i)))
+				scg_cursor_visible (scg, TRUE);
+	}
+}
+
+
+/**
  * wbcg_get_entry :
  * @WBCGtk : @wbcg
  *
@@ -985,6 +1047,7 @@
 GtkEntry *
 wbcg_get_entry (WBCGtk const *wbcg)
 {
+	g_return_val_if_fail (IS_WBC_GTK (wbcg), NULL);
 	g_return_val_if_fail (wbcg != NULL, NULL);
 
 	return gnm_expr_entry_get_entry (wbcg->edit_line.entry);

Modified: trunk/src/wbc-gtk-impl.h
==============================================================================
--- trunk/src/wbc-gtk-impl.h	(original)
+++ trunk/src/wbc-gtk-impl.h	Thu Jun 19 13:02:01 2008
@@ -124,6 +124,8 @@
 	Sheet       *editing_sheet;
 	gboolean     editing;
 
+	SheetObject	 *new_object;	/* A newly created object that has yet to be realized */
+
 	char *preferred_geometry;
 };
 

Modified: trunk/src/wbc-gtk.c
==============================================================================
--- trunk/src/wbc-gtk.c	(original)
+++ trunk/src/wbc-gtk.c	Thu Jun 19 13:02:01 2008
@@ -167,7 +167,7 @@
 static SheetControlGUI *
 wbcg_get_scg (WBCGtk *wbcg, Sheet *sheet)
 {
-	GtkWidget *w;
+	SheetControlGUI *scg;
 	int i, npages;
 
 	if (sheet == NULL || wbcg->notebook == NULL)
@@ -176,12 +176,9 @@
 	g_return_val_if_fail (IS_SHEET (sheet), NULL);
 	g_return_val_if_fail (sheet->index_in_wb >= 0, NULL);
 
-	w = gtk_notebook_get_nth_page (wbcg->notebook, sheet->index_in_wb);
-	if (w) {
-		SheetControlGUI *scg = g_object_get_data (G_OBJECT (w), SHEET_CONTROL_KEY);
-		if (scg_sheet (scg) == sheet)
-			return scg;
-	}
+	scg = wbcg_get_nth_scg (wbcg, sheet->index_in_wb);
+	if (NULL != scg && scg_sheet (scg) == sheet)
+		return scg;
 
 	/*
 	 * index_in_wb is probably not accurate because we are in the
@@ -189,9 +186,8 @@
 	 */
 	npages = gtk_notebook_get_n_pages (wbcg->notebook);
 	for (i = 0; i < npages; i++) {
-		GtkWidget *w = gtk_notebook_get_nth_page (wbcg->notebook, i);
-		SheetControlGUI *scg = g_object_get_data (G_OBJECT (w), SHEET_CONTROL_KEY);
-		if (scg_sheet (scg) == sheet)
+		scg = wbcg_get_nth_scg (wbcg, i);
+		if (NULL != scg && scg_sheet (scg) == sheet)
 			return scg;
 	}
 
@@ -308,7 +304,7 @@
 	WBCGtk *wbcg = WBC_GTK (wbc);
 	SheetControlGUI	   *scg = wbcg_cur_scg (wbcg);
 	gboolean edit_object = scg != NULL &&
-		(scg->selected_objects != NULL || scg->new_object != NULL);
+		(scg->selected_objects != NULL || wbcg->new_object != NULL);
 	gboolean enable_actions = TRUE;
 	gboolean enable_edit_ok_cancel = FALSE;
 
@@ -506,13 +502,11 @@
 {
 	SheetControlGUI *scg;
 	gint n_source;
-	GtkWidget *p_source;
 
 	g_return_if_fail (IS_WBC_GTK (wbcg));
 
 	n_source = gnm_notebook_page_num_by_label (wbcg->notebook, widget);
-	p_source = gtk_notebook_get_nth_page (wbcg->notebook, n_source);
-	scg = g_object_get_data (G_OBJECT (p_source), SHEET_CONTROL_KEY);
+	scg = wbcg_get_nth_scg (wbcg, n_source);
 
 	gtk_selection_data_set (selection_data, selection_data->target,
 		8, (void *) scg, sizeof (scg));
@@ -740,7 +734,6 @@
 {
 	Sheet *sheet;
 	SheetControlGUI *new_scg;
-	GtkWidget *child;
 
 	g_return_if_fail (IS_WBC_GTK (wbcg));
 
@@ -758,9 +751,7 @@
 	if (NULL != wbcg->rangesel)
 		scg_rangesel_stop (wbcg->rangesel, TRUE);
 
-	child = gtk_notebook_get_nth_page (notebook, page_num);
-	new_scg = g_object_get_data (G_OBJECT (child), SHEET_CONTROL_KEY);
-
+	new_scg = wbcg_get_nth_scg (wbcg, page_num);
 	cb_direction_change (NULL, NULL, new_scg);
 
 	if (wbcg_is_editing (wbcg) && wbcg_rangesel_possible (wbcg)) {
@@ -1065,10 +1056,8 @@
 	SheetControlGUI **scgs = g_new (SheetControlGUI *, n);
 
 	/* Collect the scgs first as we are moving pages.  */
-	for (i = 0 ; i < n; i++) {
-		GtkWidget *w = gtk_notebook_get_nth_page (nb, i);
-		scgs[i] = g_object_get_data (G_OBJECT (w), SHEET_CONTROL_KEY);
-	}
+	for (i = 0 ; i < n; i++)
+		scgs[i] = wbcg_get_nth_scg (wbcg, i);
 
 	for (i = 0 ; i < n; i++) {
 		SheetControlGUI *scg = scgs[i];
@@ -1139,7 +1128,7 @@
 	gboolean const has_guru = wbc_gtk_get_guru (wbcg) != NULL;
 	gboolean has_filtered_rows = sheet->has_filtered_rows;
 	gboolean edit_object = scg != NULL &&
-		(scg->selected_objects != NULL || scg->new_object != NULL);
+		(scg->selected_objects != NULL || wbcg->new_object != NULL);
 
 	if (!has_filtered_rows) {
 		GSList *ptr = sheet->filters;
@@ -4394,6 +4383,8 @@
 	wbcg->editing_sheet = NULL;
 	wbcg->editing_cell  = NULL;
 
+	wbcg->new_object = NULL;
+
 #warning "why is this here ?"
 	wbcg->current_saver = NULL;
 	wbcg->menu_zone = gtk_vbox_new (TRUE, 0);
@@ -4627,6 +4618,33 @@
 	go_gtk_window_set_transient (wbcg_toplevel (wbcg), window);
 }
 
+/**
+ * wbcg_get_nth_scg
+ * @wbcg : #WBCGtk
+ * @i :
+ *
+ * Returns the scg associated with the @i-th tab in @wbcg's notebook.
+ * NOTE : @i != scg->sv->sheet->index_in_wb
+ **/
+SheetControlGUI *
+wbcg_get_nth_scg (WBCGtk *wbcg, int i)
+{
+	SheetControlGUI *scg;
+	GtkWidget *w;
+
+	g_return_val_if_fail (IS_WBC_GTK (wbcg), NULL);
+
+	if (NULL != wbcg->notebook &&
+	    NULL != (w = gtk_notebook_get_nth_page (wbcg->notebook, i)) &&
+	    NULL != (scg = g_object_get_data (G_OBJECT (w), SHEET_CONTROL_KEY)) &&
+	    NULL != scg->table &&
+	    NULL != scg_sheet (scg) &&
+	    NULL != scg_view (scg)) 
+		return scg;
+
+	return NULL;
+}
+
 #warning merge these and clarfy whether we want the visible scg, or the logical (view) scg
 /**
  * wbcg_focus_cur_scg :
@@ -4641,7 +4659,6 @@
 Sheet *
 wbcg_focus_cur_scg (WBCGtk *wbcg)
 {
-	GtkWidget *table;
 	SheetControlGUI *scg;
 
 	g_return_val_if_fail (IS_WBC_GTK (wbcg), NULL);
@@ -4649,9 +4666,8 @@
 	if (wbcg->notebook == NULL)
 		return NULL;
 
-	table = gtk_notebook_get_nth_page (wbcg->notebook,
+	scg = wbcg_get_nth_scg (wbcg,
 		gtk_notebook_get_current_page (wbcg->notebook));
-	scg = g_object_get_data (G_OBJECT (table), SHEET_CONTROL_KEY);
 
 	g_return_val_if_fail (scg != NULL, NULL);
 

Modified: trunk/src/wbc-gtk.h
==============================================================================
--- trunk/src/wbc-gtk.h	(original)
+++ trunk/src/wbc-gtk.h	Thu Jun 19 13:02:01 2008
@@ -25,6 +25,7 @@
 GtkWindow	*wbcg_toplevel	  (WBCGtk *wbcg);
 void	         wbcg_set_transient (WBCGtk *wbcg,
 				     GtkWindow *window);
+SheetControlGUI *wbcg_get_nth_scg (WBCGtk *wbcg, int page);
 SheetControlGUI *wbcg_cur_scg	  (WBCGtk *wbcg);
 Sheet		*wbcg_cur_sheet	  (WBCGtk *wbcg);
 Sheet		*wbcg_focus_cur_scg (WBCGtk *wbcg);
@@ -62,6 +63,9 @@
 gboolean wbcg_edit_start  (WBCGtk *wbcg,
 			   gboolean blankp, gboolean cursorp);
 
+void	    wbcg_insert_object		(WBCGtk *wbcg, SheetObject *so);
+void	    wbcg_insert_object_clear	(WBCGtk *wbcg);
+
 void	    wbc_gtk_detach_guru		(WBCGtk *wbcg);
 void	    wbc_gtk_attach_guru		(WBCGtk *wbcg, GtkWidget *guru);
 void	    wbc_gtk_attach_guru_with_unfocused_rs (WBCGtk *wbcg, GtkWidget *guru,



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