[anjuta/newproject: 184/189] Hide and/or disable unused menu item



commit 2c729c219070d1fcc24c8bebf36f58346e67e4ed
Author: Sébastien Granjoux <seb sfo free fr>
Date:   Fri Apr 23 22:08:40 2010 +0200

    Hide and/or disable unused menu item

 libanjuta/anjuta-project.h             |    9 +-
 plugins/am-project/am-project.c        |   32 ++++-
 plugins/project-manager/plugin.c       |  245 ++++++++++++++-----------------
 plugins/project-manager/project-view.c |    2 +-
 4 files changed, 150 insertions(+), 138 deletions(-)
---
diff --git a/libanjuta/anjuta-project.h b/libanjuta/anjuta-project.h
index 3f2294b..df06b16 100644
--- a/libanjuta/anjuta-project.h
+++ b/libanjuta/anjuta-project.h
@@ -69,7 +69,14 @@ typedef enum
 	ANJUTA_PROJECT_OK = 0,
 	ANJUTA_PROJECT_MODIFIED = 1 << 0,		/* Node has been modified */
 	ANJUTA_PROJECT_INCOMPLETE = 1 << 1,	/* Node is not fully loaded */
-	ANJUTA_PROJECT_LOADING = 1 << 2	    	/* Node is send to the worker thread */
+	ANJUTA_PROJECT_LOADING = 1 << 2,	/* Node is send to the worker thread */
+	ANJUTA_PROJECT_CAN_ADD_GROUP = 1 << 8,
+	ANJUTA_PROJECT_CAN_ADD_TARGET = 1 << 9,
+	ANJUTA_PROJECT_CAN_ADD_SOURCE = 1 << 10,
+	ANJUTA_PROJECT_CAN_ADD_MODULE = 1 << 11,
+	ANJUTA_PROJECT_CAN_ADD_PACKAGE = 1 << 12,
+	ANJUTA_PROJECT_CAN_REMOVE = 1 << 16,
+	ANJUTA_PROJECT_CAN_SAVE = 1 << 17
 } AnjutaProjectNodeState;
 
 typedef enum
diff --git a/plugins/am-project/am-project.c b/plugins/am-project/am-project.c
index 407bab8..75200a3 100644
--- a/plugins/am-project/am-project.c
+++ b/plugins/am-project/am-project.c
@@ -267,8 +267,22 @@ static AmpNodeInfo AmpNodeInformations[] = {
 	AM_TOKEN__SCRIPTS,
 	"_SCRIPTS",
 	"bin"},
