[anjuta] project-manager: Use a combo box to select a node in properties dialog



commit 8a03df01451305d0a1494eec95009399beea7696
Author: SÃbastien Granjoux <seb sfo free fr>
Date:   Tue Nov 1 13:20:18 2011 +0100

    project-manager: Use a combo box to select a node in properties dialog

 plugins/project-manager/dialogs.c      |  269 ++++++++++++++++++--------------
 plugins/project-manager/pm_dialogs.ui  |   46 ++----
 plugins/project-manager/project-view.c |  195 ++++++++++++++----------
 plugins/project-manager/project-view.h |    5 +
 4 files changed, 283 insertions(+), 232 deletions(-)
---
diff --git a/plugins/project-manager/dialogs.c b/plugins/project-manager/dialogs.c
index 700b76b..987ccb6 100644
--- a/plugins/project-manager/dialogs.c
+++ b/plugins/project-manager/dialogs.c
@@ -34,6 +34,7 @@
 #include <libanjuta/anjuta-debug.h>
 #include <libanjuta/anjuta-utils.h>
 #include <libanjuta/anjuta-pkg-config-chooser.h>
+#include <libanjuta/anjuta-tree-combo.h>
 
 #define ICON_SIZE 16
 
@@ -108,23 +109,23 @@ error_dialog (GtkWindow *parent, const gchar *summary, const gchar *msg, ...)
     va_list ap;
     gchar *tmp;
     GtkWidget *dialog;
-    
+
     va_start (ap, msg);
     tmp = g_strdup_vprintf (msg, ap);
     va_end (ap);
-    
+
     dialog = gtk_message_dialog_new_with_markup (parent,
 						 GTK_DIALOG_DESTROY_WITH_PARENT,
 						 GTK_MESSAGE_ERROR,
 						 GTK_BUTTONS_OK,
 						 "<b>%s</b>\n\n%s", summary, tmp);
     g_free (tmp);
-    
+
     gtk_dialog_run (GTK_DIALOG (dialog));
     gtk_widget_destroy (dialog);
 }
 
- 
+
 /* Private nodes functions
  *---------------------------------------------------------------------------*/
 
@@ -132,11 +133,11 @@ static PropertyEntry*
 pm_property_entry_new (GtkWidget *entry, AnjutaProjectProperty *property)
 {
 	PropertyEntry *prop;
-	
+
 	prop = g_slice_new0(PropertyEntry);
 	prop->entry = entry;
 	prop->property = property;
-	
+
 	return prop;
 }
 
@@ -165,15 +166,15 @@ parent_filter_func (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 		need = ANJUTA_PROJECT_CAN_ADD_TARGET;
 		break;
 	case ANJUTA_PROJECT_SOURCE:
-		/* Add node containing target too because target can contains module 
+		/* Add node containing target too because target can contains module
 		 * It would be probably better to check recursively if any children
-		 * can accept a module and keep all parents then. */	
+		 * can accept a module and keep all parents then. */
 		need = ANJUTA_PROJECT_CAN_ADD_SOURCE | ANJUTA_PROJECT_CAN_ADD_TARGET;
 		break;
 	case ANJUTA_PROJECT_MODULE:
-		/* Add node containing target too because target can contains module 
+		/* Add node containing target too because target can contains module
 		 * It would be probably better to check recursively if any children
-		 * can accept a module and keep all parents then. */	
+		 * can accept a module and keep all parents then. */
 		need = ANJUTA_PROJECT_CAN_ADD_MODULE | ANJUTA_PROJECT_CAN_ADD_TARGET;
 		break;
 	case ANJUTA_PROJECT_PACKAGE:
@@ -183,7 +184,7 @@ parent_filter_func (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 		need = 0;
 		break;
 	}
-	
+
 	gtk_tree_model_get (model, iter,
 						GBF_PROJECT_MODEL_COLUMN_DATA, &data, -1);
 	node = data == NULL ? NULL : gbf_tree_data_get_node (data);
@@ -199,7 +200,7 @@ parent_filter_func (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 			/* Check if node can be used as sibling */
 			parent = anjuta_project_node_parent (node);
 			visible = anjuta_project_node_get_state (parent) & need ? TRUE : FALSE;
-			
+
 		}
 	}
 
@@ -212,7 +213,7 @@ module_filter_func (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 	GbfTreeData *data = NULL;
 	gboolean visible = FALSE;
 	AnjutaProjectNode *node;
-	
+
 	gtk_tree_model_get (model, iter,
 						GBF_PROJECT_MODEL_COLUMN_DATA, &data, -1);
 	node = data == NULL ? NULL : gbf_tree_data_get_node (data);
@@ -222,11 +223,11 @@ module_filter_func (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
 
 		visible = (type == ANJUTA_PROJECT_MODULE) || (type == ANJUTA_PROJECT_PACKAGE);
 	}
-	
+
 	return visible;
 }
 
