[anjuta/newproject] pm: Fix adding and removing packages



commit b2539378465ac7f06d1df5a2a40351982be63a66
Author: Sébastien Granjoux <seb sfo free fr>
Date:   Sun Nov 14 17:56:18 2010 +0100

    pm: Fix adding and removing packages

 plugins/am-project/am-node.c      |    5 +-
 plugins/am-project/am-project.c   |    2 +-
 plugins/project-manager/dialogs.c |  159 +++++++++++++++++++++----------------
 plugins/project-manager/plugin.c  |   16 ++++-
 plugins/project-manager/project.c |   32 +++++++-
 plugins/project-manager/project.h |    1 +
 6 files changed, 137 insertions(+), 78 deletions(-)
---
diff --git a/plugins/am-project/am-node.c b/plugins/am-project/am-node.c
index 25307a2..16ff677 100644
--- a/plugins/am-project/am-node.c
+++ b/plugins/am-project/am-node.c
@@ -212,7 +212,7 @@ amp_root_new (GFile *file, GError **error)
 	root->base.file = g_file_dup (file);
 	root->base.name = NULL;
 	root->base.state = ANJUTA_PROJECT_CAN_ADD_GROUP |
-						ANJUTA_PROJECT_CAN_ADD_MODULE,
+						ANJUTA_PROJECT_CAN_ADD_PACKAGE,
 						ANJUTA_PROJECT_CAN_SAVE;
 	
 