-	
-	{{ANJUTA_PROJECT_TARGET | ANJUTA_PROJECT_UNKNOWN,
+
+	{{ANJUTA_PROJECT_MODULE,
+	N_("Module"),
+	""},
+	ANJUTA_TOKEN_NONE,
+	NULL,
+	NULL},
+
+	{{ANJUTA_PROJECT_PACKAGE,
+	N_("Package"),
+	""},
+	ANJUTA_TOKEN_NONE,
+	NULL,
+	NULL},
+
+	{{ANJUTA_PROJECT_UNKNOWN,
 	NULL,
 	NULL},
 	ANJUTA_TOKEN_NONE,
@@ -612,6 +626,8 @@ amp_root_new (GFile *file)
 	root->base.type = ANJUTA_PROJECT_ROOT;
 	root->base.properties = amp_get_project_property_list();
 	root->base.file = g_file_dup (file);
+	root->base.state = ANJUTA_PROJECT_CAN_ADD_GROUP |
+						ANJUTA_PROJECT_CAN_ADD_MODULE;
 
 	return g_node_new (root);
 }
@@ -655,6 +671,7 @@ amp_package_new (const gchar *name)
 	package->base.type = ANJUTA_PROJECT_PACKAGE;
 	package->base.properties = amp_get_package_property_list();
 	package->base.name = g_strdup (name);
+	package->base.state = ANJUTA_PROJECT_CAN_REMOVE;
 
 	return g_node_new (package);
 }
@@ -684,6 +701,8 @@ amp_module_new (AnjutaToken *token)
 	module->base.type = ANJUTA_PROJECT_MODULE;
 	module->base.properties = amp_get_module_property_list();
 	module->base.name = anjuta_token_evaluate (token);
+	module->base.state = ANJUTA_PROJECT_CAN_ADD_PACKAGE |
+						ANJUTA_PROJECT_CAN_REMOVE;
 	module->module = token;
 
 	return g_node_new (module);
@@ -808,6 +827,11 @@ amp_group_new (GFile *file, gboolean dist_only)
 	group->base.type = ANJUTA_PROJECT_GROUP;
 	group->base.properties = amp_get_group_property_list();
 	group->base.file = g_object_ref (file);
+	group->base.state = ANJUTA_PROJECT_CAN_ADD_GROUP |
+						ANJUTA_PROJECT_CAN_ADD_TARGET |
+						ANJUTA_PROJECT_CAN_ADD_SOURCE |
+						ANJUTA_PROJECT_CAN_REMOVE |
+						ANJUTA_PROJECT_CAN_SAVE;
 	group->dist_only = dist_only;
 
     return g_node_new (group);
@@ -868,6 +892,9 @@ amp_target_new (const gchar *name, AnjutaProjectNodeType type, const gchar *inst
 	target->base.type = ANJUTA_PROJECT_TARGET | type;
 	target->base.properties = amp_get_target_property_list(type);
 	target->base.name = g_strdup (name);
+	target->base.state = ANJUTA_PROJECT_CAN_ADD_MODULE |
+						ANJUTA_PROJECT_CAN_ADD_SOURCE |
+						ANJUTA_PROJECT_CAN_REMOVE;
 	target->install = g_strdup (install);
 	target->flags = flags;
 
@@ -899,6 +926,7 @@ amp_source_new (GFile *file)
 	source->base.type = ANJUTA_PROJECT_SOURCE;
 	source->base.properties = amp_get_source_property_list();
 	source->base.file = g_object_ref (file);
+	source->base.state = ANJUTA_PROJECT_CAN_REMOVE;
 
     return g_node_new (source);
 }
diff --git a/plugins/project-manager/plugin.c b/plugins/project-manager/plugin.c
index 44edb67..4fa75da 100644
--- a/plugins/project-manager/plugin.c
+++ b/plugins/project-manager/plugin.c
@@ -43,6 +43,8 @@
 #define DEFAULT_PROFILE "file://"PACKAGE_DATA_DIR"/profiles/default.profile"
 #define PROJECT_PROFILE_NAME "project"
 
+#define INT_TO_GBOOLEAN(i) ((i) ? TRUE : FALSE)
+
 typedef struct _PmPropertiesDialogInfo PmPropertiesDialogInfo;
 
 typedef enum _PmPropertiesType
@@ -832,14 +834,19 @@ static GtkActionEntry pm_actions[] =
 		N_("_Project"), NULL, NULL, NULL
 	},
 	{
-		"ActionProjectProperties", GTK_STOCK_PROPERTIES,
-		N_("_Properties"), NULL, N_("Project properties"),
-		G_CALLBACK (on_properties)
+		"ActionProjectAddGroup", GTK_STOCK_ADD,
+		N_("Add _Groupâ?¦"), NULL, N_("Add a group to project"),
+		G_CALLBACK (on_add_group)
 	},
 	{
-		"ActionProjectRefresh", GTK_STOCK_REFRESH,
-		N_("_Refresh"), NULL, N_("Refresh project manager tree"),
-		G_CALLBACK (on_refresh)
+		"ActionProjectAddTarget", GTK_STOCK_ADD,
+		N_("Add _Targetâ?¦"), NULL, N_("Add a target to project"),
+		G_CALLBACK (on_add_target)
+	},
+	{
+		"ActionProjectAddSource", GTK_STOCK_ADD,
+		N_("Add _Source Fileâ?¦"), NULL, N_("Add a source file to project"),
+		G_CALLBACK (on_add_source)
 	},
 	{
 		"ActionProjectAddModule", GTK_STOCK_ADD,
@@ -852,19 +859,14 @@ static GtkActionEntry pm_actions[] =
 		G_CALLBACK (on_add_package)
 	},
 	{
-		"ActionProjectAddGroup", GTK_STOCK_ADD,
-		N_("Add _Groupâ?¦"), NULL, N_("Add a group to project"),
-		G_CALLBACK (on_add_group)
-	},
-	{
-		"ActionProjectAddTarget", GTK_STOCK_ADD,
-		N_("Add _Targetâ?¦"), NULL, N_("Add a target to project"),
-		G_CALLBACK (on_add_target)
+		"ActionProjectProperties", GTK_STOCK_PROPERTIES,
+		N_("_Properties"), NULL, N_("Project properties"),
+		G_CALLBACK (on_properties)
 	},
 	{
-		"ActionProjectAddSource", GTK_STOCK_ADD,
-		N_("Add _Source Fileâ?¦"), NULL, N_("Add a source file to project"),
-		G_CALLBACK (on_add_source)
+		"ActionProjectRefresh", GTK_STOCK_REFRESH,
+		N_("_Refresh"), NULL, N_("Refresh project manager tree"),
+		G_CALLBACK (on_refresh)
 	},
 	{
 		"ActionFileCloseProject", NULL,
@@ -876,14 +878,19 @@ static GtkActionEntry pm_actions[] =
 static GtkActionEntry popup_actions[] = 
 {
 	{
-		"ActionPopupProjectProperties", GTK_STOCK_PROPERTIES,
-		N_("_Properties"), NULL, N_("Properties of group/target/source"),
-		G_CALLBACK (on_popup_properties)
+		"ActionPopupProjectAddGroup", GTK_STOCK_ADD,
+		N_("Add _Group"), NULL, N_("Add a group to project"),
+		G_CALLBACK (on_popup_add_group)
 	},
 	{
-		"ActionPopupProjectAddToProject", GTK_STOCK_ADD,
-		N_("_Add to Project"), NULL, N_("Add a source file to project"),
-		G_CALLBACK (on_popup_add_to_project)
+		"ActionPopupProjectAddTarget", GTK_STOCK_ADD,
+		N_("Add _Target"), NULL, N_("Add a target to project"),
+		G_CALLBACK (on_popup_add_target)
+	},
+	{
+		"ActionPopupProjectAddSource", GTK_STOCK_ADD,
+		N_("Add _Source File"), NULL, N_("Add a source file to project"),
+		G_CALLBACK (on_popup_add_source)
 	},
 	{
 		"ActionPopupProjectAddModule", GTK_STOCK_ADD,
@@ -896,19 +903,14 @@ static GtkActionEntry popup_actions[] =
 		G_CALLBACK (on_popup_add_package)
 	},
 	{
-		"ActionPopupProjectAddGroup", GTK_STOCK_ADD,
-		N_("Add _Group"), NULL, N_("Add a group to project"),
-		G_CALLBACK (on_popup_add_group)
-	},
-	{
-		"ActionPopupProjectAddTarget", GTK_STOCK_ADD,
-		N_("Add _Target"), NULL, N_("Add a target to project"),
-		G_CALLBACK (on_popup_add_target)
+		"ActionPopupProjectAddToProject", GTK_STOCK_ADD,
+		N_("_Add to Project"), NULL, N_("Add a source file to project"),
+		G_CALLBACK (on_popup_add_to_project)
 	},
 	{
-		"ActionPopupProjectAddSource", GTK_STOCK_ADD,
-		N_("Add _Source File"), NULL, N_("Add a source file to project"),
-		G_CALLBACK (on_popup_add_source)
+		"ActionPopupProjectProperties", GTK_STOCK_PROPERTIES,
+		N_("_Properties"), NULL, N_("Properties of group/target/source"),
+		G_CALLBACK (on_popup_properties)
 	},
 	{
 		"ActionPopupProjectRemove", GTK_STOCK_REMOVE,
@@ -922,54 +924,75 @@ update_ui (ProjectManagerPlugin *plugin)
 {
 	AnjutaUI *ui;
 	gint j;
-	GtkAction *action;
-	IAnjutaProjectCapabilities caps;
+	GList *item;
+	gint main_caps;
+	gint popup_caps;
 	
-	caps = anjuta_pm_project_get_capabilities (plugin->project);
+	/* Close project is always here */
+	main_caps = 0x101;
+	popup_caps = 0x000;
 	
+	/* Check for supported node */
+	if (anjuta_pm_project_is_open (plugin->project))
+	{
+		for (item = anjuta_pm_project_get_node_info (plugin->project); item != NULL; item = g_list_next (item))
+		{
+			AnjutaProjectNodeInfo *info = (AnjutaProjectNodeInfo *)item->data;
+
+			switch (info->type & ANJUTA_PROJECT_TYPE_MASK)
+			{
+			case ANJUTA_PROJECT_GROUP:
+				main_caps |= 0x2;
+				popup_caps |= 0x21;
+				break;
+			case ANJUTA_PROJECT_TARGET:
+				main_caps |= 0x4;
+				popup_caps |= 0x2;
+				break;
+			case ANJUTA_PROJECT_SOURCE:
+				main_caps |= 0x8;
+				popup_caps |= 0x24;
+				break;
+			case ANJUTA_PROJECT_MODULE:
+				main_caps |= 0x10;
+				popup_caps |= 0x8;
+				break;
+			case ANJUTA_PROJECT_PACKAGE:
+				main_caps |= 0x20;
+				popup_caps |= 0x10;
+				break;
+			default:
+				break;
+			}
+		}
+		/* Keep properties and refresh if a project is opened */
+		main_caps |= 0x0C0;
+		/* Keep properties and remove if a project is opened */
+		popup_caps |= 0x0C0;
+	}
+
 	ui = anjuta_shell_get_ui (ANJUTA_PLUGIN (plugin)->shell, NULL);
+
+	/* Main menu */
 	for (j = 0; j < G_N_ELEMENTS (pm_actions); j++)
 	{
+		GtkAction *action;
+			
 		action = anjuta_ui_get_action (ui, "ActionGroupProjectManager",
-									   pm_actions[j].name);
-		if (pm_actions[j].callback &&
-			strcmp (pm_actions[j].name, "ActionFileCloseProject") != 0)
-		{
-			/* 'close' menuitem is never disabled */
-			g_object_set (G_OBJECT (action), "sensitive",
-						  anjuta_pm_project_is_open (plugin->project), NULL);
-		}
+										pm_actions[j].name);
+		g_object_set (G_OBJECT (action), "visible", INT_TO_GBOOLEAN (main_caps & 0x1), NULL);
+		main_caps >>= 1;
 	}
 	
-	/* Main menu */
-	action = anjuta_ui_get_action (ui, "ActionGroupProjectManager",
-								   "ActionProjectAddGroup");
-	g_object_set (G_OBJECT (action), "sensitive",
-				  (anjuta_pm_project_is_open (plugin->project) &&
-				   (caps & IANJUTA_PROJECT_CAN_ADD_GROUP)), NULL);
-	
-	action = anjuta_ui_get_action (ui, "ActionGroupProjectManager",
-								   "ActionProjectAddTarget");
-	g_object_set (G_OBJECT (action), "sensitive",
-				  (anjuta_pm_project_is_open (plugin->project) &&
-				   (caps & IANJUTA_PROJECT_CAN_ADD_TARGET)), NULL);
-
-	action = anjuta_ui_get_action (ui, "ActionGroupProjectManager",
-								   "ActionProjectAddSource");
-	g_object_set (G_OBJECT (action), "sensitive",
-				  (anjuta_pm_project_is_open (plugin->project) &&
-				   (caps & IANJUTA_PROJECT_CAN_ADD_SOURCE)), NULL);
-
-	/* Popup menus */
+	/* Popup menu */
 	for (j = 0; j < G_N_ELEMENTS (popup_actions); j++)
 	{
+		GtkAction *action;
+			
 		action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
-									   popup_actions[j].name);
-		if (popup_actions[j].callback)
-		{
-			g_object_set (G_OBJECT (action), "sensitive",
-						  anjuta_pm_project_is_open (plugin->project), NULL);
-		}
+									popup_actions[j].name);
+		g_object_set (G_OBJECT (action), "visible", INT_TO_GBOOLEAN (popup_caps & 0x1), NULL);
+		popup_caps >>= 1;
 	}
 }
 