-static void 
+static void
 setup_nodes_treeview (GbfProjectView           *view,
 						GbfProjectView		   *parent,
                   	    GtkTreePath            *root,
@@ -243,6 +244,47 @@ setup_nodes_treeview (GbfProjectView           *view,
 }
 
 static void
+setup_nodes_combo_box (AnjutaTreeComboBox      *view,
+						GbfProjectModel	   *model,
+                  	    GtkTreePath            *root,
+						GtkTreeModelFilterVisibleFunc func,
+						gpointer               data,
+						GtkTreeIter            *selected)
+{
+	GtkTreeIter iter;
+
+	g_return_if_fail (view != NULL);
+	g_return_if_fail (model != NULL);
+
+	pm_setup_project_renderer (GTK_CELL_LAYOUT (view));
+
+	if ((func != NULL) || (root != NULL))
+	{
+		GtkTreeModel *filter;
+
+		filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (model), root);
+		if (func != NULL)
+		{
+			gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter), func, data, NULL);
+		}
+		anjuta_tree_combo_box_set_model (view, filter);
+		g_object_unref (filter);
+		if (pm_convert_project_iter_to_model_iter (filter, &iter, selected))
+		{
+			anjuta_tree_combo_box_set_active_iter (view, &iter);
+		}
+	}
+	else
+    {
+		anjuta_tree_combo_box_set_model (view, GTK_TREE_MODEL (model));
+		if (selected)
+		{
+			anjuta_tree_combo_box_set_active_iter (view, selected);
+		}
+	}
+}
+
+static void
 entry_changed_cb (GtkEditable *editable, gpointer user_data)
 {
     GtkWidget *button = user_data;
@@ -270,7 +312,7 @@ on_value_edited (GtkCellRendererText *cell,
 	GtkTreeView *view = (GtkTreeView *)user_data;
 	GtkTreeIter iter;
 	GtkTreeModel * model;
-	
+
 	model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
 	if (gtk_tree_model_get_iter_from_string (model, &iter, path_string))
 	{
@@ -299,7 +341,7 @@ browse_button_clicked_cb (GtkWidget *widget, gpointer user_data)
 	gint result;
 
 	g_return_if_fail (user_data != NULL && GTK_IS_TREE_VIEW (user_data));
-	
+
 	model = gtk_tree_view_get_model(tree);
 	/*if (gtk_tree_model_get_iter_first(model, &iter))
 	{
@@ -308,7 +350,7 @@ browse_button_clicked_cb (GtkWidget *widget, gpointer user_data)
 	}
 	else
 		uri = g_strdup("");*/
-	
+
 	dialog = GTK_FILE_CHOOSER_DIALOG(gtk_file_chooser_dialog_new (_("Select sourcesâ"),
 						GTK_WINDOW (gtk_widget_get_toplevel (widget)),
 						GTK_FILE_CHOOSER_ACTION_OPEN,
@@ -353,10 +395,10 @@ browse_button_clicked_cb (GtkWidget *widget, gpointer user_data)
 	}
 	default:
 		break;
-	} 
+	}
 	gtk_widget_destroy (GTK_WIDGET(dialog));
 }
- 
+
 /* Private properties functions
  *---------------------------------------------------------------------------*/
 
@@ -386,7 +428,7 @@ add_entry (IAnjutaProject *project, AnjutaProjectNode *node, AnjutaProjectProper
 	}
 
 	editable = prop->flags & ANJUTA_PROJECT_PROPERTY_READ_ONLY ? FALSE : TRUE;
-	
+
 	if (prop->detail != NULL)
 	{
 		if (!editable)
@@ -398,7 +440,7 @@ add_entry (IAnjutaProject *project, AnjutaProjectNode *node, AnjutaProjectProper
 			tooltip = g_strdup (_(prop->detail));
 		}
 	}
-	
+
 	if (tooltip != NULL)
 	{
 		gtk_widget_set_tooltip_markup (label, tooltip);
@@ -432,11 +474,11 @@ add_entry (IAnjutaProject *project, AnjutaProjectNode *node, AnjutaProjectProper
 			model = GTK_TREE_MODEL (gtk_list_store_newv (LIST_COLUMNS_NB, column_type));
 
 			if (prop->native != NULL) prop = prop->native;
-			
+
 			for (item = anjuta_project_node_get_custom_properties (node); item != NULL; item = g_list_next (item))
 			{
 				AnjutaProjectProperty *cust_prop = (AnjutaProjectProperty *)item->data;
-				
+
 				if (cust_prop->native == prop)
 				{
 					gtk_list_store_append (GTK_LIST_STORE (model), &iter);
@@ -448,7 +490,7 @@ add_entry (IAnjutaProject *project, AnjutaProjectNode *node, AnjutaProjectProper
 					                    -1);
 				}
 			}
-			
+
 			gtk_list_store_append (GTK_LIST_STORE (model), &iter);
 			gtk_list_store_set (GTK_LIST_STORE (model), &iter,
 			                    NAME_COLUMN, "",
@@ -456,10 +498,10 @@ add_entry (IAnjutaProject *project, AnjutaProjectNode *node, AnjutaProjectProper
 			                    EDITABLE_COLUMN, TRUE,
 			                    PROPERTY_COLUMN, NULL,
 			                    -1);
-			
+
 			entry = gtk_frame_new (NULL);
 			gtk_frame_set_shadow_type (GTK_FRAME (entry), GTK_SHADOW_IN);
-			
+
 			view = gtk_tree_view_new_with_model (model);
 			gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (view)),
 											GTK_SELECTION_SINGLE);
@@ -485,25 +527,25 @@ add_entry (IAnjutaProject *project, AnjutaProjectNode *node, AnjutaProjectProper
 			g_signal_connect(renderer, "edited", (GCallback) on_value_edited, view);
 			gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
 			gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
-			
+
 			gtk_container_add (GTK_CONTAINER (entry), view);
-			
+
 			break;
 	default:
 		return NULL;
-	}		
+	}
 	if (tooltip != NULL)
 	{
 		gtk_widget_set_tooltip_markup (entry, tooltip);
 	}
 	g_free (tooltip);
-	
+
 	gtk_widget_show (entry);
 	gtk_table_attach (GTK_TABLE (table), entry, 1, 2, *position, *position+1,
 			  GTK_FILL | GTK_EXPAND, GTK_FILL, 5, 3);
-	
+
 	*position = *position + 1;
-	
+
 	return entry;
 }
 