@@ -898,8 +898,7 @@ amp_target_new (const gchar *name, AnjutaProjectNodeType type, const gchar *inst
 	node->base.custom_properties = NULL;
 	node->base.name = g_strdup (name);
 	node->base.file = NULL;
-	node->base.state = ANJUTA_PROJECT_CAN_ADD_MODULE |
-						ANJUTA_PROJECT_CAN_ADD_SOURCE |
+	node->base.state = ANJUTA_PROJECT_CAN_ADD_SOURCE |
 						ANJUTA_PROJECT_CAN_REMOVE;
 	node->install = g_strdup (install);
 	node->flags = flags;
diff --git a/plugins/am-project/am-project.c b/plugins/am-project/am-project.c
index 04782d6..debacad 100644
--- a/plugins/am-project/am-project.c
+++ b/plugins/am-project/am-project.c
@@ -2390,7 +2390,7 @@ static gboolean
 amp_remove_complete (PmJob *job)
 {
 	AnjutaProjectNode *parent = anjuta_project_node_parent (job->node);
-	
+
 	g_signal_emit_by_name (AMP_PROJECT (job->user_data), "node-changed", parent != NULL ? parent : job->node,  job->error);
 
 	return TRUE;
diff --git a/plugins/project-manager/dialogs.c b/plugins/project-manager/dialogs.c
index 03099bc..29a7068 100644
--- a/plugins/project-manager/dialogs.c
+++ b/plugins/project-manager/dialogs.c
@@ -1504,10 +1504,11 @@ anjuta_pm_project_new_package (AnjutaPmProject *project,
     gint response;
     gboolean finished = FALSE;
     GtkTreeSelection *package_selection;
-    GtkTreeIter root;
-    gboolean valid;
+    AnjutaProjectNode *root;
+	AnjutaProjectNode *node;
+	AnjutaProjectNode *module = NULL;
     gint default_pos = -1;
-    GbfProjectModel *model;
+	gint pos;
     
     g_return_val_if_fail (project != NULL, NULL);
     
@@ -1520,50 +1521,44 @@ anjuta_pm_project_new_package (AnjutaPmProject *project,
     packages_view = GTK_WIDGET (gtk_builder_get_object (gui, "packages_view"));
     ok_button = GTK_WIDGET (gtk_builder_get_object (gui, "ok_package_button"));
 
+	/* Get default parent */
+	if (default_module != NULL)
+	{
+        GbfTreeData *data;
+	    GbfProjectModel *model;
+
+		model = anjuta_pm_project_get_model(project);
+		gtk_tree_model_get (GTK_TREE_MODEL (model), default_module, GBF_PROJECT_MODEL_COLUMN_DATA, &data, -1);
+		if (data != NULL)
+		{
+			module = gbf_tree_data_get_node (data);
+		}
+	}
+	
     /* Fill combo box with modules */
     store = gtk_list_store_new(1, G_TYPE_STRING);
     gtk_combo_box_entry_set_text_column (GTK_COMBO_BOX_ENTRY (module_entry), 0);
 
-    model = anjuta_pm_project_get_model(project);
-    for (valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &root); valid != FALSE; valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &root))
-    {
-        GbfTreeData *data;
-        
-        gtk_tree_model_get (GTK_TREE_MODEL (model), &root, GBF_PROJECT_MODEL_COLUMN_DATA, &data, -1);
-        if (data && (data->type == GBF_TREE_NODE_GROUP)) break;
-    }
-    
-    if (valid)
-    {
-        GtkTreeIter iter;
-        gint pos = 0;
-        GbfTreeData *data;
-        GtkTreePath *default_path = default_module != NULL ? gtk_tree_model_get_path(GTK_TREE_MODEL (model), default_module) : NULL;
-
-        gtk_tree_model_get (GTK_TREE_MODEL (model), &root, GBF_PROJECT_MODEL_COLUMN_DATA, &data, -1);
-        
-        for (valid = gtk_tree_model_iter_children (GTK_TREE_MODEL (model), &iter, &root); valid != FALSE; valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter))
-        {
-            GbfTreeData *data;
-            
-            gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, GBF_PROJECT_MODEL_COLUMN_DATA, &data, -1);
+	root = ianjuta_project_get_root (project->project, NULL);
+	pos = 0;
+	for (node = anjuta_project_node_first_child (root); node != NULL; node = anjuta_project_node_next_sibling (node))
+	{
+		if (anjuta_project_node_get_node_type (node) == ANJUTA_PROJECT_MODULE)
+		{
+			GtkTreeIter list_iter;
+			gchar *name;
 
-            if (data && (data->type == GBF_TREE_NODE_MODULE))
-            {
-                GtkTreeIter list_iter;
-                GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL (model), &iter);
+			name = anjuta_project_node_get_name (node);
+			gtk_list_store_append (store, &list_iter);
+			gtk_list_store_set (store, &list_iter, 0, name, -1);
+			g_free (name);
 
-                gtk_list_store_append (store, &list_iter);
-                gtk_list_store_set (store, &list_iter, 0, data->name, -1);
-                if ((default_path != NULL) && (gtk_tree_path_compare (path, default_path) == 0))
-                {
-                    default_pos = pos;
-                }
-                gtk_tree_path_free (path);
-                pos++;
-            }
-        }
-        if (default_path != NULL) gtk_tree_path_free (default_path);
+			if (node == module)
+			{
+				default_pos = pos;
+			}
+			pos ++;
+		}
     }
     gtk_combo_box_set_model (GTK_COMBO_BOX(module_entry), GTK_TREE_MODEL(store));
     gtk_combo_box_entry_set_text_column (GTK_COMBO_BOX_ENTRY (module_entry), 0);
