[anjuta] project-manager: Implement a project node chooser



commit 4aeabf77d2a9014f99c20a31cb425236ffece1c2
Author: SÃbastien Granjoux <seb sfo free fr>
Date:   Fri Jan 6 22:26:54 2012 +0100

    project-manager: Implement a project node chooser

 libanjuta/anjuta-glade.xml                |   12 +-
 plugins/project-manager/Makefile.am       |    2 +
 plugins/project-manager/dialogs.c         |   80 ++------
 plugins/project-manager/pm_dialogs.ui     |    2 +-
 plugins/project-manager/project-chooser.c |  354 +++++++++++++++++++++++++++++
 plugins/project-manager/project-chooser.h |   67 ++++++
 6 files changed, 450 insertions(+), 67 deletions(-)
---
diff --git a/libanjuta/anjuta-glade.xml b/libanjuta/anjuta-glade.xml
index b162935..c434b36 100644
--- a/libanjuta/anjuta-glade.xml
+++ b/libanjuta/anjuta-glade.xml
@@ -57,7 +57,7 @@
 		 <glade-widget-class name="AnjutaEnvironmentEditor" title="Environment editor"
 		 generic-name="environment_editor" />
 
-		 <glade-widget-class name="AnjutaTreeComboBox" title="Tree combo box"
+		<glade-widget-class name="AnjutaTreeComboBox" title="Tree combo box"
 		 generic-name="combo">
 			<properties>
 				<property id="glade-type" disabled="True"/>
@@ -66,6 +66,15 @@
 				<property id="stock" disabled="True"/>
 			</properties>
 		</glade-widget-class>
+		<glade-widget-class name="AnjutaPmChooserButton" title="Project node chooser"
+		 generic-name="button" parent="AnjutaTreeComboBox">
+			<properties>
+				<property id="glade-type" disabled="True"/>
+				<property id="label" disabled="True"/>
+				<property id="use-underline" disabled="True"/>
+				<property id="stock" disabled="True"/>
+			</properties>
+		</glade-widget-class>
 
 	</glade-widget-classes>
 
@@ -79,5 +88,6 @@
 		<glade-widget-class-ref name="AnjutaEntry" />
 		<glade-widget-class-ref name="AnjutaEnvironmentEditor" />
 		<glade-widget-class-ref name="AnjutaTreeComboBox" />
+		<glade-widget-class-ref name="AnjutaPmChooserButton" />
 	</glade-widget-group>
 </glade-catalog>
diff --git a/plugins/project-manager/Makefile.am b/plugins/project-manager/Makefile.am
index 9c29c19..3adb855 100644
--- a/plugins/project-manager/Makefile.am
+++ b/plugins/project-manager/Makefile.am
@@ -61,6 +61,8 @@ libanjuta_project_manager_la_SOURCES = \
 	project-model.c		\
 	project-view.h		\
 	project-view.c		\
+	project-chooser.c	\
+	project-chooser.h	\
 	project-util.h		\
 	project-util.c		\
 	project.h		\
diff --git a/plugins/project-manager/dialogs.c b/plugins/project-manager/dialogs.c
index 2a97e14..cf33d98 100644
--- a/plugins/project-manager/dialogs.c
+++ b/plugins/project-manager/dialogs.c
@@ -35,6 +35,7 @@
 #include <libanjuta/anjuta-utils.h>
 #include <libanjuta/anjuta-pkg-config-chooser.h>
 #include <libanjuta/anjuta-tree-combo.h>
+#include <libanjuta/interfaces/ianjuta-project-chooser.h>
 
 #define ICON_SIZE 16
 
@@ -250,47 +251,6 @@ 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;
@@ -566,18 +526,6 @@ add_label (const gchar *display_name, const gchar *value, GtkWidget *table, gint
 	*position = *position + 1;
 }
 
