[anjuta] project-manager: bgo #534966 - Order alphabetically project's targets on project tab



commit 1921e7f984e5602e4b2ba8ea75058f68a4fe8a65
Author: Sébastien Granjoux <seb sfo free fr>
Date:   Sat Jan 29 21:42:42 2011 +0100

    project-manager: bgo #534966 - Order alphabetically project's targets on project tab

 plugins/project-manager/anjuta-project-manager.xml |    2 +
 plugins/project-manager/plugin.c                   |   18 +++-
 plugins/project-manager/project-model.c            |  141 ++++++++++++++++++++
 plugins/project-manager/project-model.h            |    1 +
 plugins/project-manager/project-view.c             |   13 ++
 plugins/project-manager/project-view.h             |    2 +
 6 files changed, 176 insertions(+), 1 deletions(-)
---
diff --git a/plugins/project-manager/anjuta-project-manager.xml b/plugins/project-manager/anjuta-project-manager.xml
index 4c9688b..4306f6f 100644
--- a/plugins/project-manager/anjuta-project-manager.xml
+++ b/plugins/project-manager/anjuta-project-manager.xml
@@ -34,6 +34,8 @@
 		<menuitem name="Remove" action="ActionPopupProjectRemove"/>
 		<separator name="separator3"/>
 		<menuitem name="Properties" action="ActionPopupProjectProperties"/>
+		<separator name="separator4"/>
+		<menuitem name="SortShortcut" action="ActionPopupProjectSortShortcut"/>
 	</popup>
 	<popup name="PopupFileManager">
 		<placeholder name="PlaceholderPopupFileProject">
diff --git a/plugins/project-manager/plugin.c b/plugins/project-manager/plugin.c
index 24b836c..b24d8d8 100644
--- a/plugins/project-manager/plugin.c
+++ b/plugins/project-manager/plugin.c
@@ -544,6 +544,12 @@ on_popup_properties (GtkAction *action, ProjectManagerPlugin *plugin)
 }
 
 static void
+on_popup_sort_shortcuts (GtkAction *action, ProjectManagerPlugin *plugin)
+{
+	gbf_project_view_sort_shortcuts (plugin->view);
+}
+
+static void
 on_popup_new_package (GtkAction *action, ProjectManagerPlugin *plugin)
 {
 	GtkTreeIter selected_module;
@@ -959,6 +965,11 @@ static GtkActionEntry popup_actions[] =
 		"ActionPopupProjectRemove", GTK_STOCK_REMOVE,
 		N_("Re_move"), NULL, N_("Remove from project"),
 		G_CALLBACK (on_popup_remove)
+	},
+	{
+		"ActionPopupProjectSortShortcut", GTK_STOCK_SORT_ASCENDING,
+		N_("_Sort"), NULL, N_("Sort shortcuts"),
+		G_CALLBACK (on_popup_sort_shortcuts)
 	}
 };
 
@@ -973,7 +984,7 @@ update_ui (ProjectManagerPlugin *plugin)
 	
 	/* Close project is always here */
 	main_caps = 0x101;
-	popup_caps = 0x000;
+	popup_caps = 0x100;
 	
 	/* Check for supported node */
 	caps = anjuta_pm_project_get_capabilities (plugin->project);
