gnumeric r16913 - in trunk: . src/dialogs



Author: guelzow
Date: Wed Oct 22 03:34:32 2008
New Revision: 16913
URL: http://svn.gnome.org/viewvc/gnumeric?rev=16913&view=rev

Log:
2008-10-21  Andreas J. Guelzow <aguelzow pyrshep ca>

	* dialog-sheet-order.c (gtmff_compare_func): new
	(gtmff_asc): new
	(sort_asc_desc): new
	(cb_asc): new
	(cb_desc): new
	(cb_selection_changed): enable/disable the sort buttons
	(dialog_sheet_order): hookup and enable the sort buttons




Modified:
   trunk/NEWS
   trunk/src/dialogs/ChangeLog
   trunk/src/dialogs/dialog-sheet-order.c

Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS	(original)
+++ trunk/NEWS	Wed Oct 22 03:34:32 2008
@@ -2,8 +2,10 @@
 
 Andreas:
 	* Change sheet manage dialog into an instant-apply dialog
-	* Implemented sheet duplication in manage sheet dialog [#128160]
+	* Implemented sheet duplication in manage sheets dialog [#128160]
 	* Allow for undos in the manage sheet dialog
+	* Permit lexicographic sorting by sheet names in the manage sheets
+	  dialog [#527076]
 
 Jody:
 	* Display top-left when selecting a rel ref to a merged region.

Modified: trunk/src/dialogs/dialog-sheet-order.c
==============================================================================
--- trunk/src/dialogs/dialog-sheet-order.c	(original)
+++ trunk/src/dialogs/dialog-sheet-order.c	Wed Oct 22 03:34:32 2008
@@ -115,6 +115,7 @@
 };
 
 static char *verify_validity (SheetManager *state, gboolean *pchanged);
+static void dialog_sheet_order_update_sheet_order (SheetManager *state);
 
 
 static void
@@ -153,7 +154,7 @@
 }
 
 static void
-cb_name_edited (G_GNUC_UNUSED GtkCellRendererText *cell,
+cb_name_edited (GtkCellRendererText *cell,
 	gchar               *path_string,
 	gchar               *new_text,
         SheetManager        *state)
@@ -186,6 +187,102 @@
 	}
 }
 