@@ -1619,12 +1614,45 @@ anjuta_pm_project_new_package (AnjutaPmProject *project,
         switch (response) {
             case GTK_RESPONSE_OK: 
             {
-                gchar *module;
+                gchar *name;
+				AnjutaProjectNode *module;
+				GString *error_message = g_string_new (NULL);
+
+                name = gtk_combo_box_get_active_text (GTK_COMBO_BOX (module_entry));
+				name = g_strstrip (name);
+
+				if (*name == '\0')
+				{
+					/* Missing module name */
+					g_string_append (error_message, _("Missing module name"));
+				}
+				else
+				{
+					/* Look for already existing module */
+					module = anjuta_pm_project_get_module (project, name);
+					if (module == NULL)
+					{
+						/* Create new module */
+						AnjutaProjectNode *root;
+						GError *error = NULL;
+
+						root = ianjuta_project_get_root (project->project, NULL);
 
-                module = gtk_combo_box_get_active_text (GTK_COMBO_BOX (module_entry));
-                if (module)
+						module = ianjuta_project_add_node_after (project->project, root, NULL, ANJUTA_PROJECT_MODULE, NULL, name, &error);
+						if (error != NULL)
+						{
+                    		gchar *str = g_strdup_printf ("%s: %s\n", name, error->message);
+						
+							g_string_append (error_message, str);
+                        	g_error_free (error);
+                        	g_free (str);
+						}
+					}
+				}
+				g_free (name);
+				
+                if (module != NULL)
                 {
-                    GString *err_mesg = g_string_new (NULL);
                     GList *list;
                     GList *node;
                     GtkTreeModel *model;
@@ -1637,51 +1665,42 @@ anjuta_pm_project_new_package (AnjutaPmProject *project,
                         {
                             gchar *name;
                             AnjutaProjectNode* new_package;
-                            GError *err = NULL;
+                            GError *error = NULL;
                             
                             gtk_tree_model_get (model, &iter, COL_PKG_PACKAGE, &name, -1);
 
-                            /*new_package = ianjuta_project_add_package (project,
-                                                            module,
-                                                            name,
-                                                            &err);*/
-                            new_package = NULL;
-                            if (err)
+							new_package = ianjuta_project_add_node_after (project->project, module, NULL, ANJUTA_PROJECT_PACKAGE, NULL, name, &error);
+                            if (error)
                             {
                                 gchar *str = g_strdup_printf ("%s: %s\n",
                                                                 name,
-                                                                err->message);
-                                g_string_append (err_mesg, str);
-                                g_error_free (err);
+                                                                error->message);
+                                g_string_append (error_message, str);
+                                g_error_free (error);
                                 g_free (str);
                             }
                             else
                             {
-                                packages = g_list_append (packages,
-                                                                new_package);
+                                packages = g_list_append (packages, new_package);
+								finished = TRUE;
                             }
                             g_free (name);
                         }
                     }
                     g_list_foreach (list, (GFunc)gtk_tree_path_free, NULL);
                     g_list_free (list);
-                    
-                    if (err_mesg->str && strlen (err_mesg->str) > 0)
-                    {
-                        error_dialog (parent, _("Cannot add packages"),
-                                        "%s", err_mesg->str);
-                    }
-                    else
-                    {
-                        finished = TRUE;
-                    }
-                    g_string_free (err_mesg, TRUE);
                 }
-                else
+					
+                if (error_message->len != 0)
                 {
                     error_dialog (parent, _("Cannot add packages"),
-                            "%s", _("No module has been selected"));
+                            "%s",error_message->str);
                 }
+				else
+				{
+					finished = TRUE;
+				}
+				g_string_free (error_message, TRUE);
                 break;
             }
             default:
diff --git a/plugins/project-manager/plugin.c b/plugins/project-manager/plugin.c
index 985a430..cf400a8 100644
--- a/plugins/project-manager/plugin.c
+++ b/plugins/project-manager/plugin.c
@@ -651,6 +651,12 @@ confirm_removal (ProjectManagerPlugin *plugin, GList *selected)
 	case GBF_TREE_NODE_SOURCE:
 		mesg = g_string_new (_("Are you sure you want to remove the following source file from the project?\n\n"));
 		break;
+	case GBF_TREE_NODE_PACKAGE:
+		mesg = g_string_new (_("Are you sure you want to remove the following package from the project?\n\n"));
+		break;
+	case GBF_TREE_NODE_MODULE:
+		mesg = g_string_new (_("Are you sure you want to remove the following module from the project?\n\n"));
+		break;
 	case GBF_TREE_NODE_UNKNOWN:
 		mesg = g_string_new (_("Are you sure you want to remove the following elements from the project?\n\n"));
 		break;