@@ -980,82 +1003,36 @@ on_treeview_selection_changed (GtkTreeSelection *sel,
 	AnjutaUI *ui;
 	GtkAction *action;
 	AnjutaProjectNode *node;
+	gint state;
 	GFile *selected_file;
-	IAnjutaProjectCapabilities caps;
 	
 	ui = anjuta_shell_get_ui (ANJUTA_PLUGIN (plugin)->shell, NULL);
+	node = gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin->view),
+										   ANJUTA_PROJECT_UNKNOWN);
+	state = node != NULL ? anjuta_project_node_get_state (node) : 0;
+
+	g_message ("state %x", state);
 	/* Popup menu */
 	action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
 								   "ActionPopupProjectAddGroup");
-	g_object_set (G_OBJECT (action), "sensitive", FALSE, NULL);
+	g_object_set (G_OBJECT (action), "sensitive", INT_TO_GBOOLEAN (state & ANJUTA_PROJECT_CAN_ADD_GROUP), NULL);
 	action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
 								   "ActionPopupProjectAddTarget");
-	g_object_set (G_OBJECT (action), "sensitive", FALSE, NULL);
+	g_object_set (G_OBJECT (action), "sensitive", INT_TO_GBOOLEAN (state & ANJUTA_PROJECT_CAN_ADD_TARGET), NULL);
 	action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
 								   "ActionPopupProjectAddSource");
