[anjuta] pm: Reorganize link between GbfTreeData and AnjutaProjectNode



commit 4fa366974cde3c1d7fb239e5a8128c2200ce4a1e
Author: Sébastien Granjoux <seb sfo free fr>
Date:   Wed Jan 13 19:55:35 2010 +0100

    pm: Reorganize link between GbfTreeData and AnjutaProjectNode

 plugins/project-manager/gbf-project-model.c |   24 ++--
 plugins/project-manager/gbf-project-model.h |    5 +-
 plugins/project-manager/gbf-project-util.c  |   28 ++---
 plugins/project-manager/gbf-project-util.h  |    8 +-
 plugins/project-manager/gbf-project-view.c  |    6 +-
 plugins/project-manager/gbf-project-view.h  |   12 +-
 plugins/project-manager/gbf-tree-data.c     |  125 +++++++++++++++++++++++
 plugins/project-manager/gbf-tree-data.h     |   24 +++--
 plugins/project-manager/plugin.c            |  145 +++++++++++++++-----------
 9 files changed, 262 insertions(+), 115 deletions(-)
---
diff --git a/plugins/project-manager/gbf-project-model.c b/plugins/project-manager/gbf-project-model.c
index 474c3b8..7723311 100644
--- a/plugins/project-manager/gbf-project-model.c
+++ b/plugins/project-manager/gbf-project-model.c
@@ -292,7 +292,7 @@ gbf_project_model_remove (GbfProjectModel *model, GtkTreeIter *iter)
 		valid = gbf_project_model_remove (model, &child);
 	}
 	