@@ -680,6 +686,12 @@ confirm_removal (ProjectManagerPlugin *plugin, GList *selected)
 		case GBF_TREE_NODE_SHORTCUT:
 			g_string_append_printf (mesg, _("Shortcut: %s\n"), data->name);
 			return TRUE;
+		case GBF_TREE_NODE_MODULE:
+			g_string_append_printf (mesg, _("Module: %s\n"), data->name);
+			break;
+		case GBF_TREE_NODE_PACKAGE:
+			g_string_append_printf (mesg, _("Package: %s\n"), data->name);
+			break;
 		default:
 			g_warn_if_reached ();
 			return FALSE;
@@ -732,7 +744,9 @@ on_popup_remove (GtkAction *action, ProjectManagerPlugin *plugin)
 				case GBF_TREE_NODE_GROUP:
 				case GBF_TREE_NODE_TARGET:
 				case GBF_TREE_NODE_SOURCE:
-					node = anjuta_pm_project_get_node(plugin->project, data);
+				case GBF_TREE_NODE_MODULE:
+				case GBF_TREE_NODE_PACKAGE:
+					node = gbf_tree_data_get_node (data);
 					if (node != NULL)
 					{
 						if (!update) update_operation_begin (plugin);
diff --git a/plugins/project-manager/project.c b/plugins/project-manager/project.c
index ca9d748..46a1ece 100644
--- a/plugins/project-manager/project.c
+++ b/plugins/project-manager/project.c
@@ -279,9 +279,6 @@ anjuta_pm_project_get_capabilities (AnjutaPmProject *project)
 			case ANJUTA_PROJECT_SOURCE:
 				caps |= ANJUTA_PROJECT_CAN_ADD_SOURCE;
 				break;
-			case ANJUTA_PROJECT_MODULE:
-				caps |= ANJUTA_PROJECT_CAN_ADD_MODULE;
-				break;
 			case ANJUTA_PROJECT_PACKAGE:
 				caps |= ANJUTA_PROJECT_CAN_ADD_PACKAGE;
 				break;
@@ -485,6 +482,35 @@ anjuta_pm_project_get_node_from_file (AnjutaPmProject *project, AnjutaProjectNod
 	return NULL;
 }
 
+static gboolean
+find_module (AnjutaProjectNode *node, gpointer data)
+{
+	gboolean found = FALSE;
+	
+	if (anjuta_project_node_get_node_type (node) == ANJUTA_PROJECT_MODULE)
+	{
+		gchar *name = anjuta_project_node_get_name (node);
+
+		found = g_strcmp0 (name, (const gchar *)data) == 0;
+		g_free (name);
+	}
+
+	return found;
+}
+
+AnjutaProjectNode *
+anjuta_pm_project_get_module (AnjutaPmProject *project, const gchar *name)
+{
+	AnjutaProjectNode *root;
+	AnjutaProjectNode *module;
+
+	root = ianjuta_project_get_root (project->project, NULL);
+
+	module = anjuta_project_node_children_traverse (root, find_module, (gpointer)name);
+
+	return module;
+}
+
 /* Display properties dialog. These dialogs are not modal, so a pointer on each
  * dialog is kept with in node data to be able to destroy them if the node is
  * removed. It is useful to put the dialog at the top if the same target is
diff --git a/plugins/project-manager/project.h b/plugins/project-manager/project.h
index fb86e62..7f9d921 100644
--- a/plugins/project-manager/project.h
+++ b/plugins/project-manager/project.h
@@ -101,6 +101,7 @@ GbfProjectModel *anjuta_pm_project_get_model (AnjutaPmProject *project);
 
 AnjutaProjectNode *anjuta_pm_project_get_node (AnjutaPmProject *project, GbfTreeData *data);
 AnjutaProjectNode *anjuta_pm_project_get_node_from_file (AnjutaPmProject *project, AnjutaProjectNodeType type, GFile *file);
+AnjutaProjectNode *anjuta_pm_project_get_module (AnjutaPmProject *project, const gchar *name);
 
 gboolean anjuta_pm_project_show_properties_dialog (AnjutaPmProject *project, GbfTreeData *data);
 



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