[anjuta] dir-project: Allow to add and remove source files



commit de44e65383b35042aeadbb63f36bbe15df3373aa
Author: SÃbastien Granjoux <seb sfo free fr>
Date:   Tue Mar 6 21:47:15 2012 +0100

    dir-project: Allow to add and remove source files

 libanjuta/interfaces/libanjuta.idl        |    1 +
 plugins/dir-project/dir-project.c         |   37 ++++++++++++++++++++++++----
 plugins/project-manager/plugin.c          |   27 +++++++++++++--------
 plugins/project-manager/project-chooser.c |    5 +--
 4 files changed, 51 insertions(+), 19 deletions(-)
---
diff --git a/libanjuta/interfaces/libanjuta.idl b/libanjuta/interfaces/libanjuta.idl
index 9408cdc..7ea18a9 100644
--- a/libanjuta/interfaces/libanjuta.idl
+++ b/libanjuta/interfaces/libanjuta.idl
@@ -3177,6 +3177,7 @@ interface IAnjutaProject
 		ERROR_ALREADY_EXISTS,
 		ERROR_VALIDATION_FAILED,
 		ERROR_PROJECT_MALFORMED,
+		ERROR_WRONG_PARENT,
 		ERROR_NOT_SUPPORTED,
 		ERROR_GENERAL_FAILURE
 	}
diff --git a/plugins/dir-project/dir-project.c b/plugins/dir-project/dir-project.c
index 5587f95..6d0f165 100644
--- a/plugins/dir-project/dir-project.c
+++ b/plugins/dir-project/dir-project.c
@@ -564,23 +564,23 @@ dir_project_load_directory_callback (GObject      *source_object,
 			g_signal_emit_by_name (data->proj, "node-loaded", data->parent, err);
 			g_error_free (err);
 		} else {
-			AnjutaProjectNode *node, *remove;
+			AnjutaProjectNode *node, *next;
 			for (node = anjuta_project_node_first_child (data->parent);
 			     node != NULL;
-			     node = anjuta_project_node_next_sibling (node))
+			     node = next)
 			{
 				int state = anjuta_project_node_get_state (node);
+
+			    next = anjuta_project_node_next_sibling (node);
 				if (state & ANJUTA_PROJECT_LOADING)
 				{
 					/* these nodes are no longer necessary */
 					gchar *uri = g_file_get_uri (node->file);
-					remove = node;
-					node = anjuta_project_node_prev_sibling (node);
 					g_hash_table_remove (data->proj->groups, uri);
 					g_free (uri);
 
-					anjuta_project_node_remove (remove);
-					removed = g_list_prepend (removed, remove);
+					anjuta_project_node_remove (node);
+					removed = g_list_prepend (removed, node);
 				}
 			}
 			g_signal_emit_by_name (data->proj, "node-loaded", data->parent, NULL);
@@ -770,9 +770,11 @@ foreach_node_save (AnjutaProjectNode *node,
 					gpointer  data)
 {
 	gint state = anjuta_project_node_get_state (node);
+	AnjutaProjectNode *parent;
 	GError *err = NULL;
 	gboolean ret;
 
+
 	if (state & ANJUTA_PROJECT_MODIFIED)
 	{
 		switch (anjuta_project_node_get_node_type (node))
@@ -780,6 +782,27 @@ foreach_node_save (AnjutaProjectNode *node,
 		case ANJUTA_PROJECT_GROUP:
 			g_file_make_directory_with_parents (anjuta_project_node_get_file (node), NULL, NULL);
 			break;
+		case ANJUTA_PROJECT_SOURCE:
+			for (parent = node;
+			     (parent != NULL) && (anjuta_project_node_get_node_type (parent) != ANJUTA_PROJECT_GROUP) && (anjuta_project_node_get_node_type (parent) != ANJUTA_PROJECT_ROOT);
+			     parent = anjuta_project_node_parent (parent));
+			if (parent != NULL)
+			{
+				GFile *file = anjuta_project_node_get_file (node);
+				gchar *basename = g_file_get_basename (file);
+				GFile *dest = g_file_get_child (anjuta_project_node_get_file (parent), basename);
+
+				g_free (basename);
+				if (!g_file_equal (dest, file))
+				{
+					g_file_copy_async (file, dest, G_FILE_COPY_BACKUP, G_PRIORITY_DEFAULT, NULL, NULL, NULL, NULL, NULL);
+					node->file = dest;
+					dest = file;
+				}
+
+				g_object_unref (dest);
+			}
+			break;
 		default:
 			break;
 		}
@@ -801,6 +824,8 @@ foreach_node_save (AnjutaProjectNode *node,
 			break;
 		}
 	}
+
+	anjuta_project_node_clear_state (node, ANJUTA_PROJECT_REMOVED | ANJUTA_PROJECT_MODIFIED);
 }
 
 AnjutaProjectNode *