@@ -1044,10 +1055,12 @@ on_treeview_selection_changed (GtkTreeSelection *sel,
 	AnjutaProjectNode *node;
 	gint state = 0;
 	GFile *selected_file;
+	GbfTreeData *data;
 	
 	ui = anjuta_shell_get_ui (ANJUTA_PLUGIN (plugin)->shell, NULL);
 	node = gbf_project_view_find_selected (plugin->view,
 										   ANJUTA_PROJECT_UNKNOWN);
+	data = gbf_project_view_get_first_selected (plugin->view, NULL);
 
 	if (node != NULL)
 	{
@@ -1081,6 +1094,9 @@ on_treeview_selection_changed (GtkTreeSelection *sel,
 	action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
 								   "ActionPopupProjectRemove");
 	g_object_set (G_OBJECT (action), "sensitive", INT_TO_GBOOLEAN (state & ANJUTA_PROJECT_CAN_REMOVE), NULL);
+	action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
+								   "ActionPopupProjectSortShortcut");
+	g_object_set (G_OBJECT (action), "sensitive", (data != NULL) && (data->type == GBF_TREE_NODE_SHORTCUT), NULL);
 	
 	selected_file = node != NULL ? anjuta_project_node_get_file (node) : NULL;
 	if (selected_file)
diff --git a/plugins/project-manager/project-model.c b/plugins/project-manager/project-model.c
index 2ece8e1..1cd7e57 100644
--- a/plugins/project-manager/project-model.c
+++ b/plugins/project-manager/project-model.c
@@ -296,6 +296,110 @@ gbf_project_model_remove_invalid_shortcut (GbfProjectModel *model, GtkTreeIter *
 	return FALSE;
 }
 
+/* Sort model
+ *---------------------------------------------------------------------------*/
+
+static gint 
+sort_by_name (GtkTreeModel *model,
+              GtkTreeIter  *iter_a,
+              GtkTreeIter  *iter_b,
+              gpointer      user_data)
+{
+	GbfTreeData *data_a, *data_b;
+	
+	gtk_tree_model_get (model, iter_a,
+			    GBF_PROJECT_MODEL_COLUMN_DATA, &data_a,
+			    -1);
+	gtk_tree_model_get (model, iter_b,
+			    GBF_PROJECT_MODEL_COLUMN_DATA, &data_b,
+			    -1);
+
+	return strcmp (data_a->name, data_b->name);
+}
+
+
+static void
+gbf_project_model_merge (GtkTreeModel *model,
+                         GtkTreePath *begin,
+                         GtkTreePath *half,
+                         GtkTreePath *end,
+                         GtkTreeIterCompareFunc compare_func,
+                         gpointer user_data)
+{
+	GtkTreeIter right;
+	GtkTreeIter left;
+
+	if (gtk_tree_model_get_iter (model, &left, begin) &&
+	    gtk_tree_model_get_iter (model, &right, half))
+	{
+		gint depth;
+		gint ll, lr;
+
+		
+		/* Get number of elements in both list */
+		ll = (gtk_tree_path_get_indices_with_depth (half, &depth)[depth - 1]
+		      - gtk_tree_path_get_indices_with_depth (begin, &depth)[depth - 1]);
+		lr = (gtk_tree_path_get_indices_with_depth (end, &depth)[depth - 1]
+		      - gtk_tree_path_get_indices_with_depth (half, &depth)[depth - 1]);
+
+		while (ll && lr)
+		{
+			if (compare_func (model, &left, &right, user_data) <= 0)
+			{
+				gtk_tree_model_iter_next (model, &left);
+				ll--;
+			}
+			else
+			{
+				GtkTreeIter iter;
+
+				iter = right;
+				gtk_tree_model_iter_next (model, &right);
+				lr--;
+				gtk_tree_store_move_before (GTK_TREE_STORE (model), &iter, &left);
+			}
+		}
+	}
+}
+
+/* sort using merge sort */
+static void
+gbf_project_model_sort (GtkTreeModel *model,
+                        GtkTreePath *begin,
+                        GtkTreePath *end,
+                        GtkTreeIterCompareFunc compare_func,
+                        gpointer user_data)
+{
+	GtkTreePath *half;
+	gint depth;
+
+	/* Empty list are sorted */
+	if (gtk_tree_path_compare (begin, end) >= 0)
+	{
+		return;
+	}
+
+	/* Split the list in two */
+	half = gtk_tree_path_copy (begin);
+	gtk_tree_path_up (half);
+	gtk_tree_path_append_index (half, (gtk_tree_path_get_indices_with_depth (begin, &depth)[depth -1] +
+	                                   gtk_tree_path_get_indices_with_depth (end, &depth)[depth - 1]) / 2);
+
+	/* List with a single element are sorted too */
+	if (gtk_tree_path_compare (begin, half) < 0)
+	{
+		gbf_project_model_sort (model, begin, half, compare_func, user_data);
+		gbf_project_model_sort (model, half, end, compare_func, user_data);
+		gbf_project_model_merge (model, begin, half, end, compare_func, user_data);
+	}
+	
+	gtk_tree_path_free (half);
+}
+
+
+/* Public function
+ *---------------------------------------------------------------------------*/
+
 gboolean
 gbf_project_model_remove (GbfProjectModel *model, GtkTreeIter *iter)
 {
@@ -1057,3 +1161,40 @@ gbf_project_model_set_default_shortcut (GbfProjectModel *model,
 {
 	model->priv->default_shortcut = enable;
 }
+
+void
+gbf_project_model_sort_shortcuts (GbfProjectModel *model)
+{
+	GtkTreeIter iter;
+
+	/* Get all shortcut */
+	if (gtk_tree_model_iter_children (GTK_TREE_MODEL (model), &iter, NULL))
+	{
+		GtkTreePath *begin;
+		GtkTreePath *end;
+		gboolean valid;
+
+		begin = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
+		do
+		{
+			GbfTreeData *data;
+			
+			gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
+	   			 GBF_PROJECT_MODEL_COLUMN_DATA, &data,
+		    		-1);
+
+			/* Shortcuts are always at the beginning */
+			if (data->type != GBF_TREE_NODE_SHORTCUT) break;
+			
+			valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter);
+		}
+		while (valid);
+
+
+		
+		end = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
+		gbf_project_model_sort (GTK_TREE_MODEL (model), begin, end, sort_by_name, NULL);
+		gtk_tree_path_free (begin);
+		gtk_tree_path_free (end);
+	}
+}
diff --git a/plugins/project-manager/project-model.h b/plugins/project-manager/project-model.h
index 56a63ac..7571fc2 100644
--- a/plugins/project-manager/project-model.h
+++ b/plugins/project-manager/project-model.h
@@ -118,6 +118,7 @@ void            gbf_project_model_move_target_shortcut    (GbfProjectModel *mode
                                                            GtkTreePath     *before_path);
 void            gbf_project_model_set_default_shortcut    (GbfProjectModel *model, gboolean enable);
 
+void            gbf_project_model_sort_shortcuts            (GbfProjectModel *model);
 
 
 #endif
diff --git a/plugins/project-manager/project-view.c b/plugins/project-manager/project-view.c
index aaebfcb..a331503 100644
--- a/plugins/project-manager/project-view.c
+++ b/plugins/project-manager/project-view.c
@@ -1107,6 +1107,19 @@ gbf_project_view_update_tree (GbfProjectView *view, AnjutaProjectNode *parent, G
 /* Shorcuts functions
  *---------------------------------------------------------------------------*/
 
+void
+gbf_project_view_sort_shortcuts (GbfProjectView *view)
+{
+	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (view->model),
+	                                      GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID,
+	                                      GTK_SORT_ASCENDING);
+	gbf_project_model_sort_shortcuts (view->model);
+	gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (view->model),
+	                                      GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
+	                                      GTK_SORT_ASCENDING);
+	
+}
+
 GList *
 gbf_project_view_get_shortcut_list (GbfProjectView *view)
 {
diff --git a/plugins/project-manager/project-view.h b/plugins/project-manager/project-view.h
index 510415e..a528e0d 100644
--- a/plugins/project-manager/project-view.h
+++ b/plugins/project-manager/project-view.h
@@ -97,6 +97,8 @@ void			gbf_project_view_set_shortcut_list (GbfProjectView *view,
 void			gbf_project_view_set_expanded_list (GbfProjectView *view,
 								GList   *expanded);
 
+void			gbf_project_view_sort_shortcuts (GbfProjectView *view);
+
 void            gbf_project_view_update_tree (GbfProjectView *view,
                                                     AnjutaProjectNode *parent,
                                                     GtkTreeIter *iter);



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