-	gtk_tree_model_get (model, iter,
+	gtk_tree_model_get (GTK_TREE_MODEL (model), iter,
 		    GBF_PROJECT_MODEL_COLUMN_DATA, &data,
 		    -1);
 	valid = gtk_tree_store_remove (GTK_TREE_STORE (model), iter);
@@ -306,7 +306,6 @@ static void
 gbf_project_model_clear (GbfProjectModel *model)
 {
 	GtkTreeIter child;
-	GbfTreeData *data;
 	gboolean valid;
 
 	valid = gtk_tree_model_iter_children (GTK_TREE_MODEL (model), &child, NULL);
@@ -712,9 +711,9 @@ unload_project (GbfProjectModel *model)
 }
 
 static gboolean 
-recursive_find_id (GtkTreeModel   	*model,
-		   GtkTreeIter     	*iter,
-		   GbfTreeData  	*data)
+recursive_find_tree_data (GtkTreeModel  *model,
+		          GtkTreeIter   *iter,
+		          GbfTreeData  	*data)
 {
 	GtkTreeIter tmp;
 	gboolean retval = FALSE;
@@ -727,13 +726,14 @@ recursive_find_id (GtkTreeModel   	*model,
 		
 		gtk_tree_model_get (model, &tmp,
 				    GBF_PROJECT_MODEL_COLUMN_DATA, &tmp_data, -1);
-		if (tmp_data == data) {
+		if (gbf_tree_data_equal (tmp_data, data))
+		{
 			*iter = tmp;
 			retval = TRUE;
 		}
 		
 		if (gtk_tree_model_iter_children (model, &child, &tmp)) {
-			if (recursive_find_id (model, &child, data)) {
+			if (recursive_find_tree_data (model, &child, data)) {
 				*iter = child;
 				retval = TRUE;
 			}
@@ -745,9 +745,9 @@ recursive_find_id (GtkTreeModel   	*model,
 }
 
 gboolean 
-gbf_project_model_find_id (GbfProjectModel 	*model,
-			   GtkTreeIter     	*iter,
-			   GbfTreeData  	*data)
+gbf_project_model_find_tree_data (GbfProjectModel 	*model,
+			          GtkTreeIter     	*iter,
+			          GbfTreeData  		*data)
 {
 	GtkTreePath *root;
 	GtkTreeIter tmp_iter;
@@ -758,7 +758,7 @@ gbf_project_model_find_id (GbfProjectModel 	*model,
 		return FALSE;
 
 	if (gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &tmp_iter, root)) {
-		if (recursive_find_id (GTK_TREE_MODEL (model), &tmp_iter, data)) {
+		if (recursive_find_tree_data (GTK_TREE_MODEL (model), &tmp_iter, data)) {
 			retval = TRUE;
 			*iter = tmp_iter;
 		}
@@ -871,7 +871,7 @@ recursive_find_source (GtkTreeModel   	*model,
 	return NULL;
 }
 
-GbfTreeData*
+static GbfTreeData*
 gbf_project_model_find_uri (GbfProjectModel     *model,
     			    const gchar         *uri,
     			    GbfTreeNodeType     type)
diff --git a/plugins/project-manager/gbf-project-model.h b/plugins/project-manager/gbf-project-model.h
index aa73dda..77a5017 100644
--- a/plugins/project-manager/gbf-project-model.h
+++ b/plugins/project-manager/gbf-project-model.h
@@ -61,12 +61,9 @@ void             gbf_project_model_set_project       (GbfProjectModel   *model,
 IAnjutaProject  *gbf_project_model_get_project       (GbfProjectModel   *model);
 
 GtkTreePath     *gbf_project_model_get_project_root  (GbfProjectModel   *model);
-gboolean         gbf_project_model_find_id           (GbfProjectModel   *model,
+gboolean         gbf_project_model_find_tree_data    (GbfProjectModel   *model,
                                                       GtkTreeIter       *iter,
                                                       GbfTreeData       *data);
-GbfTreeData     *gbf_project_model_find_uri          (GbfProjectModel   *model,
-                                                      const gchar       *uri,
-                                                      GbfTreeNodeType   type);
 AnjutaProjectNode *gbf_project_model_get_node        (GbfProjectModel *model,
                                                       GtkTreeIter     *iter);
 
diff --git a/plugins/project-manager/gbf-project-util.c b/plugins/project-manager/gbf-project-util.c
index 88d37ea..4c7ac62 100644
--- a/plugins/project-manager/gbf-project-util.c
+++ b/plugins/project-manager/gbf-project-util.c
@@ -77,11 +77,10 @@ groups_filter_fn (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 static void 
 setup_groups_treeview (GbfProjectModel    *model,
                        GtkWidget          *view,
-                       GbfTreeData        *select_group)
+                       GtkTreeIter        *select_group)
 {
     GtkTreeModel *filter;
     GtkTreePath *path;
-    GtkTreeIter iter;
     
     g_return_if_fail (model != NULL);
     g_return_if_fail (view != NULL && GBF_IS_PROJECT_VIEW (view));
@@ -93,11 +92,11 @@ setup_groups_treeview (GbfProjectModel    *model,
     g_object_unref (filter);
     
     /* select default group */
-    if (select_group && gbf_project_model_find_id (model, &iter, select_group)) {
+    if (select_group) {
         GtkTreeIter iter_filter;
 
         gtk_tree_model_filter_convert_child_iter_to_iter (
-            GTK_TREE_MODEL_FILTER (filter), &iter_filter, &iter);
+            GTK_TREE_MODEL_FILTER (filter), &iter_filter, select_group);
         path = gtk_tree_model_get_path (filter, &iter_filter);
         gtk_tree_view_expand_to_path (GTK_TREE_VIEW (view), path);
     } else {
@@ -164,7 +163,7 @@ entry_changed_cb (GtkEditable *editable, gpointer user_data)
 AnjutaProjectGroup*
 gbf_project_util_new_group (GbfProjectModel    *model,
                             GtkWindow          *parent,
-                            GbfTreeData        *default_group,
+                            GtkTreeIter        *default_group,
                             const gchar        *default_group_name_to_add)
 {
     GtkBuilder *gui;
@@ -304,7 +303,7 @@ build_types_store (IAnjutaProject *project)
 AnjutaProjectTarget* 
 gbf_project_util_new_target (GbfProjectModel *model,
                              GtkWindow       *parent,
-                             GbfTreeData     *default_group,
+                             GtkTreeIter     *default_group,
                              const gchar     *default_target_name_to_add)
 {
     GtkBuilder *gui;
@@ -451,10 +450,10 @@ targets_filter_fn (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 static void 
 setup_targets_treeview (GbfProjectModel     *model,
                         GtkWidget           *view,
-                        GbfTreeData         *select_target)
+                        GtkTreeIter         *select_target)
 {
     GtkTreeModel *filter;
-    GtkTreeIter iter, iter_filter;
+    GtkTreeIter iter_filter;
     GtkTreePath *path = NULL;
     
     g_return_if_fail (model != NULL);
@@ -468,12 +467,9 @@ setup_targets_treeview (GbfProjectModel     *model,
 
     /* select default target */
     if (select_target) {
-        if (gbf_project_model_find_id (model, &iter, select_target))
-        {
-            gtk_tree_model_filter_convert_child_iter_to_iter (
-                GTK_TREE_MODEL_FILTER (filter), &iter_filter, &iter);
-            path = gtk_tree_model_get_path (filter, &iter_filter);
-        }
+        gtk_tree_model_filter_convert_child_iter_to_iter (
+                GTK_TREE_MODEL_FILTER (filter), &iter_filter, select_target);
+        path = gtk_tree_model_get_path (filter, &iter_filter);
     }
     if (path)
     {
@@ -573,7 +569,7 @@ on_row_changed(GtkTreeModel* model, GtkTreePath* path, GtkTreeIter* iter, gpoint
 AnjutaProjectSource*
 gbf_project_util_add_source (GbfProjectModel     *model,
                              GtkWindow           *parent,
-                             GbfTreeData         *default_target,
+                             GtkTreeIter         *default_target,
                              const gchar         *default_uri)
 {
         GList* new_sources;
@@ -603,7 +599,7 @@ gbf_project_util_add_source (GbfProjectModel     *model,
 GList* 
 gbf_project_util_add_source_multi (GbfProjectModel     *model,
 				   GtkWindow           *parent,
-                                   GbfTreeData         *default_target,
+                                   GtkTreeIter         *default_target,
 				   GList               *uris_to_add)
 {
     GtkBuilder *gui;
diff --git a/plugins/project-manager/gbf-project-util.h b/plugins/project-manager/gbf-project-util.h
index 26024d5..d1250f7 100644
--- a/plugins/project-manager/gbf-project-util.h
+++ b/plugins/project-manager/gbf-project-util.h
@@ -32,22 +32,22 @@ G_BEGIN_DECLS
 
 AnjutaProjectGroup* gbf_project_util_new_group  (GbfProjectModel   *model,
 				                GtkWindow          *parent,
-				                GbfTreeData        *default_group,
+				                GtkTreeIter        *default_group,
 				                const gchar        *default_group_name_to_add);
 
 AnjutaProjectTarget* gbf_project_util_new_target (GbfProjectModel  *model,
 				                GtkWindow          *parent,
-				                GbfTreeData        *default_group,
+				                GtkTreeIter        *default_group,
 				                const gchar        *default_target_name_to_add);
 
 AnjutaProjectSource* gbf_project_util_add_source (GbfProjectModel   *model,
 				                GtkWindow           *parent,
-				                GbfTreeData         *default_target,
+				                GtkTreeIter         *default_target,
 				                const gchar         *default_uri_to_add);
 
 GList* gbf_project_util_add_source_multi (GbfProjectModel   *model,
 				        GtkWindow           *parent,
-        		                GbfTreeData         *default_target,
+        		                GtkTreeIter         *default_target,
 				        GList               *uris_to_add);
 				    
 GList * gbf_project_util_all_child (AnjutaProjectNode *parent,
diff --git a/plugins/project-manager/gbf-project-view.c b/plugins/project-manager/gbf-project-view.c
index 130f1d4..971436c 100644
--- a/plugins/project-manager/gbf-project-view.c
+++ b/plugins/project-manager/gbf-project-view.c
@@ -406,7 +406,7 @@ gbf_project_view_find_selected (GbfProjectView *view, AnjutaProjectNodeType type
 }
 
 GbfTreeData *
-gbf_project_view_get_selected (GbfProjectView *view)
+gbf_project_view_get_selected (GbfProjectView *view, GtkTreeIter* selected)
 {
 	GtkTreeSelection *selection;
 	GtkTreeModel *model;
@@ -424,8 +424,9 @@ gbf_project_view_get_selected (GbfProjectView *view)
 			GtkTreeIter child_iter;
 			
 			gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_iter, &iter);
-			iter = child_iter;			
+			iter = child_iter;
 		}
+		if (selected) *selected = iter;
 		
 	
 		gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
@@ -435,4 +436,3 @@ gbf_project_view_get_selected (GbfProjectView *view)
 
 	return data;
 }
-
diff --git a/plugins/project-manager/gbf-project-view.h b/plugins/project-manager/gbf-project-view.h
index 8909624..f93034e 100644
--- a/plugins/project-manager/gbf-project-view.h
+++ b/plugins/project-manager/gbf-project-view.h
@@ -58,13 +58,13 @@ struct _GbfProjectViewClass {
 				   AnjutaProjectGroup  *group);
 };
 
-GType                       gbf_project_view_get_type         (void);
-GtkWidget                  *gbf_project_view_new              (void);
-
-AnjutaProjectNode          *gbf_project_view_find_selected    (GbfProjectView *view,
-							       AnjutaProjectNodeType type);
-GbfTreeData                *gbf_project_view_get_selected      (GbfProjectView *view);
+GType                       gbf_project_view_get_type          (void);
+GtkWidget                  *gbf_project_view_new               (void);
 
+AnjutaProjectNode          *gbf_project_view_find_selected     (GbfProjectView *view,
+							        AnjutaProjectNodeType type);
+GbfTreeData                *gbf_project_view_get_selected      (GbfProjectView *view,
+                                                                GtkTreeIter    *selected);
 
 G_END_DECLS
 
diff --git a/plugins/project-manager/gbf-tree-data.c b/plugins/project-manager/gbf-tree-data.c
index 36465fe..70218d0 100644
--- a/plugins/project-manager/gbf-tree-data.c
+++ b/plugins/project-manager/gbf-tree-data.c
@@ -26,6 +26,8 @@
 #include <gio/gio.h>
 #include "gbf-tree-data.h"
 
+#include <string.h>
+
 /**
  * The GbfTreeData object store all data needed by each element of the project
  * tree view. It has the same role than AnjutaProjectNode in the project
@@ -109,6 +111,129 @@ gbf_tree_data_get_uri (GbfTreeData *data)
 	return NULL;
 }
 
+gboolean
+gbf_tree_data_equal (GbfTreeData *data_a, GbfTreeData *data_b)
+{
+	gboolean equal;
+
+	equal = data_a == data_b;
+	if ((data_a != NULL) && (data_b != NULL))
+	{
+		equal = data_a->type == data_b->type;
+		if (equal)
+		{
+			if ((data_a->group != NULL) && (data_b->group != NULL))
+			{
+				equal = g_file_equal (data_a->group, data_b->group);
+			}
+
+			if (equal)
+			{
+				if ((data_a->target != NULL) && (data_b->target != NULL))
+				{
+					equal = strcmp (data_a->target, data_b->target) == 0;
+				}
+
+				if (equal)
+				{
+					if ((data_a->source != NULL) && (data_b->source != NULL))
+					{
+						equal = g_file_equal (data_a->source, data_b->source);
+					}
+				}
+			}
+		}
+		else
+		{
+			if (data_b->type == GBF_TREE_NODE_UNKNOWN)
+			{
+				GbfTreeNodeType type = data_a->type;
+
+				data_a->type = data_b->type;
+				data_b->type = type;
+			}
+
+			equal = data_a->type == GBF_TREE_NODE_UNKNOWN;
+			if (equal)
+			{
+				if (data_b->source != NULL) 
+				{
+					equal = g_file_equal (data_a->group, data_b->source);
+				}
+				else if (data_b->target != NULL)
+				{
+					gchar *name;
+
+					name = g_file_get_basename (data_a->group);
+					equal = strcmp (name, data_b->target) == 0;
+					g_free (name);
+				}
+				else if (data_b->group != NULL)
+				{
+					equal = g_file_equal (data_a->group, data_b->group);
+				}
+			}
+		}
+	}
+
+	return equal;
+}
+
+GbfTreeData *
+gbf_tree_data_new_for_uri (const gchar *uri, GbfTreeNodeType type)
+{
+	GbfTreeData *data = g_slice_new0 (GbfTreeData);
+	GFileInfo *ginfo;
+	GFile *file;
+
+	data->type = type;
+
+	file = g_file_new_for_uri (uri);
+	
+	switch (type)
+	{
+	case GBF_TREE_NODE_UNKNOWN:
+	case GBF_TREE_NODE_SHORTCUT:
+	case GBF_TREE_NODE_GROUP:
+		data->group = file;
+		break;
+	case GBF_TREE_NODE_TARGET:
+		data->group = g_file_get_parent (file);
+		data->target = g_file_get_basename (file);
+		g_object_unref (file);
+		file = NULL;
+		data->name = g_strdup (data->target);
+		break;
+	case GBF_TREE_NODE_SOURCE:
+		data->source = file;
+		break;
+	case GBF_TREE_NODE_STRING:
+		data->name = g_file_get_parse_name (file);
+		g_object_unref (file);
+		file = NULL;
+		break;
+	}
+
+	if (file != NULL)
+	{
+		ginfo = g_file_query_info (file,
+		    G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
+    		G_FILE_QUERY_INFO_NONE,
+    		NULL, NULL);
+		if (ginfo)
+		{
+			data->name = g_strdup (g_file_info_get_display_name (ginfo));
+       		g_object_unref(ginfo);
+		}
+		else
+		{
+			data->name = g_file_get_basename (data->group);
+		}
+	}
+
+	return data;
+}
+	
 GbfTreeData *
 gbf_tree_data_new_string (const gchar *string)
 {
diff --git a/plugins/project-manager/gbf-tree-data.h b/plugins/project-manager/gbf-tree-data.h
index 07d9b2c..b9a7d87 100644
--- a/plugins/project-manager/gbf-tree-data.h
+++ b/plugins/project-manager/gbf-tree-data.h
@@ -32,6 +32,7 @@ G_BEGIN_DECLS
 typedef struct _GbfTreeData GbfTreeData;
 
 typedef enum {
+	GBF_TREE_NODE_UNKNOWN,
 	GBF_TREE_NODE_STRING,
 	GBF_TREE_NODE_GROUP,
 	GBF_TREE_NODE_TARGET,
@@ -51,17 +52,22 @@ struct _GbfTreeData
 	GtkWidget		*properties_dialog;
 };
 
-AnjutaProjectNode *gbf_tree_data_get_node	 (GbfTreeData		 *data,
-                                              IAnjutaProject     *project);
+AnjutaProjectNode *gbf_tree_data_get_node	    (GbfTreeData		 *data,
+                                                 IAnjutaProject     *project);
 
-gchar	      *gbf_tree_data_get_uri		 (GbfTreeData            *data);
+gchar	      *gbf_tree_data_get_uri		    (GbfTreeData          *data);
 
-GbfTreeData   *gbf_tree_data_new_string      (const gchar          *string);
-GbfTreeData   *gbf_tree_data_new_shortcut    (GbfTreeData		   *src);
-GbfTreeData   *gbf_tree_data_new_group       (AnjutaProjectGroup   *group);
-GbfTreeData   *gbf_tree_data_new_target      (AnjutaProjectTarget  *target);
-GbfTreeData   *gbf_tree_data_new_source      (AnjutaProjectSource  *source);
-void           gbf_tree_data_free            (GbfTreeData          *data);
+gboolean       gbf_tree_data_equal              (GbfTreeData          *data_a,
+                                                 GbfTreeData          *data_b);
+
+GbfTreeData   *gbf_tree_data_new_for_uri        (const gchar          *uri,
+                                                 GbfTreeNodeType      type);
+GbfTreeData   *gbf_tree_data_new_string         (const gchar          *string);
+GbfTreeData   *gbf_tree_data_new_shortcut       (GbfTreeData		  *src);
+GbfTreeData   *gbf_tree_data_new_group          (AnjutaProjectGroup   *group);
+GbfTreeData   *gbf_tree_data_new_target         (AnjutaProjectTarget  *target);
+GbfTreeData   *gbf_tree_data_new_source         (AnjutaProjectSource  *source);
+void           gbf_tree_data_free               (GbfTreeData          *data);
 
 
 G_END_DECLS
diff --git a/plugins/project-manager/plugin.c b/plugins/project-manager/plugin.c
index 99c1ee1..9575679 100644
--- a/plugins/project-manager/plugin.c
+++ b/plugins/project-manager/plugin.c
@@ -155,7 +155,7 @@ static void
 on_session_save (AnjutaShell *shell, AnjutaSessionPhase phase,
 				 AnjutaSession *session, ProjectManagerPlugin *plugin)
 {
-	GList *files;
+	GList *list;
 
 	if (phase != ANJUTA_SESSION_PHASE_NORMAL)
 		return;
@@ -167,15 +167,16 @@ on_session_save (AnjutaShell *shell, AnjutaSessionPhase phase,
 	 */
 	if (plugin->project_uri && !plugin->session_by_me)
 	{
-		files = anjuta_session_get_string_list (session,
+		list = anjuta_session_get_string_list (session,
 												"File Loader",
 												"Files");
-		files = g_list_append (files, g_strdup (plugin->project_uri));
+		list = g_list_append (list, g_strdup (plugin->project_uri));
 		anjuta_session_set_string_list (session, "File Loader",
-										"Files", files);
-		g_list_foreach (files, (GFunc)g_free, NULL);
-		g_list_free (files);
+										"Files", list);
+		g_list_foreach (list, (GFunc)g_free, NULL);
+		g_list_free (list);
 	}
+
 }
 
 static void
@@ -570,7 +571,7 @@ on_popup_properties (GtkAction *action, ProjectManagerPlugin *plugin)
 {
 	GbfTreeData *data;
 
-	data = gbf_project_view_get_selected (GBF_PROJECT_VIEW (plugin->view));
+	data = gbf_project_view_get_selected (GBF_PROJECT_VIEW (plugin->view), NULL);
 	if (data)
 	{
 		project_manager_show_node_properties_dialog (plugin, data);
@@ -580,30 +581,30 @@ on_popup_properties (GtkAction *action, ProjectManagerPlugin *plugin)
 static void
 on_popup_add_group (GtkAction *action, ProjectManagerPlugin *plugin)
 {
-	GbfTreeData *selected_group;
+	GtkTreeIter selected_group;
 	AnjutaProjectGroup *new_group;
 	
 	update_operation_begin (plugin);
-	selected_group = gbf_project_view_get_selected (GBF_PROJECT_VIEW (plugin->view));
+	gbf_project_view_get_selected (GBF_PROJECT_VIEW (plugin->view), &selected_group);
 	
 	new_group = gbf_project_util_new_group (plugin->model,
 										   get_plugin_parent_window (plugin),
-										   selected_group, NULL);
+										   &selected_group, NULL);
 	update_operation_end (plugin, TRUE);
 }
 
 static void
 on_popup_add_target (GtkAction *action, ProjectManagerPlugin *plugin)
 {
-	GbfTreeData *selected_group;
+	GtkTreeIter selected_group;
 	AnjutaProjectTarget *new_target;
 
 	update_operation_begin (plugin);
-	selected_group = gbf_project_view_get_selected (GBF_PROJECT_VIEW (plugin->view));
+	gbf_project_view_get_selected (GBF_PROJECT_VIEW (plugin->view), &selected_group);
 
 	new_target = gbf_project_util_new_target (plugin->model,
 											 get_plugin_parent_window (plugin),
-											 selected_group, NULL);
+											 &selected_group, NULL);
 	
 	update_operation_end (plugin, TRUE);
 }
@@ -611,15 +612,15 @@ on_popup_add_target (GtkAction *action, ProjectManagerPlugin *plugin)
 static void
 on_popup_add_source (GtkAction *action, ProjectManagerPlugin *plugin)
 {
-	GbfTreeData *selected_target;
+	GtkTreeIter selected_target;
 	AnjutaProjectSource *new_source;
 	
 	update_operation_begin (plugin);
-	selected_target = gbf_project_view_get_selected (GBF_PROJECT_VIEW (plugin->view));
+	gbf_project_view_get_selected (GBF_PROJECT_VIEW (plugin->view), &selected_target);
 
 	new_source = gbf_project_util_add_source (plugin->model,
 											 get_plugin_parent_window (plugin),
-											 selected_target, NULL);
+											 &selected_target, NULL);
 
 	update_operation_end (plugin, TRUE);
 }
@@ -1038,6 +1039,9 @@ on_treeview_event  (GtkWidget *widget,
 	return FALSE;
 }
 
+/* 
+ *---------------------------------------------------------------------------*/
+
 static void
 register_stock_icons (AnjutaPlugin *plugin)
 {
@@ -1185,7 +1189,6 @@ project_manager_load_gbf (ProjectManagerPlugin *pm_plugin)
 			backend_desc = (AnjutaPluginDescription *)desc->data;
 			anjuta_plugin_description_get_string (backend_desc, "Anjuta Plugin", "Location", &location);
 			plugin = (IAnjutaProjectBackend *)anjuta_plugin_manager_get_plugin_by_id (plugin_manager, location);
-			g_message ("search plugin %s", location);
 			g_free (location);
 
 			backend_val = ianjuta_project_backend_probe (plugin, dirfile, NULL);
@@ -1851,29 +1854,46 @@ get_node_from_file (AnjutaProjectNode *parent, GFile *file)
 	return NULL;		
 }
 
-static GbfTreeData*
-get_tree_data_from_uri (ProjectManagerPlugin *plugin, const gchar *uri, GbfTreeNodeType type)
+static AnjutaProjectNode*
+get_project_node_from_uri (ProjectManagerPlugin *plugin, const gchar *uri, AnjutaProjectNodeType type)
 {
-	return gbf_project_model_find_uri (plugin->model, uri, type);
+	GbfTreeData *data;
+	AnjutaProjectNode *node;
+
+	switch (type)
+	{
+	case ANJUTA_PROJECT_GROUP:
+		data = gbf_tree_data_new_for_uri (uri, GBF_TREE_NODE_GROUP);
+		break;
+	case ANJUTA_PROJECT_TARGET:
+		data = gbf_tree_data_new_for_uri (uri, GBF_TREE_NODE_TARGET);
+		break;
+	case ANJUTA_PROJECT_SOURCE:
+		data = gbf_tree_data_new_for_uri (uri, GBF_TREE_NODE_SOURCE);
+		break;
+	case ANJUTA_PROJECT_UNKNOWN:
+	default:
+		data = gbf_tree_data_new_for_uri (uri, GBF_TREE_NODE_UNKNOWN);
+		break;
+	}
+
+	node = gbf_tree_data_get_node (data, plugin->project);
+	gbf_tree_data_free (data);
+
+	return node;
 }
 
-static AnjutaProjectTarget*
-get_target_from_uri (ProjectManagerPlugin *plugin, const gchar *uri)
+static GtkTreeIter*
+get_tree_iter_from_uri (ProjectManagerPlugin *plugin, GtkTreeIter* iter, const gchar *uri, GbfTreeNodeType type)
 {
 	GbfTreeData *data;
-	AnjutaProjectNode *node = NULL;
+	gboolean found;
 
-	data = get_tree_data_from_uri (plugin, uri, GBF_TREE_NODE_TARGET);
-	if (data) node = gbf_tree_data_get_node (data, plugin->project);
+	data = gbf_tree_data_new_for_uri (uri, type);
+	found = gbf_project_model_find_tree_data (plugin->model, iter, data);
+	gbf_tree_data_free (data);
 
-	if (anjuta_project_node_get_type (node) == ANJUTA_PROJECT_TARGET)
-	{
-		return (AnjutaProjectTarget *)node;
-	}
-	else
-	{
-		return NULL;
-	}
+	return found ? iter : NULL;
 }
 
 static AnjutaProjectNodeType
@@ -1881,7 +1901,6 @@ iproject_manager_get_element_type (IAnjutaProjectManager *project_manager,
 								   const gchar *element_uri,
 								   GError **err)
 {
-	GbfTreeData *data;
 	AnjutaProjectNode *node = NULL;
 	ProjectManagerPlugin *plugin;
 
@@ -1890,8 +1909,7 @@ iproject_manager_get_element_type (IAnjutaProjectManager *project_manager,
 	
 	plugin = ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager));
 
-	data = get_tree_data_from_uri (plugin, element_uri, 0);
-	if (data) node = gbf_tree_data_get_node (data, plugin->project);
+	node = get_project_node_from_uri (plugin, element_uri, ANJUTA_PROJECT_UNKNOWN);
 
 	return node == NULL ? ANJUTA_PROJECT_UNKNOWN : anjuta_project_node_get_type (node);
 }
@@ -1929,7 +1947,7 @@ iproject_manager_get_target_type (IAnjutaProjectManager *project_manager,
 	g_return_val_if_fail (uri_is_inside_project (plugin, target_uri),
 						  ANJUTA_TARGET_UNKNOWN);
 	
-	target = get_target_from_uri (plugin, target_uri);
+	target = get_project_node_from_uri (plugin, target_uri, ANJUTA_PROJECT_TARGET);
 
 	if (target != NULL)
 	{
@@ -2111,7 +2129,7 @@ iproject_manager_get_selected_id (IAnjutaProjectManager *project_manager,
 			return uri;
 		}
 	}
-
+	
 	if (node)
 	{
 		uri = get_element_uri_from_id (plugin, node, IANJUTA_PROJECT_MANAGER_PROJECT_ROOT_URI);
@@ -2136,11 +2154,12 @@ iproject_manager_get_capabilities (IAnjutaProjectManager *project_manager,
 static gchar*
 iproject_manager_add_source (IAnjutaProjectManager *project_manager,
 							 const gchar *source_uri_to_add,
-							 const gchar *default_location_uri,
+							 const gchar *default_target_uri,
 							 GError **err)
 {
 	ProjectManagerPlugin *plugin;
-	GbfTreeData *location_data = NULL;
+	GtkTreeIter target_iter;
+	GtkTreeIter *iter = NULL;
 	AnjutaProjectSource *source_id;
 	gchar* source_uri;
 	
@@ -2150,14 +2169,13 @@ iproject_manager_add_source (IAnjutaProjectManager *project_manager,
 	g_return_val_if_fail (IANJUTA_IS_PROJECT (plugin->project), FALSE);
 
 	update_operation_begin (plugin);
-	if (default_location_uri != NULL)
+	if (default_target_uri != NULL)
 	{
-		location_data = get_tree_data_from_uri (plugin, default_location_uri, GBF_TREE_NODE_TARGET);
-		if (location_data == NULL) get_tree_data_from_uri (plugin, default_location_uri, GBF_TREE_NODE_GROUP);
+		iter = get_tree_iter_from_uri (plugin, &target_iter, default_target_uri, GBF_TREE_NODE_TARGET);
 	}
 	source_id = gbf_project_util_add_source (plugin->model,
-										get_plugin_parent_window (plugin),
-											 location_data,
+										     get_plugin_parent_window (plugin),
+											 iter,
 											 source_uri_to_add);
 	update_operation_end (plugin, TRUE);
 	
@@ -2175,7 +2193,6 @@ iproject_manager_add_source_quiet (IAnjutaProjectManager *project_manager,
 	ProjectManagerPlugin *plugin;
 	AnjutaProjectSource *source_id;
 	GFile *source_file;
-	GbfTreeData *data;
 	AnjutaProjectTarget *target = NULL;
 	
 	g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager), FALSE);
@@ -2183,9 +2200,7 @@ iproject_manager_add_source_quiet (IAnjutaProjectManager *project_manager,
 	plugin = ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager));
 	g_return_val_if_fail (IANJUTA_IS_PROJECT (plugin->project), FALSE);
 
-	data = get_tree_data_from_uri (plugin, location_uri, GBF_TREE_NODE_TARGET);
-	if (data == NULL) get_tree_data_from_uri (plugin, location_uri, GBF_TREE_NODE_GROUP);
-	if (data != NULL) target = gbf_tree_data_get_node (data, plugin->project);
+	target = get_project_node_from_uri (plugin, location_uri, ANJUTA_PROJECT_TARGET);
 	source_file = g_file_new_for_uri (source_uri_to_add);
 	update_operation_begin (plugin);
 	source_id = ianjuta_project_add_source (plugin->project,
@@ -2201,11 +2216,12 @@ iproject_manager_add_source_quiet (IAnjutaProjectManager *project_manager,
 static GList*
 iproject_manager_add_source_multi (IAnjutaProjectManager *project_manager,
 							 GList *source_add_uris,
-							 const gchar *default_location_uri,
+							 const gchar *default_target_uri,
 							 GError **err)
 {
 	ProjectManagerPlugin *plugin;
-	GbfTreeData *location_data = NULL;
+	GtkTreeIter target_iter;
+	GtkTreeIter *iter = NULL;
 	GList* source_ids;
 	GList* source_uris = NULL;
 	
@@ -2215,15 +2231,14 @@ iproject_manager_add_source_multi (IAnjutaProjectManager *project_manager,
 	g_return_val_if_fail (IANJUTA_IS_PROJECT (plugin->project), FALSE);
 
 	update_operation_begin (plugin);
-	if (default_location_uri != NULL)
+	if (default_target_uri != NULL)
 	{
-		location_data = get_tree_data_from_uri (plugin, default_location_uri, GBF_TREE_NODE_TARGET);
-		if (location_data == NULL) get_tree_data_from_uri (plugin, default_location_uri, GBF_TREE_NODE_GROUP);
+		iter = get_tree_iter_from_uri (plugin, &target_iter, default_target_uri, GBF_TREE_NODE_TARGET);
 	}
 
 	source_ids = gbf_project_util_add_source_multi (plugin->model,
 										 get_plugin_parent_window (plugin),
-										 location_data,
+										 iter,
 										 source_add_uris);
 	update_operation_end (plugin, TRUE);
 	
@@ -2246,9 +2261,10 @@ iproject_manager_add_target (IAnjutaProjectManager *project_manager,
 							 GError **err)
 {
 	ProjectManagerPlugin *plugin;
+	GtkTreeIter group_iter;
+	GtkTreeIter *iter = NULL;
 	gchar *target_uri = NULL;
 	AnjutaProjectTarget *target_id;
-	GbfTreeData *default_group_data;
 	
 	g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager), FALSE);
 	
@@ -2256,12 +2272,15 @@ iproject_manager_add_target (IAnjutaProjectManager *project_manager,
 	
 	g_return_val_if_fail (IANJUTA_IS_PROJECT (plugin->project), FALSE);
 
-	default_group_data = get_tree_data_from_uri (plugin, default_group_uri, GBF_TREE_NODE_GROUP);
+	if (default_group_uri != NULL)
+	{
+		iter = get_tree_iter_from_uri (plugin, &group_iter, default_group_uri, GBF_TREE_NODE_GROUP);
+	}
 	
 	update_operation_begin (plugin);
 	target_id = gbf_project_util_new_target (plugin->model,
 											 get_plugin_parent_window (plugin),
-											 default_group_data,
+											 iter,
 											 target_name_to_add);
 	update_operation_end (plugin, TRUE);
 	target_uri = get_element_uri_from_id (plugin, target_id, IANJUTA_BUILDER_ROOT_URI);
@@ -2276,21 +2295,25 @@ iproject_manager_add_group (IAnjutaProjectManager *project_manager,
 							GError **err)
 {
 	ProjectManagerPlugin *plugin;
+	GtkTreeIter group_iter;
+	GtkTreeIter *iter = NULL;
 	gchar *group_uri = NULL;
 	AnjutaProjectGroup *group_id;
-	GbfTreeData *default_group_data;
 	
 	g_return_val_if_fail (ANJUTA_IS_PLUGIN (project_manager), FALSE);
 	
 	plugin = ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager));
 	g_return_val_if_fail (IANJUTA_IS_PROJECT (plugin->project), FALSE);
 
-	default_group_data = get_tree_data_from_uri (plugin, default_group_uri, GBF_TREE_NODE_GROUP);
+	if (default_group_uri != NULL)
+	{
+		iter = get_tree_iter_from_uri (plugin, &group_iter, default_group_uri, GBF_TREE_NODE_GROUP);
+	}
 	
 	update_operation_begin (plugin);
 	group_id = gbf_project_util_new_group (plugin->model,
 										   get_plugin_parent_window (plugin),
-										   default_group_data,
+										   iter,
 										   group_name_to_add);
 	update_operation_end (plugin, TRUE);
 	group_uri = get_element_uri_from_id (plugin, group_id, IANJUTA_PROJECT_MANAGER_PROJECT_ROOT_URI);



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