diff --git a/plugins/project-manager/plugin.c b/plugins/project-manager/plugin.c
index 430a432..d36c87d 100644
--- a/plugins/project-manager/plugin.c
+++ b/plugins/project-manager/plugin.c
@@ -2150,16 +2150,23 @@ iproject_manager_add_source_quiet (IAnjutaProjectManager *project_manager,
 
 	plugin = ANJUTA_PLUGIN_PROJECT_MANAGER (G_OBJECT (project_manager));
 
-	target = gbf_project_view_get_node_from_file (plugin->view, ANJUTA_PROJECT_TARGET,  location_file);
-	update_operation_begin (plugin);
-	source_id = anjuta_pm_project_add_source (plugin->project,
-	    								target,
-										NULL,
-	    								source_uri_to_add,
-										err);
-	update_operation_end (plugin, TRUE);
-
-	return get_element_file_from_node (plugin, source_id, IANJUTA_PROJECT_MANAGER_PROJECT_ROOT_URI);
+	target = gbf_project_view_get_node_from_file (plugin->view, ANJUTA_PROJECT_UNKNOWN, location_file);
+	if (target != NULL)
+	{
+		update_operation_begin (plugin);
+		source_id = anjuta_pm_project_add_source (plugin->project,
+		                                          target,
+		                                          NULL,
+		                                          source_uri_to_add,
+		                                          err);
+		update_operation_end (plugin, TRUE);
+
+		return get_element_file_from_node (plugin, source_id, IANJUTA_PROJECT_MANAGER_PROJECT_ROOT_URI);
+	}
+	else
+	{
+		return NULL;
+	}
 }
 
 static GList*
diff --git a/plugins/project-manager/project-chooser.c b/plugins/project-manager/project-chooser.c
index 3cd381e..27ae7e7 100644
--- a/plugins/project-manager/project-chooser.c
+++ b/plugins/project-manager/project-chooser.c
@@ -207,7 +207,7 @@ is_project_target_or_group_node (GtkTreeModel *model, GtkTreeIter *iter, gpointe
 		{
 			AnjutaProjectNodeType type = anjuta_project_node_get_node_type (node) & ANJUTA_PROJECT_TYPE_MASK;
 
-			return (type == ANJUTA_PROJECT_TARGET) || (type == ANJUTA_PROJECT_GROUP);
+			return (type == ANJUTA_PROJECT_TARGET) || (type == ANJUTA_PROJECT_GROUP) || (type == ANJUTA_PROJECT_ROOT);
 		}
 	}
 
@@ -230,7 +230,7 @@ is_project_group_node (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_dat
 		{
 			AnjutaProjectNodeType type = anjuta_project_node_get_node_type (node) & ANJUTA_PROJECT_TYPE_MASK;
 
-			return type == ANJUTA_PROJECT_GROUP;
+			return (type == ANJUTA_PROJECT_GROUP) || (type == ANJUTA_PROJECT_ROOT);
 		}
 	}
 
@@ -432,7 +432,6 @@ anjuta_pm_chooser_button_class_init (AnjutaPmChooserButtonClass * klass)
 	object_class = (GObjectClass *)klass;
 	object_class->constructor = anjuta_pm_chooser_button_constructor;
 
-	g_message ("anjuta_pm_chooser_button_class_init");
 	g_type_class_add_private (klass, sizeof (AnjutaPmChooserButtonPrivate));
 }
 



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