@@ -511,7 +553,7 @@ static void
 add_label (const gchar *display_name, const gchar *value, GtkWidget *table, gint *position)
 {
 	GtkWidget *label;
-	
+
 	label = gtk_label_new (display_name);
 	gtk_misc_set_alignment (GTK_MISC (label), 0, -1);
 	gtk_widget_show (label);
@@ -552,7 +594,6 @@ update_properties (PropertiesTable *table)
 	AnjutaProjectNodeInfo* node_info;
 	gboolean single;
 	GList *children;
-	GList *last;
 
 	head_pos = 0;
 	main_pos = 0;
@@ -587,8 +628,6 @@ update_properties (PropertiesTable *table)
 
 	/* Clear table */
 	children = gtk_container_get_children (GTK_CONTAINER (table->head));
-	/* Clear only the first 4 widgets */
-	while ((last = g_list_nth (children, 4)) != NULL) children = g_list_delete_link (children, last);
 	g_list_foreach (children, (GFunc)gtk_widget_destroy, NULL);
 	g_list_free (children);
 	children = gtk_container_get_children (GTK_CONTAINER (table->main));
@@ -600,13 +639,13 @@ update_properties (PropertiesTable *table)
 	g_list_foreach (table->properties, (GFunc)pm_property_entry_free, NULL);
 	g_list_free (table->properties);
 	table->properties = NULL;
-	
+
 	/* Update node name */
 	file = anjuta_project_node_get_file (table->node);
 	if (file != NULL)
 	{
 		gchar *path;
-		
+
 		path = g_file_get_path (file);
 		add_label (_("Path:"), path, table->head, &head_pos);
 		g_free (path);
@@ -615,7 +654,7 @@ update_properties (PropertiesTable *table)
 	{
 		add_label (_("Name:"), anjuta_project_node_get_name (table->node), table->head, &head_pos);
 	}
-	
+
 	/* Display node type only if several types are possible */
 	node_info = NULL;
 	single = TRUE;
@@ -643,8 +682,8 @@ update_properties (PropertiesTable *table)
 
 	for (item = anjuta_project_node_get_native_properties (table->node); item != NULL; item = g_list_next (item))
 	{
-		AnjutaProjectProperty *valid_prop = (AnjutaProjectProperty *)item->data; 
-		AnjutaProjectProperty *prop; 
+		AnjutaProjectProperty *valid_prop = (AnjutaProjectProperty *)item->data;
+		AnjutaProjectProperty *prop;
 		GtkWidget *entry;
 
 		prop = anjuta_project_node_get_property (table->node, valid_prop);
@@ -668,7 +707,7 @@ update_properties (PropertiesTable *table)
 	}
 	table->properties = g_list_reverse (table->properties);
 	gtk_widget_show_all (table->table);
-	
+
 	/* Hide expander if it is empty */
 	if (single)
 		gtk_widget_show (table->expand);
@@ -684,7 +723,7 @@ on_properties_dialog_response (GtkWidget *dialog,
 	if (id == GTK_RESPONSE_APPLY)
 	{
 		GList *item;
-		
+
 		/* Get all modified properties */
 		for (item = g_list_first (table->properties); item != NULL; item = g_list_next (item))
 		{
@@ -695,11 +734,11 @@ on_properties_dialog_response (GtkWidget *dialog,
 			gboolean active;
 			GtkTreeIter iter;
 			GtkTreeModel *model;
-			
+
 			/* Get property value in node */
 			prop = anjuta_project_node_get_property (table->node, entry->property);
 			if (prop == NULL) prop = entry->property;
-			
+
 			switch (prop->type)
 			{
 			case ANJUTA_PROJECT_PROPERTY_STRING:
@@ -728,7 +767,7 @@ on_properties_dialog_response (GtkWidget *dialog,
 			case ANJUTA_PROJECT_PROPERTY_BOOLEAN:
 				active = prop->value == NULL ? FALSE : (*prop->value == '1' ? TRUE : FALSE);
 				text = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (entry->entry)) ? "1" : "0";
-					
+
 				if (active != (*text == '1'))
 				{
 					/* Modified */
@@ -764,21 +803,18 @@ on_properties_dialog_response (GtkWidget *dialog,
 }
 
 static void
-on_node_changed (GtkTreeView       *view,
-                 gpointer           user_data)     
+on_node_changed (AnjutaTreeComboBox *view,
+                 gpointer user_data)
 {
 	PropertiesTable *table = (PropertiesTable *)user_data;
 	GtkTreeIter iter;
-	GtkTreePath *path;
-	GtkTreeModel *model;
 
-	model = gtk_tree_view_get_model (view);
-	gtk_tree_view_get_cursor (view, &path, NULL);
-	
-	if (gtk_tree_model_get_iter (model, &iter, path))
+	if (anjuta_tree_combo_box_get_active_iter (view, &iter))
 	{
+		GtkTreeModel *model;
 		GbfTreeData *data;
-		
+
+		model = anjuta_tree_combo_box_get_model (view);
 		gtk_tree_model_get (model, &iter, GBF_PROJECT_MODEL_COLUMN_DATA, &data, -1);
 
 		if (table->data->properties_dialog != NULL)
@@ -797,8 +833,6 @@ on_node_changed (GtkTreeView       *view,
 		table->node = gbf_tree_data_get_node (data);
 		update_properties (table);
 	}
-
-	if (path != NULL) gtk_tree_path_free (path);
 }
 
 static GtkWidget *
@@ -807,10 +841,10 @@ pm_project_create_properties_dialog (AnjutaPmProject *project, GtkWindow *parent
 	PropertiesTable *table;
 	GtkWidget *dialog = NULL;
 	GtkBuilder *bxml;
-	GtkWidget *node_view;
-	
+	GtkWidget *node_combo;
+
 	g_return_val_if_fail (data != NULL, NULL);
-	
+
 	bxml = anjuta_util_builder_new (GLADE_FILE, NULL);
 	if (!bxml) return NULL;
 
@@ -820,8 +854,8 @@ pm_project_create_properties_dialog (AnjutaPmProject *project, GtkWindow *parent
 	table->project = project;
 	anjuta_util_builder_get_objects (bxml,
 									"properties", &table->table,
+	                                "nodes_combo", &node_combo,
 									"head_table", &table->head,
-	                                "nodes_view", &node_view,
 									"main_table", &table->main,
 									"extra_table", &table->extra,
 									"extra_expand", &table->expand,
@@ -829,14 +863,17 @@ pm_project_create_properties_dialog (AnjutaPmProject *project, GtkWindow *parent
 	g_object_ref (table->table);
 	g_object_unref (bxml);
 
-	/* Add tree view */
-	setup_nodes_treeview (GBF_PROJECT_VIEW (node_view),
-	                        view,
-	                        NULL,
-							is_project_node_but_shortcut,
-							NULL,
-							selected);
-	gtk_widget_show (node_view);
+	/* Add combo node selection */
+	setup_nodes_combo_box (ANJUTA_TREE_COMBO_BOX (node_combo),
+	                       gbf_project_view_get_model(ANJUTA_PLUGIN_PROJECT_MANAGER (table->project->plugin)->view),
+	                       NULL,
+	                       is_project_node_but_shortcut,
+	                       NULL,
+	                       selected);
+
+	g_signal_connect (node_combo, "changed",
+					G_CALLBACK (on_node_changed),
+					table);
 
 	dialog = gtk_dialog_new_with_buttons (NULL,
 						   parent,
@@ -848,11 +885,7 @@ pm_project_create_properties_dialog (AnjutaPmProject *project, GtkWindow *parent
 	table->dialog = dialog;
 
 	update_properties (table);
-	
-	g_signal_connect (node_view, "cursor-changed",
-					G_CALLBACK (on_node_changed),
-					table);
-	
+
 	g_signal_connect (dialog, "response",
 					G_CALLBACK (on_properties_dialog_response),
 					table);
@@ -861,7 +894,7 @@ pm_project_create_properties_dialog (AnjutaPmProject *project, GtkWindow *parent
 					table->table);
 	gtk_window_set_default_size (GTK_WINDOW (dialog), 450, -1);
 	gtk_widget_show (dialog);
-	
+
 	return dialog;
 }
 
@@ -881,7 +914,7 @@ anjuta_pm_project_show_properties_dialog (ProjectManagerPlugin *plugin, GtkTreeI
 {
 	GtkWidget **dialog_ptr;
 	GtkTreeIter iter;
-	
+
 	if (selected == NULL)
 	{
 		/* Display root properties by default */
@@ -894,11 +927,11 @@ anjuta_pm_project_show_properties_dialog (ProjectManagerPlugin *plugin, GtkTreeI
 	if (selected)
 	{
 		GbfTreeData *data;
-		
+
 		gtk_tree_model_get (GTK_TREE_MODEL (gbf_project_view_get_model (plugin->view)), selected, GBF_PROJECT_MODEL_COLUMN_DATA, &data, -1);
 
 		dialog_ptr = &data->properties_dialog;
-	
+
 		if (*dialog_ptr != NULL)
 		{
 			/* Show already existing dialog */
@@ -910,7 +943,7 @@ anjuta_pm_project_show_properties_dialog (ProjectManagerPlugin *plugin, GtkTreeI
 				plugin->project,
 				GTK_WINDOW (plugin->project->plugin->shell),
 			    plugin->view,
-			    data,                                               
+			    data,
 				selected);
 			if (*dialog_ptr != NULL)
 			{
@@ -981,7 +1014,7 @@ anjuta_pm_project_new_group (ProjectManagerPlugin *plugin, GtkWindow *parent, Gt
 		response = gtk_dialog_run (GTK_DIALOG (dialog));
 
 		switch (response) {
-			case GTK_RESPONSE_OK: 
+			case GTK_RESPONSE_OK:
 			{
 				GError *err = NULL;
 				AnjutaProjectNode *group;
@@ -1023,7 +1056,7 @@ anjuta_pm_project_new_group (ProjectManagerPlugin *plugin, GtkWindow *parent, Gt
 	/* destroy stuff */
 	gtk_widget_destroy (dialog);
 	g_object_unref (gui);
-	
+
 	return new_group;
 }
 
@@ -1039,18 +1072,18 @@ anjuta_pm_project_new_source (ProjectManagerPlugin *plugin,
 	GList* new_sources;
 	gchar* uri = NULL;
 	GList* uris = NULL;
-	
+
 	if (default_uri)
 	{
 		uri = g_strdup (default_uri);
 		uris = g_list_append (NULL, uri);
 	}
-	new_sources = 
+	new_sources =
 		anjuta_pm_project_new_multiple_source (plugin, parent,
 										default_parent, uris);
 	g_free (uri);
 	g_list_free (uris);
-	
+
 	if (new_sources && g_list_length (new_sources))
 	{
 		AnjutaProjectNode *new_source = new_sources->data;
@@ -1061,7 +1094,7 @@ anjuta_pm_project_new_source (ProjectManagerPlugin *plugin,
 		return NULL;
 }
 
-GList* 
+GList*
 anjuta_pm_project_new_multiple_source (ProjectManagerPlugin *plugin,
 								GtkWindow           *top_window,
 								GtkTreeIter         *default_parent,
@@ -1109,7 +1142,7 @@ anjuta_pm_project_new_multiple_source (ProjectManagerPlugin *plugin,
 
 	/* set up dialog */
 	uri_node = uris_to_add;
-	while (uri_node) 
+	while (uri_node)
 	{
 		GtkTreeIter iter;
 		gchar* filename = g_path_get_basename (uri_node->data);
@@ -1128,7 +1161,7 @@ anjuta_pm_project_new_multiple_source (ProjectManagerPlugin *plugin,
 
 	g_signal_connect (G_OBJECT(list), "row_changed",
 					G_CALLBACK(on_row_changed), ok_button);
-    
+
 	g_signal_connect (browse_button, "clicked",
 					G_CALLBACK (browse_button_clicked_cb), source_file_tree);
 
@@ -1161,7 +1194,7 @@ anjuta_pm_project_new_multiple_source (ProjectManagerPlugin *plugin,
 
 		switch (response)
 		{
-		case GTK_RESPONSE_OK: 
+		case GTK_RESPONSE_OK:
 		{
 			AnjutaProjectNode *parent = NULL;
 			AnjutaProjectNode *sibling = NULL;
@@ -1182,7 +1215,7 @@ anjuta_pm_project_new_multiple_source (ProjectManagerPlugin *plugin,
 					parent = NULL;
 				}
 			}
-			
+
 			if (parent)
 			{
 				GtkTreeIter iter;
@@ -1231,7 +1264,7 @@ anjuta_pm_project_new_multiple_source (ProjectManagerPlugin *plugin,
 				}
 				g_string_free (err_mesg, TRUE);
 			}
-			else 
+			else
 			{
 				error_dialog (top_window, _("Cannot add source files"),
 						"%s", _("The selected node cannot contain source files."));
@@ -1248,7 +1281,7 @@ anjuta_pm_project_new_multiple_source (ProjectManagerPlugin *plugin,
 	/* destroy stuff */
 	gtk_widget_destroy (dialog);
 	g_object_unref (gui);
-	
+
 	return new_sources;
 }
 
@@ -1276,7 +1309,7 @@ build_types_store (AnjutaPmProject *project, AnjutaProjectNodeType store_type)
                                 G_TYPE_POINTER,
                                 G_TYPE_STRING,
                                 GDK_TYPE_PIXBUF);
-    
+
     for (node = types; node != NULL; node = g_list_next (node)) {
         GdkPixbuf *pixbuf;
         const gchar *name;
@@ -1307,7 +1340,7 @@ build_types_store (AnjutaPmProject *project, AnjutaProjectNodeType store_type)
     return store;
 }
 
-AnjutaProjectNode* 
+AnjutaProjectNode*
 anjuta_pm_project_new_target (ProjectManagerPlugin *plugin,
                              GtkWindow       *parent,
                              GtkTreeIter     *default_group,
@@ -1358,7 +1391,7 @@ anjuta_pm_project_new_target (ProjectManagerPlugin *plugin,
 
 	/* setup target types combo box */
 	types_store = build_types_store (plugin->project, ANJUTA_PROJECT_TARGET);
-	gtk_combo_box_set_model (GTK_COMBO_BOX (target_type_combo), 
+	gtk_combo_box_set_model (GTK_COMBO_BOX (target_type_combo),
 							GTK_TREE_MODEL (types_store));
 
 	/* create cell renderers */
@@ -1394,7 +1427,7 @@ anjuta_pm_project_new_target (ProjectManagerPlugin *plugin,
 
 		switch (response)
 		{
-			case GTK_RESPONSE_OK: 
+			case GTK_RESPONSE_OK:
 			{
 				GError *err = NULL;
 				AnjutaProjectNode *group;
@@ -1410,7 +1443,7 @@ anjuta_pm_project_new_target (ProjectManagerPlugin *plugin,
 				/* retrieve target type */
 				if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (target_type_combo), &iter))
 				{
-					gtk_tree_model_get (GTK_TREE_MODEL (types_store), &iter, 
+					gtk_tree_model_get (GTK_TREE_MODEL (types_store), &iter,
 										TARGET_TYPE_TYPE, &type,
 										-1);
 				}
@@ -1453,7 +1486,7 @@ anjuta_pm_project_new_target (ProjectManagerPlugin *plugin,
 	return new_target;
 }
 
- 
+
 /* Module dialog
  *---------------------------------------------------------------------------*/
 
@@ -1462,7 +1495,7 @@ on_cursor_changed(GtkTreeView* view, gpointer data)
 {
 	GtkWidget* button = GTK_WIDGET(data);
 	GtkTreeSelection *selection = gtk_tree_view_get_selection(view);
- 
+
 	if (gtk_tree_selection_count_selected_rows (selection) > 0)
 		gtk_widget_set_sensitive(button, TRUE);
 	else
@@ -1553,7 +1586,7 @@ anjuta_pm_project_new_module (ProjectManagerPlugin *plugin,
 
 				break;
 			}
-			case GTK_RESPONSE_OK: 
+			case GTK_RESPONSE_OK:
 			{
 				AnjutaProjectNode *target;
 
@@ -1632,7 +1665,7 @@ on_cursor_changed_set_entry(GtkTreeView* view, gpointer data)
     GtkWidget* entry = GTK_WIDGET(data);
     AnjutaPkgConfigChooser* chooser = ANJUTA_PKG_CONFIG_CHOOSER (view);
 	GList* packages = anjuta_pkg_config_chooser_get_active_packages (chooser);
-	
+
     if (packages)
     {
 		gchar* name = packages->data;
@@ -1689,7 +1722,7 @@ on_pkg_chooser_selection_changed (AnjutaPkgConfigChooser* chooser,
 	anjuta_util_glist_strings_free (packages);
 }
 
-GList* 
+GList*
 anjuta_pm_project_new_package (ProjectManagerPlugin *plugin,
                               GtkWindow        *parent,
                               GtkTreeIter      *default_module,
@@ -1709,12 +1742,12 @@ anjuta_pm_project_new_package (ProjectManagerPlugin *plugin,
 	AnjutaProjectNode *module = NULL;
     gint default_pos = -1;
 	gint pos;
-    
+
     g_return_val_if_fail (plugin->project != NULL, NULL);
-    
+
     gui = load_interface ("add_package_dialog");
     g_return_val_if_fail (gui != NULL, NULL);
-    
+
     /* get all needed widgets */
     dialog = GTK_WIDGET (gtk_builder_get_object (gui, "add_package_dialog"));
     module_entry = GTK_WIDGET (gtk_builder_get_object (gui, "module_entry"));
@@ -1734,9 +1767,9 @@ anjuta_pm_project_new_package (ProjectManagerPlugin *plugin,
 			module = gbf_tree_data_get_node (data);
 		}
 	}
-	
+
     /* Fill combo box with modules */
-    store = gtk_list_store_new(1, G_TYPE_STRING);	
+    store = gtk_list_store_new(1, G_TYPE_STRING);
     gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (module_entry), 0);
 
 	root = ianjuta_project_get_root (plugin->project->project, NULL);
@@ -1770,13 +1803,13 @@ anjuta_pm_project_new_package (ProjectManagerPlugin *plugin,
     {
         /* Create automatically a module name from the package name when missing */
         GtkWidget *entry = gtk_bin_get_child (GTK_BIN (module_entry));
-        
+
         g_signal_connect (G_OBJECT(packages_view), "cursor-changed",
             G_CALLBACK(on_cursor_changed_set_entry), entry);
         g_signal_connect (G_OBJECT(entry), "changed",
             G_CALLBACK(on_changed_disconnect), packages_view);
     }
-    
+
     /* Fill package list */
 	anjuta_pkg_config_chooser_show_active_column (ANJUTA_PKG_CONFIG_CHOOSER (packages_view),
 	                                              TRUE);
@@ -1784,17 +1817,17 @@ anjuta_pm_project_new_package (ProjectManagerPlugin *plugin,
         G_CALLBACK(on_pkg_chooser_selection_changed), ok_button);
     g_signal_connect (G_OBJECT(packages_view), "package-deactivated",
         G_CALLBACK(on_pkg_chooser_selection_changed), ok_button);
-	
+
     if (parent) {
         gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
     }
-    
+
     /* execute dialog */
     while (!finished) {
         response = gtk_dialog_run (GTK_DIALOG (dialog));
 
         switch (response) {
-            case GTK_RESPONSE_OK: 
+            case GTK_RESPONSE_OK:
             {
                 gchar *name;
 				AnjutaProjectNode *module = NULL;
@@ -1824,7 +1857,7 @@ anjuta_pm_project_new_package (ProjectManagerPlugin *plugin,
 						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);
@@ -1832,12 +1865,12 @@ anjuta_pm_project_new_package (ProjectManagerPlugin *plugin,
 					}
 				}
 				g_free (name);
-				
+
                 if (module != NULL)
                 {
                     GList *list;
                     GList *node;
-                    
+
                     list = anjuta_pkg_config_chooser_get_active_packages (ANJUTA_PKG_CONFIG_CHOOSER (packages_view));
                     for (node = list; node != NULL; node = g_list_next (node))
                     {
@@ -1865,7 +1898,7 @@ anjuta_pm_project_new_package (ProjectManagerPlugin *plugin,
 					}
 					anjuta_util_glist_strings_free (list);
 				}
-					
+
                 if (error_message->len != 0)
                 {
                     error_dialog (parent, _("Cannot add packages"),
@@ -1883,10 +1916,10 @@ anjuta_pm_project_new_package (ProjectManagerPlugin *plugin,
                 break;
         }
     }
-    
+
     /* destroy stuff */
     gtk_widget_destroy (dialog);
     g_object_unref (gui);
-    
+
     return packages;
 }
diff --git a/plugins/project-manager/pm_dialogs.ui b/plugins/project-manager/pm_dialogs.ui
index de03cdf..269dc8e 100644
--- a/plugins/project-manager/pm_dialogs.ui
+++ b/plugins/project-manager/pm_dialogs.ui
@@ -840,6 +840,19 @@
     <property name="border_width">6</property>
     <property name="spacing">12</property>
     <child>
+      <object class="AnjutaTreeComboBox" id="nodes_combo">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="receives_default">True</property>
+        <property name="use_action_appearance">False</property>
+      </object>
+      <packing>
+        <property name="expand">True</property>
+        <property name="fill">True</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
       <object class="GtkTable" id="head_table">
         <property name="visible">True</property>
         <property name="n_rows">3</property>
@@ -868,39 +881,6 @@
       <packing>
         <property name="expand">False</property>
         <property name="fill">False</property>
-        <property name="position">0</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkExpander" id="expand2">
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="spacing">6</property>
-        <child>
-          <object class="GtkScrolledWindow" id="scrolledwindow4">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="hscrollbar_policy">automatic</property>
-            <property name="vscrollbar_policy">automatic</property>
-            <property name="shadow_type">in</property>
-            <child>
-              <object class="GbfProjectView" id="nodes_view">
-                <property name="visible">True</property>
-              </object>
-            </child>
-          </object>
-        </child>
-        <child type="label">
-          <object class="GtkLabel" id="label14">
-            <property name="visible">True</property>
-            <property name="yalign">1</property>
-            <property name="label" translatable="yes">Browse other nodes</property>
-          </object>
-        </child>
-      </object>
-      <packing>
-        <property name="expand">False</property>
-        <property name="fill">False</property>
         <property name="position">1</property>
       </packing>
     </child>
diff --git a/plugins/project-manager/project-view.c b/plugins/project-manager/project-view.c
index ef279c2..8631178 100644
--- a/plugins/project-manager/project-view.c
+++ b/plugins/project-manager/project-view.c
@@ -281,16 +281,16 @@ static void gbf_project_view_class_init    (GbfProjectViewClass *klass);
 static void gbf_project_view_init          (GbfProjectView      *tree);
 static void destroy                        (GtkWidget           *object);
 
-static void set_pixbuf                     (GtkTreeViewColumn   *tree_column,
+static void set_pixbuf                     (GtkCellLayout   	*layout,
 					    GtkCellRenderer     *cell,
 					    GtkTreeModel        *model,
 					    GtkTreeIter         *iter,
-					    gpointer             data);
-static void set_text                       (GtkTreeViewColumn   *tree_column,
+					    gpointer             user_data);
+static void set_text                       (GtkCellLayout   	*layout,
 					    GtkCellRenderer     *cell,
 					    GtkTreeModel        *model,
 					    GtkTreeIter         *iter,
-					    gpointer             data);
+					    gpointer             user_data);
 
 
 G_DEFINE_TYPE(GbfProjectView, gbf_project_view, GTK_TYPE_TREE_VIEW);
@@ -404,11 +404,11 @@ get_icon (GFile *file)
 }
 
 static void
-set_pixbuf (GtkTreeViewColumn *tree_column,
-	    GtkCellRenderer   *cell,
-	    GtkTreeModel      *model,
-	    GtkTreeIter       *iter,
-	    gpointer           user_data)
+set_pixbuf (GtkCellLayout *layout,
+	    GtkCellRenderer *cell,
+	    GtkTreeModel *model,
+	    GtkTreeIter *iter,
+	    gpointer user_data)
 {
 	GbfTreeData *data = NULL;
 	GdkPixbuf *pixbuf = NULL;
@@ -484,11 +484,11 @@ set_pixbuf (GtkTreeViewColumn *tree_column,
 }
 
 static void
-set_text (GtkTreeViewColumn *tree_column,
-	  GtkCellRenderer   *cell,
-	  GtkTreeModel      *model,
-	  GtkTreeIter       *iter,
-	  gpointer           user_data)
+set_text (GtkCellLayout *layout,
+	  GtkCellRenderer *cell,
+	  GtkTreeModel *model,
+	  GtkTreeIter *iter,
+	  gpointer user_data)
 {
 	GbfTreeData *data;
 
@@ -620,7 +620,6 @@ is_project_node_visible (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_d
 static void
 gbf_project_view_init (GbfProjectView *tree)
 {
-	GtkCellRenderer *renderer;
 	GtkTreeViewColumn *column;
 	static GtkTargetEntry row_targets[] = {
 		{ "GTK_TREE_MODEL_ROW", GTK_TARGET_SAME_WIDGET, 0 }
@@ -645,14 +644,7 @@ gbf_project_view_init (GbfProjectView *tree)
 
 	/* set renderer for files column. */
 	column = gtk_tree_view_column_new ();
-	renderer = gtk_cell_renderer_pixbuf_new ();
-	gtk_tree_view_column_pack_start (column, renderer, FALSE);
-	gtk_tree_view_column_set_cell_data_func (column, renderer, set_pixbuf, tree, NULL);
-
-	renderer = gtk_cell_renderer_text_new ();
-	gtk_tree_view_column_pack_start (column, renderer, FALSE);
-	gtk_tree_view_column_set_cell_data_func (column, renderer, set_text, tree, NULL);
-
+	pm_setup_project_renderer (GTK_CELL_LAYOUT (column));
 	gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
 
 	/* Create model */
@@ -743,72 +735,23 @@ void
 gbf_project_view_set_cursor_to_iter (GbfProjectView *view,
                                      GtkTreeIter *selected)
 {
-	GtkTreePath *path = NULL;
 	GtkTreeIter view_iter;
 
-	/* select node if we find it in the view*/
-	if ((selected != NULL) && gtk_tree_model_filter_convert_child_iter_to_iter (
-			GTK_TREE_MODEL_FILTER (view->filter), &view_iter, selected))
-	{
-		path = gtk_tree_model_get_path (GTK_TREE_MODEL (view->filter), &view_iter);
-	}
-	else
+	if (pm_convert_project_iter_to_model_iter (GTK_TREE_MODEL (view->filter), &view_iter, selected))
 	{
-		/* Check if it is a shortcut */
-		if (selected !=NULL)
-		{
-			GbfTreeData *data;
-
-			gtk_tree_model_get (GTK_TREE_MODEL (view->model), selected,
-			                    GBF_PROJECT_MODEL_COLUMN_DATA, &data,
-			                    -1);
-
-			if ((data != NULL) && (data->shortcut != NULL))
-			{
-				/* Select the corresponding node */
-				GtkTreeIter iter;
-
-				if (gbf_project_model_find_tree_data (view->model, &iter, data->shortcut))
-				{
-					if (gtk_tree_model_filter_convert_child_iter_to_iter (
-					         GTK_TREE_MODEL_FILTER (view->filter), &view_iter, &iter))
-					{
-						path = gtk_tree_model_get_path (GTK_TREE_MODEL (view->filter), &view_iter);
-					}
-				}
-			}
-		}
+		GtkTreePath *path;
 
-		/* Try to select root node */
-		if (path == NULL)
+		path = gtk_tree_model_get_path (GTK_TREE_MODEL (view->filter), &view_iter);
+		if (path)
 		{
-			GtkTreePath *root_path;
-
-			root_path = gbf_project_model_get_project_root (view->model);
-			if (root_path)
-			{
-				path = gtk_tree_model_filter_convert_child_path_to_path (
-							GTK_TREE_MODEL_FILTER (view->filter), root_path);
-				gtk_tree_path_free (root_path);
-			}
-		}
+			gtk_tree_view_expand_to_path (GTK_TREE_VIEW (view), path);
 
-		/* Take the first node */
-		if (path == NULL)
-		{
-			path = gtk_tree_path_new_first ();
+			gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), path, NULL, FALSE);
+			gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), path, NULL,
+			                              TRUE, 0.5, 0.0);
+			gtk_tree_path_free (path);
 		}
 	}
-
-	if (path)
-	{
-		gtk_tree_view_expand_to_path (GTK_TREE_VIEW (view), path);
-
-		gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), path, NULL, FALSE);
-		gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), path, NULL,
-									TRUE, 0.5, 0.0);
-		gtk_tree_path_free (path);
-	}
 }
 
 
@@ -1558,3 +1501,93 @@ gbf_project_view_get_project_root (GbfProjectView *view, GtkTreeIter *iter)
 
 	return ok;
 }
+
+/* Public functions
+ *---------------------------------------------------------------------------*/
+
+GtkCellLayout *
+pm_setup_project_renderer (GtkCellLayout *layout)
+{
+	GtkCellRenderer *renderer;
+
+	renderer = gtk_cell_renderer_pixbuf_new ();
+	gtk_cell_layout_pack_start (layout, renderer, FALSE);
+	gtk_cell_layout_set_cell_data_func (layout, renderer, set_pixbuf, NULL, NULL);
+
+	renderer = gtk_cell_renderer_text_new ();
+	gtk_cell_layout_pack_start (layout, renderer, FALSE);
+	gtk_cell_layout_set_cell_data_func (layout, renderer, set_text, NULL, NULL);
+
+	return layout;
+}
+
+gboolean
+pm_convert_project_iter_to_model_iter (GtkTreeModel *model,
+                                       GtkTreeIter *model_iter,
+                                       GtkTreeIter *project_iter)
+{
+	gboolean found = TRUE;
+
+	g_return_val_if_fail (GTK_IS_TREE_MODEL_FILTER (model), FALSE);
+
+	/* Check if we can find a direct correspondance */
+	if ((project_iter == NULL) || !gtk_tree_model_filter_convert_child_iter_to_iter (
+			GTK_TREE_MODEL_FILTER (model), model_iter, project_iter))
+	{
+		GtkTreeModel *project_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model));
+
+		found = FALSE;
+
+		/* Check if it is a shortcut */
+		if (project_iter != NULL)
+		{
+			GbfTreeData *data;
+
+			gtk_tree_model_get (project_model, project_iter,
+			                    GBF_PROJECT_MODEL_COLUMN_DATA, &data,
+			                    -1);
+
+			if ((data != NULL) && (data->shortcut != NULL))
+			{
+				/* Select the corresponding node */
+				GtkTreeIter iter;
+
+				if (gbf_project_model_find_tree_data (GBF_PROJECT_MODEL (project_model), &iter, data->shortcut))
+				{
+					found = gtk_tree_model_filter_convert_child_iter_to_iter (
+							GTK_TREE_MODEL_FILTER (model), model_iter, &iter);
+				}
+			}
+		}
+
+		/* Try to select root node */
+		if (!found)
+		{
+
+			GtkTreePath *root_path;
+
+			root_path = gbf_project_model_get_project_root (GBF_PROJECT_MODEL (project_model));
+			if (root_path)
+			{
+				GtkTreePath *path;
+				path = gtk_tree_model_filter_convert_child_path_to_path (
+							GTK_TREE_MODEL_FILTER (model), root_path);
+				if (path)
+				{
+					found = gtk_tree_model_get_iter	(model, model_iter, path);
+					gtk_tree_path_free (path);
+				}
+				gtk_tree_path_free (root_path);
+			}
+		}
+
+		/* Take the first node */
+		if (!found)
+		{
+			found = gtk_tree_model_get_iter_first (model, model_iter);
+		}
+	}
+
+	return found;
+}
+
diff --git a/plugins/project-manager/project-view.h b/plugins/project-manager/project-view.h
index 6464767..c6ae745 100644
--- a/plugins/project-manager/project-view.h
+++ b/plugins/project-manager/project-view.h
@@ -113,6 +113,11 @@ GbfProjectModel *gbf_project_view_get_model (GbfProjectView *view);
 
 gboolean gbf_project_view_get_project_root (GbfProjectView *view, GtkTreeIter *iter);
 
+
+GtkCellLayout *pm_setup_project_renderer (GtkCellLayout *layout);
+
+gboolean pm_convert_project_iter_to_model_iter (GtkTreeModel *model, GtkTreeIter *model_iter, GtkTreeIter *project_iter);
+
 G_END_DECLS
 
 #endif /* _PROJECT_VIEW_H_ */



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