-	g_object_set (G_OBJECT (action), "sensitive", FALSE, NULL);
+	g_object_set (G_OBJECT (action), "sensitive", INT_TO_GBOOLEAN (state & ANJUTA_PROJECT_CAN_ADD_SOURCE), NULL);
+	action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
+								   "ActionPopupProjectAddModule");
+	g_object_set (G_OBJECT (action), "sensitive", INT_TO_GBOOLEAN (state & ANJUTA_PROJECT_CAN_ADD_MODULE), NULL);
+	action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
+								   "ActionPopupProjectAddPackage");
+	g_object_set (G_OBJECT (action), "sensitive", INT_TO_GBOOLEAN (state & ANJUTA_PROJECT_CAN_ADD_PACKAGE), NULL);
 	action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
 								   "ActionPopupProjectRemove");
-	g_object_set (G_OBJECT (action), "sensitive", FALSE, NULL);
-	
-	caps = anjuta_pm_project_get_capabilities (plugin->project);
-	node = gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin->view),
-										   ANJUTA_PROJECT_SOURCE);
-	if (node && anjuta_project_node_get_type (node) == ANJUTA_PROJECT_SOURCE)
-	{
-		if (caps & IANJUTA_PROJECT_CAN_ADD_SOURCE)
-		{
-			action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
-										   "ActionPopupProjectAddSource");
-			g_object_set (G_OBJECT (action), "sensitive", TRUE, NULL);
-		}
-		action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
-									   "ActionPopupProjectRemove");
-		g_object_set (G_OBJECT (action), "sensitive", TRUE, NULL);
-		goto finally;
-	}
+	g_object_set (G_OBJECT (action), "sensitive", INT_TO_GBOOLEAN (state & ANJUTA_PROJECT_CAN_REMOVE), NULL);
 	