+
+typedef struct {
+	char *key;
+	int i;
+} gtmff_sort_t;
+
+static gint
+gtmff_compare_func (gconstpointer a, gconstpointer b)
+{
+	gtmff_sort_t const *pa = a, *pb = b;
+
+	return strcmp (pa->key, pb->key);
+}
+
+
+static gboolean
+gtmff_asc (GtkTreeModel *model, GtkTreePath *path,
+	   GtkTreeIter *iter, gpointer data)
+{
+	GSList **l = data;
+	Sheet *this_sheet;
+	char *name;
+	gtmff_sort_t *ptr;
+	
+
+	ptr = g_new (gtmff_sort_t, 1);
+	gtk_tree_model_get (model, iter, 
+			    SHEET_POINTER, &this_sheet,
+			    SHEET_NAME, &name,
+			    -1);
+	ptr->i = this_sheet->index_in_wb;
+	ptr->key = g_utf8_collate_key_for_filename (name, -1);
+
+	*l = g_slist_insert_sorted (*l, ptr, (GCompareFunc) gtmff_compare_func); 
+
+	return FALSE;
+}
+
+static void
+sort_asc_desc (SheetManager *state, gboolean asc)
+{
+	WorkbookSheetState *old_state;
+	WorkbookControl *wbc = WORKBOOK_CONTROL (state->wbcg);
+	Workbook *wb = wb_control_get_workbook (wbc);
+	GSList *l = NULL, *l_tmp;
+	gint n = 0;
+
+	gtk_tree_model_foreach (GTK_TREE_MODEL (state->model), gtmff_asc, &l);
+
+	if (!asc)
+		l = g_slist_reverse (l);
+
+	workbook_signals_block (state);
+
+	old_state = workbook_sheet_state_new (wb);
+
+	for (l_tmp = l; l_tmp != NULL; l_tmp = l_tmp->next) {
+		gtmff_sort_t *ptr = l_tmp->data;
+		GtkTreeIter iter;
+		Sheet *sheet;
+		
+		gtk_tree_model_iter_nth_child  (GTK_TREE_MODEL (state->model),
+						&iter, NULL, ptr->i);
+		g_free (ptr->key);
+		g_free (ptr);
+		l_tmp->data = NULL;
+
+		gtk_tree_model_get (GTK_TREE_MODEL (state->model), &iter,
+				    SHEET_POINTER, &sheet,
+				    -1);
+		workbook_sheet_move (sheet, n - sheet->index_in_wb);
+		n++;
+	}
+	g_slist_free (l);
+
+	/* Now we change the list store  */
+	dialog_sheet_order_update_sheet_order (state);
+	
+	cmd_reorganize_sheets (wbc, old_state, NULL);
+	update_undo (state, wbc);
+
+	workbook_signals_unblock (state);
+}
+
+static void
+cb_asc (G_GNUC_UNUSED GtkWidget *w, SheetManager *state)
+{
+	sort_asc_desc (state, TRUE);
+}
+
+static void
+cb_desc (G_GNUC_UNUSED GtkWidget *w, SheetManager *state)
+{
+	sort_asc_desc (state, FALSE);
+}
+
 static gboolean
 color_equal (const GdkColor *color_a, const GnmColor *color_gb)
 {
@@ -300,6 +397,11 @@
 	GdkColor *fore, *back;
 	GtkTreeSelection *selection = gtk_tree_view_get_selection (state->sheet_list);
 
+	gboolean multiple = gtk_tree_model_iter_n_children(GTK_TREE_MODEL (state->model), NULL) > 1;
+
+	gtk_widget_set_sensitive (state->sort_asc_btn, multiple);
+	gtk_widget_set_sensitive (state->sort_desc_btn, multiple);
+
 	if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
 		gtk_widget_set_sensitive (state->up_btn, FALSE);
 		gtk_widget_set_sensitive (state->down_btn, FALSE);
@@ -328,9 +430,7 @@
 
 	gtk_widget_set_sensitive (state->ccombo_back, TRUE);
 	gtk_widget_set_sensitive (state->ccombo_fore, TRUE);
-	gtk_widget_set_sensitive 
-	  (state->delete_btn, 
-	   gtk_tree_model_iter_n_children(GTK_TREE_MODEL (state->model), NULL)>1);
+	gtk_widget_set_sensitive (state->delete_btn, multiple);
 	gtk_widget_set_sensitive (state->add_btn, TRUE);
 	gtk_widget_set_sensitive (state->duplicate_btn, TRUE);
 
@@ -1333,6 +1433,8 @@
 #define CONNECT(o,s,c) g_signal_connect(G_OBJECT(o),s,G_CALLBACK(c),state)
 	CONNECT (state->up_btn, "clicked", cb_up);
 	CONNECT (state->down_btn, "clicked", cb_down);
+	CONNECT (state->sort_asc_btn, "clicked", cb_asc);
+	CONNECT (state->sort_desc_btn, "clicked", cb_desc);
 	CONNECT (state->add_btn, "clicked", cb_add_clicked);
 	CONNECT (state->append_btn, "clicked", cb_append_clicked);
 	CONNECT (state->duplicate_btn, "clicked", cb_duplicate_clicked);
@@ -1351,9 +1453,6 @@
 		glade_xml_get_widget (state->gui, "help_button"),
 		GNUMERIC_HELP_LINK_SHEET_MANAGER);
 
-	gtk_widget_set_sensitive (state->sort_asc_btn, FALSE);
-	gtk_widget_set_sensitive (state->sort_desc_btn, FALSE);
-
 	gtk_widget_set_sensitive (state->undo_btn, wb->undo_commands != NULL);
 	gtk_widget_set_sensitive (state->apply_names_btn, FALSE);
 



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