-static gboolean
-is_project_node_but_shortcut (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
-{
-	GbfTreeData *data;
-
-	gtk_tree_model_get (GTK_TREE_MODEL (model), iter,
-		    GBF_PROJECT_MODEL_COLUMN_DATA, &data,
-		    -1);
-
-	return (data != NULL) && (data->shortcut == NULL) && (gbf_tree_data_get_node (data) != NULL);
-}
-
 static void
 update_properties (PropertiesTable *table)
 {
@@ -842,6 +790,7 @@ pm_project_create_properties_dialog (AnjutaPmProject *project, GtkWindow *parent
 	GtkWidget *dialog = NULL;
 	GtkBuilder *bxml;
 	GtkWidget *node_combo;
+	GtkTreeIter iter;
 
 	g_return_val_if_fail (data != NULL, NULL);
 
@@ -864,13 +813,15 @@ pm_project_create_properties_dialog (AnjutaPmProject *project, GtkWindow *parent
 	g_object_unref (bxml);
 
 	/* 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);
-
+	ianjuta_project_chooser_set_project_model (IANJUTA_PROJECT_CHOOSER (node_combo),
+	                                           IANJUTA_PROJECT_MANAGER (table->project->plugin),
+	                                           ANJUTA_PROJECT_ROOT,
+	                                           NULL);
+	if (pm_convert_project_iter_to_model_iter (GTK_TREE_MODEL (anjuta_tree_combo_box_get_model (ANJUTA_TREE_COMBO_BOX (node_combo))),
+	                                           &iter, selected))
+	{
+		anjuta_tree_combo_box_set_active_iter (ANJUTA_TREE_COMBO_BOX (node_combo), &iter);
+	}
 	g_signal_connect (node_combo, "changed",
 					G_CALLBACK (on_node_changed),
 					table);
@@ -922,14 +873,13 @@ anjuta_pm_project_show_properties_dialog (ProjectManagerPlugin *plugin, GtkTreeI
 		{
 			selected = &iter;
 		}
-	}
+ 	}
 
 	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)
@@ -942,9 +892,9 @@ anjuta_pm_project_show_properties_dialog (ProjectManagerPlugin *plugin, GtkTreeI
 			*dialog_ptr = pm_project_create_properties_dialog (
 				plugin->project,
 				GTK_WINDOW (plugin->project->plugin->shell),
-			    plugin->view,
-			    data,
-				selected);
+		    	plugin->view,
+		    	data,
+			    selected);
 			if (*dialog_ptr != NULL)
 			{
 				g_object_add_weak_pointer (G_OBJECT (*dialog_ptr), (gpointer *)dialog_ptr);
diff --git a/plugins/project-manager/pm_dialogs.ui b/plugins/project-manager/pm_dialogs.ui
index 3210399..b1c4716 100644
--- a/plugins/project-manager/pm_dialogs.ui
+++ b/plugins/project-manager/pm_dialogs.ui
@@ -992,7 +992,7 @@
     <property name="border_width">6</property>
     <property name="spacing">12</property>
     <child>
-      <object class="AnjutaTreeComboBox" id="nodes_combo">
+      <object class="AnjutaPmChooserButton" id="nodes_combo">
         <property name="use_action_appearance">False</property>
         <property name="visible">True</property>
         <property name="can_focus">True</property>
diff --git a/plugins/project-manager/project-chooser.c b/plugins/project-manager/project-chooser.c
new file mode 100644
index 0000000..a76417a
--- /dev/null
+++ b/plugins/project-manager/project-chooser.c
@@ -0,0 +1,354 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4; coding: utf-8 -*- */
+
+/* project-chooser.c
+ *
+ * Copyright (C) 2012  SÃbastien Granjoux
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "project-chooser.h"
+
+#include <glib/gi18n.h>
+
+#include <libanjuta/interfaces/ianjuta-project-chooser.h>
+
+#include "project-model.h"
+#include "project-view.h"
+#include "tree-data.h"
+#include "plugin.h"
+
+
+/* Types
+ *---------------------------------------------------------------------------*/
+
+struct _AnjutaPmChooserButtonPrivate
+{
+	AnjutaProjectNodeType child;
+};
+
+static void ianjuta_project_chooser_init (IAnjutaProjectChooserIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (AnjutaPmChooserButton, anjuta_pm_chooser_button, ANJUTA_TYPE_TREE_COMBO_BOX,
+                         G_IMPLEMENT_INTERFACE (IANJUTA_TYPE_PROJECT_CHOOSER,
+                                                ianjuta_project_chooser_init))
+
+/* Helpers functions
+ *---------------------------------------------------------------------------*/
+
+
+/* Private functions
+ *---------------------------------------------------------------------------*/
+
+static void
+setup_nodes_combo_box (AnjutaPmChooserButton      *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);
+
+	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 (ANJUTA_TREE_COMBO_BOX (view), filter);
+		g_object_unref (filter);
+		if (pm_convert_project_iter_to_model_iter (filter, &iter, selected))
+		{
+			anjuta_tree_combo_box_set_active_iter (ANJUTA_TREE_COMBO_BOX (view), &iter);
+		}
+	}
+	else
+    {
+		anjuta_tree_combo_box_set_model (ANJUTA_TREE_COMBO_BOX (view), GTK_TREE_MODEL (model));
+		if (selected)
+		{
+			anjuta_tree_combo_box_set_active_iter (ANJUTA_TREE_COMBO_BOX (view), selected);
+		}
+	}
+}
+
+/* Callbacks functions
+ *---------------------------------------------------------------------------*/
+
+static gboolean
+is_project_node_but_shortcut (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
+{
+	GbfTreeData *data;
+
+	gtk_tree_model_get (GTK_TREE_MODEL (model), iter,
+		    GBF_PROJECT_MODEL_COLUMN_DATA, &data,
+		    -1);
+
+	return (data != NULL) && (data->shortcut == NULL) && (gbf_tree_data_get_node (data) != NULL);
+}
+
+static gboolean
+is_project_module_node (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
+{
+	GbfTreeData *data;
+
+	gtk_tree_model_get (GTK_TREE_MODEL (model), iter,
+		    GBF_PROJECT_MODEL_COLUMN_DATA, &data,
+		    -1);
+	if ((data != NULL) && (data->shortcut == NULL))
+	{
+		AnjutaProjectNode *node = gbf_tree_data_get_node (data);
+
+		if ((node != NULL) && ((anjuta_project_node_get_node_type (node) & ANJUTA_PROJECT_TYPE_MASK) == ANJUTA_PROJECT_MODULE))
+		{
+			return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
+static gboolean
+is_project_target_or_group_node (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
+{
+	GbfTreeData *data;
+
+	gtk_tree_model_get (GTK_TREE_MODEL (model), iter,
+		    GBF_PROJECT_MODEL_COLUMN_DATA, &data,
+		    -1);
+	if ((data != NULL) && (data->shortcut == NULL))
+	{
+		AnjutaProjectNode *node = gbf_tree_data_get_node (data);
+
+		if (node != NULL)
+		{
+			AnjutaProjectNodeType type = anjuta_project_node_get_node_type (node) & ANJUTA_PROJECT_TYPE_MASK;
+
+			return (type == ANJUTA_PROJECT_TARGET) || (type == ANJUTA_PROJECT_GROUP);
+		}
+	}
+
+	return FALSE;
+}
+
+static gboolean
+is_project_group_node (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
+{
+	GbfTreeData *data;
+
+	gtk_tree_model_get (GTK_TREE_MODEL (model), iter,
+		    GBF_PROJECT_MODEL_COLUMN_DATA, &data,
+		    -1);
+	if ((data != NULL) && (data->shortcut == NULL))
+	{
+		AnjutaProjectNode *node = gbf_tree_data_get_node (data);
+
+		if (node != NULL)
+		{
+			AnjutaProjectNodeType type = anjuta_project_node_get_node_type (node) & ANJUTA_PROJECT_TYPE_MASK;
+
+			return type == ANJUTA_PROJECT_GROUP;
+		}
+	}
+
+	return FALSE;
+}
+
+
+/* Public functions
+ *---------------------------------------------------------------------------*/
+
+GtkWidget *
+anjuta_pm_chooser_button_new (void)
+{
+	return g_object_new (ANJUTA_TYPE_PM_CHOOSER_BUTTON, NULL);
+}
+
+
+/* Implement IAnjutaProjectChooser interface
+ *---------------------------------------------------------------------------*/
+
+static gboolean
+anjuta_pm_chooser_set_project_model (IAnjutaProjectChooser *iface, IAnjutaProjectManager *manager, AnjutaProjectNodeType child_type, GError **error)
+{
+	GtkTreeIter selected;
+	gboolean found;
+	GtkTreeModelFilterVisibleFunc func;
+
+	ANJUTA_PM_CHOOSER_BUTTON (iface)->priv->child = child_type & ANJUTA_PROJECT_TYPE_MASK;
+
+	switch (child_type & ANJUTA_PROJECT_TYPE_MASK)
+	{
+	case ANJUTA_PROJECT_ROOT:
+		/* Display all nodes */
+		func = is_project_node_but_shortcut;
+		break;
+	case ANJUTA_PROJECT_MODULE:
+		/* Display all modules */
+		func = is_project_module_node;
+		break;
+	case ANJUTA_PROJECT_PACKAGE:
+		/* Display all targets */
+		func = is_project_target_or_group_node;
+		break;
+	case ANJUTA_PROJECT_SOURCE:
+		/* Display all targets */
+		func = is_project_target_or_group_node;
+		break;
+	case ANJUTA_PROJECT_TARGET:
+		/* Display all targets */
+		func = is_project_target_or_group_node;
+		break;
+	case ANJUTA_PROJECT_GROUP:
+		/* Display all groups */
+		func = is_project_group_node;
+		break;
+	default:
+		/* Invalid type */
+		return FALSE;
+	}
+
+	found = gbf_project_view_get_first_selected (ANJUTA_PLUGIN_PROJECT_MANAGER (manager)->view, &selected) != NULL;
+
+	/* Add combo node selection */
+	setup_nodes_combo_box (ANJUTA_PM_CHOOSER_BUTTON (iface),
+	                       gbf_project_view_get_model(ANJUTA_PLUGIN_PROJECT_MANAGER (manager)->view),
+	                       NULL,
+	                       func,
+	                       NULL,
+	                       found ? &selected : NULL);
+
+	return TRUE;
+}
+
+static GFile *
+anjuta_pm_chooser_get_selected (IAnjutaProjectChooser *iface, GError **error)
+{
+	GtkTreeIter iter;
+
+	if (anjuta_tree_combo_box_get_active_iter (ANJUTA_TREE_COMBO_BOX (iface), &iter))
+	{
+		GtkTreeModel *model;
+		GbfTreeData *data = NULL;
+
+		model = anjuta_tree_combo_box_get_model (ANJUTA_TREE_COMBO_BOX (iface));
+
+		gtk_tree_model_get (model, &iter, GBF_PROJECT_MODEL_COLUMN_DATA, &data, -1);
+		g_return_val_if_fail (data != NULL, NULL);
+
+		if (data->node != NULL)
+		{
+			AnjutaProjectNode *node = data->node;
+			gint valid;
+
+			switch (ANJUTA_PM_CHOOSER_BUTTON (iface)->priv->child)
+			{
+			case ANJUTA_PROJECT_ROOT:
+				/* Allow all nodes */
+				valid = -1;
+				break;
+			case ANJUTA_PROJECT_MODULE:
+			case ANJUTA_PROJECT_PACKAGE:
+				/* Only package parent */
+				valid = ANJUTA_PROJECT_CAN_ADD_PACKAGE;
+				break;
+			case ANJUTA_PROJECT_SOURCE:
+				/* Only package parent */
+				valid = ANJUTA_PROJECT_CAN_ADD_SOURCE;
+				break;
+			case ANJUTA_PROJECT_TARGET:
+				/* Only package parent */
+				valid = ANJUTA_PROJECT_CAN_ADD_TARGET;
+				break;
+			case ANJUTA_PROJECT_GROUP:
+				/* Only group parent */
+				valid = ANJUTA_PROJECT_CAN_ADD_GROUP;
+				break;
+			default:
+				valid = 0;
+				break;
+			}
+
+			if (anjuta_project_node_get_state (node) & valid)
+			{
+				return anjuta_project_node_get_file (data->node);
+			}
+		}
+	}
+
+	return NULL;
+}
+
+static void
+ianjuta_project_chooser_init (IAnjutaProjectChooserIface *iface)
+{
+	iface->set_project_model = anjuta_pm_chooser_set_project_model;
+	iface->get_selected = anjuta_pm_chooser_get_selected;
+}
+
+/* Implement GObject functions
+ *---------------------------------------------------------------------------*/
+
+static GObject *
+anjuta_pm_chooser_button_constructor (GType                  type,
+                                      guint                  n_construct_properties,
+                                      GObjectConstructParam *construct_properties)
+{
+	GObject *object;
+
+	object = G_OBJECT_CLASS (anjuta_pm_chooser_button_parent_class)->constructor
+		(type, n_construct_properties, construct_properties);
+
+	pm_setup_project_renderer (GTK_CELL_LAYOUT (object));
+
+	return object;
+}
+
+static void
+anjuta_pm_chooser_button_init (AnjutaPmChooserButton *button)
+{
+  	AnjutaPmChooserButtonPrivate *priv;
+
+	priv = G_TYPE_INSTANCE_GET_PRIVATE (button,
+	                                    ANJUTA_TYPE_PM_CHOOSER_BUTTON,
+	                                    AnjutaPmChooserButtonPrivate);
+	button->priv = priv;
+}
+
+static void
+anjuta_pm_chooser_button_class_init (AnjutaPmChooserButtonClass * klass)
+{
+	GObjectClass *object_class;
+
+	object_class = (GObjectClass *)klass;
+	object_class->constructor = anjuta_pm_chooser_button_constructor;
+
+	g_type_class_add_private (klass, sizeof (AnjutaPmChooserButtonPrivate));
+}
diff --git a/plugins/project-manager/project-chooser.h b/plugins/project-manager/project-chooser.h
new file mode 100644
index 0000000..c3d3657
--- /dev/null
+++ b/plugins/project-manager/project-chooser.h
@@ -0,0 +1,67 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4; coding: utf-8 -*- */
+
+/* project-chooser.h
+ *
+ * Copyright (C) 2011  SÃbastien Granjoux
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef _PM_CHOOSER_H_
+#define _PM_CHOOSER_H_
+
+#include <gtk/gtk.h>
+
+#include "libanjuta/anjuta-tree-combo.h"
+
+G_BEGIN_DECLS
+
+#define ANJUTA_TYPE_PM_CHOOSER_BUTTON            (anjuta_pm_chooser_button_get_type ())
+#define ANJUTA_PM_CHOOSER_BUTTON(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), ANJUTA_TYPE_PM_CHOOSER_BUTTON, AnjutaPmChooserButton))
+#define ANJUTA_PM_CHOOSER_BUTTON_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), ANJUTA_TYPE_PM_CHOOSER_BUTTON, AnjutaPmChooserButtonClass))
+#define ANJUTA_IS_PM_CHOOSER_BUTTON(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ANJUTA_TYPE_PM_CHOOSER_BUTTON))
+#define ANJUTA_IS_PM_CHOOSER_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ANJUTA_TYPE_PM_CHOOSER_BUTTON))
+#define ANJUTA_PM_CHOOSER_BUTTON_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), ANJUTA_TYPE_PM_CHOOSER_BUTTON, AnjutaPmChooserButtonClass))
+
+typedef struct _AnjutaPmChooserButton        AnjutaPmChooserButton;
+typedef struct _AnjutaPmChooserButtonPrivate AnjutaPmChooserButtonPrivate;
+typedef struct _AnjutaPmChooserButtonClass   AnjutaPmChooserButtonClass;
+
+struct _AnjutaPmChooserButton
+{
+  AnjutaTreeComboBox parent;
+
+  /*< private >*/
+  AnjutaPmChooserButtonPrivate *priv;
+};
+
+struct _AnjutaPmChooserButtonClass
+{
+  /*< private >*/
+  AnjutaTreeComboBoxClass parent_class;
+};
+
+
+GType			anjuta_pm_chooser_button_get_type (void) G_GNUC_CONST;
+
+
+GtkWidget *		anjuta_pm_chooser_button_new (void);
+
+
+G_END_DECLS
+
+#endif /* _ANJUTA_PM_CHOOSER_BUTTON_H_ */



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