-	node = gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin->view),
-										   ANJUTA_PROJECT_TARGET);
-	if (node && anjuta_project_node_get_type (node) == ANJUTA_PROJECT_TARGET)
-	{
-		if (caps & IANJUTA_PROJECT_CAN_ADD_SOURCE)
-		{
-			action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
-										   "ActionPopupProjectAddSource");
-			g_object_set (G_OBJECT (action), "sensitive", TRUE, NULL);
-		}
-		action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
-									   "ActionPopupProjectRemove");
-		g_object_set (G_OBJECT (action), "sensitive", TRUE, NULL);
-		goto finally;
-	}
-	
-	node = gbf_project_view_find_selected (GBF_PROJECT_VIEW (plugin->view),
-										   ANJUTA_PROJECT_GROUP);
-	if (node && anjuta_project_node_get_type (node) == ANJUTA_PROJECT_GROUP)
-	{
-		if (caps & IANJUTA_PROJECT_CAN_ADD_GROUP)
-		{
-			action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
-										   "ActionPopupProjectAddGroup");
-			g_object_set (G_OBJECT (action), "sensitive", TRUE, NULL);
-		}
-		if (caps & IANJUTA_PROJECT_CAN_ADD_TARGET)
-		{
-			action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
-										   "ActionPopupProjectAddTarget");
-			g_object_set (G_OBJECT (action), "sensitive", TRUE, NULL);
-		}
-		action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
-									   "ActionPopupProjectRemove");
-		g_object_set (G_OBJECT (action), "sensitive", TRUE, NULL);
-		goto finally;
-	}
-finally:
-	selected_file =
-		ianjuta_project_manager_get_selected (IANJUTA_PROJECT_MANAGER (plugin),
-											  NULL);
+	selected_file = node != NULL ? anjuta_project_node_get_file (node) : NULL;
 	if (selected_file)
 	{
 		GValue *value;
diff --git a/plugins/project-manager/project-view.c b/plugins/project-manager/project-view.c
index ebce808..110a38b 100644
--- a/plugins/project-manager/project-view.c
+++ b/plugins/project-manager/project-view.c
@@ -410,7 +410,7 @@ gbf_project_view_find_selected (GbfProjectView *view, AnjutaProjectNodeType type
 		node = gbf_project_model_get_node (GBF_PROJECT_MODEL (model), &iter);
 		
 		/* walk up the hierarchy searching for a node of the given type */
-		while ((node != NULL) && (anjuta_project_node_get_type (node) != type))
+		while ((node != NULL) && (type != ANJUTA_PROJECT_UNKNOWN) && (anjuta_project_node_get_type (node) != type))
 		{
 			node = anjuta_project_node_parent (node);
 		}



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