Blame gladeui/glade-signal-model.c

Packit 1e8aac
/*
Packit 1e8aac
 * glade-signal-model.c
Packit 1e8aac
 * Copyright (C) Johannes Schmid 2010 <jhs@gnome.org>
Packit 1e8aac
 * 
Packit 1e8aac
 * This library is free software; you can redistribute it and/or modify it
Packit 1e8aac
 * under the terms of the GNU Lesser General Public License as
Packit 1e8aac
 * published by the Free Software Foundation; either version 2.1 of
Packit 1e8aac
 * the License, or (at your option) any later version.
Packit 1e8aac
 *
Packit 1e8aac
 * This library is distributed in the hope that it will be useful, but
Packit 1e8aac
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1e8aac
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 1e8aac
 * Lesser General Public License for more details.
Packit 1e8aac
 *
Packit 1e8aac
 * You should have received a copy of the GNU Lesser General Public 
Packit 1e8aac
 * License along with this program; if not, write to the Free Software
Packit 1e8aac
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 1e8aac
 */
Packit 1e8aac
#ifdef HAVE_CONFIG_H
Packit 1e8aac
#include <config.h>
Packit 1e8aac
#endif
Packit 1e8aac
Packit 1e8aac
#include "glade-signal-model.h"
Packit 1e8aac
#include "glade-project.h"
Packit 1e8aac
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
#include <string.h>
Packit 1e8aac
Packit 1e8aac
#define DETAIL_DEFAULT  _("<Type here>")
Packit 1e8aac
#define HANDLER_DEFAULT  _("<Type here>")
Packit 1e8aac
#define USERDATA_DEFAULT _("<Click here>")
Packit 1e8aac
Packit 1e8aac
struct _GladeSignalModelPrivate
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *widget;
Packit 1e8aac
  GList       *widgets; /* names of the widgets that this widgets derives from and that have signals */
Packit 1e8aac
  gint         stamp;
Packit 1e8aac
Packit 1e8aac
  GHashTable  *dummy_signals;
Packit 1e8aac
  GHashTable  *signals; /* signals of the widget */
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
enum
Packit 1e8aac
{
Packit 1e8aac
  PROP_0,
Packit 1e8aac
  PROP_WIDGET,
Packit 1e8aac
  PROP_SIGNALS
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
static void gtk_tree_model_iface_init (GtkTreeModelIface *iface);
Packit 1e8aac
static void gtk_tree_drag_source_iface_init (GtkTreeDragSourceIface *iface);
Packit 1e8aac
static void on_glade_signal_model_added (GladeWidget *widget, const GladeSignal *signal,
Packit 1e8aac
					 GladeSignalModel *model);
Packit 1e8aac
static void on_glade_signal_model_removed (GladeWidget *widget, const GladeSignal *signal,
Packit 1e8aac
					   GladeSignalModel *model);
Packit 1e8aac
static void on_glade_signal_model_changed (GladeWidget *widget, const GladeSignal *signal,
Packit 1e8aac
					   GladeSignalModel *model);	
Packit 1e8aac
static void on_glade_widget_support_changed (GladeWidget *widget, GladeSignalModel *model);
Packit 1e8aac
Packit 1e8aac
G_DEFINE_TYPE_WITH_CODE (GladeSignalModel, glade_signal_model, G_TYPE_OBJECT,
Packit 1e8aac
                         G_ADD_PRIVATE (GladeSignalModel)
Packit 1e8aac
                         G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
Packit 1e8aac
                                                gtk_tree_model_iface_init);
Packit 1e8aac
                         G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE,
Packit 1e8aac
                                                gtk_tree_drag_source_iface_init))
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_signal_model_init (GladeSignalModel *object)
Packit 1e8aac
{
Packit 1e8aac
  object->priv = glade_signal_model_get_instance_private (object);
Packit 1e8aac
Packit 1e8aac
  object->priv->dummy_signals = 
Packit 1e8aac
    g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) g_object_unref);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_signal_model_create_widget_list (GladeSignalModel *sig_model)
Packit 1e8aac
{
Packit 1e8aac
  const GList *list;
Packit 1e8aac
  GladeWidget *widget = sig_model->priv->widget;
Packit 1e8aac
  GladeWidgetAdaptor *adaptor = glade_widget_get_adaptor (widget);
Packit 1e8aac
Packit 1e8aac
  for (list = glade_widget_adaptor_get_signals (adaptor);
Packit 1e8aac
       list != NULL; list = g_list_next (list))
Packit 1e8aac
    {
Packit 1e8aac
      GladeSignalClass *signal = (GladeSignalClass *) list->data;
Packit 1e8aac
Packit 1e8aac
      if (!g_list_find_custom (sig_model->priv->widgets, 
Packit 1e8aac
			       (gpointer) glade_signal_class_get_type (signal), (GCompareFunc) strcmp))
Packit 1e8aac
	{
Packit 1e8aac
	  sig_model->priv->widgets = 
Packit 1e8aac
	    g_list_prepend (sig_model->priv->widgets, (gpointer) glade_signal_class_get_type (signal));
Packit 1e8aac
	}
Packit 1e8aac
    }
Packit 1e8aac
  sig_model->priv->widgets = g_list_reverse (sig_model->priv->widgets);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_signal_model_finalize (GObject *object)
Packit 1e8aac
{
Packit 1e8aac
  GladeSignalModel *sig_model = GLADE_SIGNAL_MODEL (object);
Packit 1e8aac
Packit 1e8aac
  g_list_free (sig_model->priv->widgets);
Packit 1e8aac
  g_hash_table_destroy (sig_model->priv->dummy_signals);
Packit 1e8aac
  G_OBJECT_CLASS (glade_signal_model_parent_class)->finalize (object);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_signal_model_set_property (GObject *object,
Packit 1e8aac
                                 guint prop_id,
Packit 1e8aac
                                 const GValue *value,
Packit 1e8aac
                                 GParamSpec *pspec)
Packit 1e8aac
{
Packit 1e8aac
  GladeSignalModel *sig_model;
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_SIGNAL_MODEL (object));
Packit 1e8aac
Packit 1e8aac
  sig_model = GLADE_SIGNAL_MODEL (object);
Packit 1e8aac
Packit 1e8aac
  switch (prop_id)
Packit 1e8aac
    {
Packit 1e8aac
      case PROP_WIDGET:
Packit 1e8aac
        sig_model->priv->widget = g_value_get_object (value);
Packit 1e8aac
        glade_signal_model_create_widget_list (sig_model);
Packit 1e8aac
        g_signal_connect (sig_model->priv->widget, "add-signal-handler",
Packit 1e8aac
                          G_CALLBACK (on_glade_signal_model_added), sig_model);
Packit 1e8aac
        g_signal_connect (sig_model->priv->widget, "remove-signal-handler",
Packit 1e8aac
                          G_CALLBACK (on_glade_signal_model_removed), sig_model);
Packit 1e8aac
        g_signal_connect (sig_model->priv->widget, "change-signal-handler",
Packit 1e8aac
                          G_CALLBACK (on_glade_signal_model_changed), sig_model);
Packit 1e8aac
        g_signal_connect (sig_model->priv->widget, "support-changed",
Packit 1e8aac
                          G_CALLBACK (on_glade_widget_support_changed), sig_model);
Packit 1e8aac
      break;
Packit 1e8aac
      case PROP_SIGNALS:
Packit 1e8aac
        sig_model->priv->signals = g_value_get_pointer (value);
Packit 1e8aac
      break;
Packit 1e8aac
      default:
Packit 1e8aac
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 1e8aac
      break;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_signal_model_get_property (GObject *object,
Packit 1e8aac
                                 guint prop_id,
Packit 1e8aac
                                 GValue *value,
Packit 1e8aac
                                 GParamSpec *pspec)
Packit 1e8aac
{
Packit 1e8aac
  GladeSignalModel *sig_model;
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_SIGNAL_MODEL (object));
Packit 1e8aac
Packit 1e8aac
  sig_model = GLADE_SIGNAL_MODEL (object);
Packit 1e8aac
Packit 1e8aac
  switch (prop_id)
Packit 1e8aac
    {
Packit 1e8aac
      case PROP_WIDGET:
Packit 1e8aac
        g_value_set_object (value, sig_model->priv->widget);
Packit 1e8aac
      break;
Packit 1e8aac
      case PROP_SIGNALS:
Packit 1e8aac
        g_value_set_pointer (value, sig_model->priv->signals);
Packit 1e8aac
      break;
Packit 1e8aac
      default:
Packit 1e8aac
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 1e8aac
      break;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_signal_model_class_init (GladeSignalModelClass *klass)
Packit 1e8aac
{
Packit 1e8aac
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit 1e8aac
Packit 1e8aac
  object_class->finalize = glade_signal_model_finalize;
Packit 1e8aac
  object_class->set_property = glade_signal_model_set_property;
Packit 1e8aac
  object_class->get_property = glade_signal_model_get_property;
Packit 1e8aac
Packit 1e8aac
  g_object_class_install_property (object_class,
Packit 1e8aac
				   PROP_WIDGET,
Packit 1e8aac
				   g_param_spec_object ("widget",
Packit 1e8aac
							"A GladeWidget",
Packit 1e8aac
							"The GladeWidget used to query the signals",
Packit 1e8aac
							GLADE_TYPE_WIDGET,
Packit 1e8aac
							G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
Packit 1e8aac
  g_object_class_install_property (object_class,
Packit 1e8aac
				   PROP_SIGNALS,
Packit 1e8aac
				   g_param_spec_pointer ("signals",
Packit 1e8aac
							 "A GHashTable containing the widget signals",
Packit 1e8aac
							 "Use to query signals",
Packit 1e8aac
							 G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/*
Packit 1e8aac
 * glade_signal_model_new:
Packit 1e8aac
 * @widget: The GladeWidget the signals belong to
Packit 1e8aac
 * @signals: The signals of the #GladeWidget
Packit 1e8aac
 *
Packit 1e8aac
 * Creates a new GladeSignalModel object to show and edit the
Packit 1e8aac
 * signals of a widgets in a GtkTreeView
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
GtkTreeModel *
Packit 1e8aac
glade_signal_model_new (GladeWidget *widget, GHashTable *signals)
Packit 1e8aac
{
Packit 1e8aac
  GObject *object = g_object_new (GLADE_TYPE_SIGNAL_MODEL,
Packit 1e8aac
				  "widget", widget, 
Packit 1e8aac
				  "signals", signals, NULL);
Packit 1e8aac
  return GTK_TREE_MODEL (object);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GtkTreeModelFlags
Packit 1e8aac
glade_signal_model_get_flags (GtkTreeModel *model)
Packit 1e8aac
{
Packit 1e8aac
  return 0;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gint
Packit 1e8aac
glade_signal_model_get_n_columns (GtkTreeModel *model)
Packit 1e8aac
{
Packit 1e8aac
  return GLADE_SIGNAL_N_COLUMNS;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GType
Packit 1e8aac
glade_signal_model_get_column_type (GtkTreeModel *model, gint column)
Packit 1e8aac
{
Packit 1e8aac
  switch (column)
Packit 1e8aac
    {
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_NAME:
Packit 1e8aac
        return G_TYPE_STRING;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_SHOW_NAME:
Packit 1e8aac
        return G_TYPE_BOOLEAN;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_HANDLER:
Packit 1e8aac
        return G_TYPE_STRING;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_OBJECT:
Packit 1e8aac
        return G_TYPE_STRING;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_SWAP:
Packit 1e8aac
        return G_TYPE_BOOLEAN;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_AFTER:
Packit 1e8aac
        return G_TYPE_BOOLEAN;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_TOOLTIP:
Packit 1e8aac
        return G_TYPE_STRING;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_SIGNAL:
Packit 1e8aac
        return G_TYPE_OBJECT;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_DETAIL:
Packit 1e8aac
        return G_TYPE_STRING;
Packit 1e8aac
      default:
Packit 1e8aac
        g_assert_not_reached();
Packit 1e8aac
        return G_TYPE_NONE;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
enum
Packit 1e8aac
{
Packit 1e8aac
  ITER_WIDGET = 0,
Packit 1e8aac
  ITER_SIGNAL = 1,
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
static inline gboolean
Packit 1e8aac
glade_signal_model_is_dummy_handler (GladeSignalModel *model,
Packit 1e8aac
                                     GladeSignal *signal)
Packit 1e8aac
{
Packit 1e8aac
  return glade_signal_get_handler (signal) == NULL;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GladeSignal *
Packit 1e8aac
glade_signal_model_get_dummy_handler (GladeSignalModel *model, 
Packit 1e8aac
                                      const GladeSignalClass *sig_class)
Packit 1e8aac
{
Packit 1e8aac
  GladeSignal *signal;
Packit 1e8aac
Packit 1e8aac
  signal = g_hash_table_lookup (model->priv->dummy_signals, 
Packit 1e8aac
				glade_signal_class_get_name (sig_class));
Packit 1e8aac
Packit 1e8aac
  if (!signal)
Packit 1e8aac
    {
Packit 1e8aac
      signal = glade_signal_new (sig_class,
Packit 1e8aac
				 NULL,
Packit 1e8aac
				 NULL,
Packit 1e8aac
				 FALSE,
Packit 1e8aac
				 FALSE);
Packit 1e8aac
      g_hash_table_insert (model->priv->dummy_signals, 
Packit 1e8aac
			   (gpointer) glade_signal_class_get_name (sig_class), 
Packit 1e8aac
			   signal);
Packit 1e8aac
Packit 1e8aac
      glade_project_verify_signal (model->priv->widget, signal);
Packit 1e8aac
    }
Packit 1e8aac
  return signal;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_signal_model_create_widget_iter (GladeSignalModel *sig_model,
Packit 1e8aac
                                       const gchar *widget,
Packit 1e8aac
                                       GtkTreeIter *iter)
Packit 1e8aac
{
Packit 1e8aac
  iter->stamp = sig_model->priv->stamp;
Packit 1e8aac
  iter->user_data = (gpointer) widget;
Packit 1e8aac
  iter->user_data2 = NULL;
Packit 1e8aac
  iter->user_data3 = NULL;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_signal_model_create_signal_iter (GladeSignalModel *sig_model,
Packit 1e8aac
                                       const gchar *widget,
Packit 1e8aac
                                       const GladeSignal *signal,
Packit 1e8aac
                                       GtkTreeIter *iter)
Packit 1e8aac
{
Packit 1e8aac
	glade_signal_model_create_widget_iter (sig_model, widget, iter);
Packit 1e8aac
	iter->user_data2 = GLADE_SIGNAL (signal);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GList *
Packit 1e8aac
glade_signal_model_create_signal_list (GladeSignalModel *sig_model,
Packit 1e8aac
				       const gchar *widget_type)
Packit 1e8aac
{
Packit 1e8aac
  GList *widget_signals = NULL;
Packit 1e8aac
  const GList *signals;
Packit 1e8aac
  GladeWidget *widget = sig_model->priv->widget;
Packit 1e8aac
  GladeWidgetAdaptor *adaptor = glade_widget_get_adaptor (widget);
Packit 1e8aac
Packit 1e8aac
  for (signals = glade_widget_adaptor_get_signals (adaptor);
Packit 1e8aac
       signals != NULL;
Packit 1e8aac
       signals = g_list_next (signals))
Packit 1e8aac
    {
Packit 1e8aac
      GladeSignalClass *sig_class = signals->data;
Packit 1e8aac
      if (g_str_equal (glade_signal_class_get_type (sig_class), widget_type))
Packit 1e8aac
	{
Packit 1e8aac
	  widget_signals = g_list_append (widget_signals, sig_class);
Packit 1e8aac
	}
Packit 1e8aac
    }
Packit 1e8aac
  return widget_signals;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
on_glade_signal_model_added (GladeWidget *widget,
Packit 1e8aac
                             const GladeSignal *signal,
Packit 1e8aac
                             GladeSignalModel* model)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeIter iter;	
Packit 1e8aac
  GtkTreePath *path;
Packit 1e8aac
  const GladeSignalClass *sig_class = glade_signal_get_class (signal);
Packit 1e8aac
Packit 1e8aac
  glade_signal_model_create_signal_iter (model,
Packit 1e8aac
					 glade_signal_class_get_type (sig_class),
Packit 1e8aac
					 signal, 
Packit 1e8aac
					 &iter);
Packit 1e8aac
  path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_model_row_inserted (GTK_TREE_MODEL (model), path, &iter);
Packit 1e8aac
  gtk_tree_path_free (path);
Packit 1e8aac
  model->priv->stamp++;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
on_glade_signal_model_removed (GladeWidget *widget,
Packit 1e8aac
                               const GladeSignal *signal,
Packit 1e8aac
                               GladeSignalModel *model)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  GtkTreePath *path;
Packit 1e8aac
  const GladeSignalClass *sig_class = glade_signal_get_class (signal);
Packit 1e8aac
  
Packit 1e8aac
  glade_signal_model_create_signal_iter (model,
Packit 1e8aac
					 glade_signal_class_get_type (sig_class),
Packit 1e8aac
					 signal, 
Packit 1e8aac
					 &iter);
Packit 1e8aac
  path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
Packit 1e8aac
  gtk_tree_model_row_deleted (GTK_TREE_MODEL (model), path);
Packit 1e8aac
  gtk_tree_path_free (path);
Packit 1e8aac
  model->priv->stamp++;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
on_glade_signal_model_changed (GladeWidget *widget,
Packit 1e8aac
                               const GladeSignal *signal,
Packit 1e8aac
                               GladeSignalModel *model)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  GtkTreePath *path;
Packit 1e8aac
  const GladeSignalClass *sig_class = glade_signal_get_class (signal);
Packit 1e8aac
  
Packit 1e8aac
  glade_signal_model_create_signal_iter (model,
Packit 1e8aac
					 glade_signal_class_get_type (sig_class),
Packit 1e8aac
					 signal, 
Packit 1e8aac
					 &iter);
Packit 1e8aac
  path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
Packit 1e8aac
  gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, &iter);
Packit 1e8aac
  gtk_tree_path_free (path);
Packit 1e8aac
  model->priv->stamp++;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
verify_dummies (const gchar *signal_name,
Packit 1e8aac
                GladeSignal *signal,
Packit 1e8aac
                GladeSignalModel *model)
Packit 1e8aac
{
Packit 1e8aac
  glade_project_verify_signal (model->priv->widget, signal);
Packit 1e8aac
Packit 1e8aac
  on_glade_signal_model_changed (model->priv->widget, signal, model);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
emit_changed (const gchar *signal_name,
Packit 1e8aac
	      GPtrArray *signals,
Packit 1e8aac
	      GladeSignalModel *model)
Packit 1e8aac
{
Packit 1e8aac
  gint i;
Packit 1e8aac
  GladeSignal *signal;
Packit 1e8aac
Packit 1e8aac
  for (i = 0; i < signals->len; i++)
Packit 1e8aac
    {
Packit 1e8aac
      signal = (GladeSignal *)signals->pdata[i];
Packit 1e8aac
      on_glade_signal_model_changed (model->priv->widget, signal, model);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
on_glade_widget_support_changed (GladeWidget *widget, GladeSignalModel *model)
Packit 1e8aac
{
Packit 1e8aac
  /* Update support warning on dummy signals */
Packit 1e8aac
  g_hash_table_foreach (model->priv->dummy_signals, (GHFunc)verify_dummies, model);
Packit 1e8aac
Packit 1e8aac
  /* row changed on every row */
Packit 1e8aac
  g_hash_table_foreach (model->priv->signals, (GHFunc)emit_changed, model);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_signal_model_get_iter (GtkTreeModel *model,
Packit 1e8aac
                             GtkTreeIter *iter,
Packit 1e8aac
                             GtkTreePath *path)
Packit 1e8aac
{
Packit 1e8aac
  gint *indices;
Packit 1e8aac
  gint depth;
Packit 1e8aac
  GladeSignalModel *sig_model;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (path != NULL, FALSE);
Packit 1e8aac
  g_return_val_if_fail (iter != NULL, FALSE);
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL_MODEL(model), FALSE);
Packit 1e8aac
Packit 1e8aac
  indices = gtk_tree_path_get_indices(path);
Packit 1e8aac
  depth = gtk_tree_path_get_depth (path);
Packit 1e8aac
  sig_model = GLADE_SIGNAL_MODEL (model);
Packit 1e8aac
Packit 1e8aac
  switch (depth)
Packit 1e8aac
    {
Packit 1e8aac
      case 1:
Packit 1e8aac
        /* Widget */
Packit 1e8aac
        {
Packit 1e8aac
          glade_signal_model_create_widget_iter (sig_model,
Packit 1e8aac
                                                 g_list_nth_data (sig_model->priv->widgets,
Packit 1e8aac
                                                                  indices[ITER_WIDGET]),
Packit 1e8aac
                                                 iter);
Packit 1e8aac
          return TRUE;
Packit 1e8aac
        }
Packit 1e8aac
      case 2:
Packit 1e8aac
        /* Signal */
Packit 1e8aac
        {
Packit 1e8aac
          gboolean retval;
Packit 1e8aac
          GtkTreePath *path =
Packit 1e8aac
            gtk_tree_path_new_from_indices (indices[ITER_WIDGET], -1);
Packit 1e8aac
          GtkTreeIter widget_iter;
Packit 1e8aac
Packit 1e8aac
          gtk_tree_model_get_iter (model, &widget_iter, path);
Packit 1e8aac
          retval = gtk_tree_model_iter_nth_child (model,
Packit 1e8aac
                                                  iter,
Packit 1e8aac
                                                  &widget_iter,
Packit 1e8aac
                                                  indices[ITER_SIGNAL]);
Packit 1e8aac
          gtk_tree_path_free (path);
Packit 1e8aac
          return retval;
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GtkTreePath*
Packit 1e8aac
glade_signal_model_get_path (GtkTreeModel *model, GtkTreeIter *iter)
Packit 1e8aac
{
Packit 1e8aac
  const gchar *widget;
Packit 1e8aac
  GladeSignal *handler;
Packit 1e8aac
  GladeSignalModel *sig_model;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (iter != NULL, NULL);
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL_MODEL(model), NULL);
Packit 1e8aac
Packit 1e8aac
  widget = iter->user_data;
Packit 1e8aac
  handler = iter->user_data2;
Packit 1e8aac
  sig_model = GLADE_SIGNAL_MODEL (model);
Packit 1e8aac
Packit 1e8aac
  if (handler)
Packit 1e8aac
    {
Packit 1e8aac
      /* Signal */
Packit 1e8aac
      const GladeSignalClass *sig_class = glade_signal_get_class (handler);
Packit 1e8aac
      gint index0, index1 = 0;
Packit 1e8aac
      GList *signal;
Packit 1e8aac
      GList *signals = glade_signal_model_create_signal_list (sig_model,
Packit 1e8aac
							      widget);
Packit 1e8aac
Packit 1e8aac
      index0 = g_list_index (sig_model->priv->widgets,
Packit 1e8aac
			     widget);
Packit 1e8aac
Packit 1e8aac
      for (signal = signals; signal != NULL; signal = g_list_next (signal))
Packit 1e8aac
	{		
Packit 1e8aac
	  GPtrArray *handlers = g_hash_table_lookup (sig_model->priv->signals,
Packit 1e8aac
						     glade_signal_class_get_name (signal->data));
Packit 1e8aac
Packit 1e8aac
	  if (signal->data != sig_class)
Packit 1e8aac
	    {
Packit 1e8aac
	      if (handlers) 
Packit 1e8aac
                index1 += handlers->len;
Packit 1e8aac
	      index1++; /* dummy_handler */
Packit 1e8aac
	    }
Packit 1e8aac
	  else
Packit 1e8aac
	    {
Packit 1e8aac
	      if (handlers)
Packit 1e8aac
		{
Packit 1e8aac
		  guint handler_index;
Packit 1e8aac
		  if (g_ptr_array_find (handlers, handler, &handler_index))
Packit 1e8aac
		    index1 += handler_index;
Packit 1e8aac
		  else
Packit 1e8aac
		    index1 += handlers->len;
Packit 1e8aac
		}
Packit 1e8aac
	      break;
Packit 1e8aac
	    }
Packit 1e8aac
	}
Packit 1e8aac
      return gtk_tree_path_new_from_indices (index0, index1, -1);
Packit 1e8aac
    }
Packit 1e8aac
  else if (widget)
Packit 1e8aac
    {
Packit 1e8aac
      /* Widget */
Packit 1e8aac
      return gtk_tree_path_new_from_indices (g_list_index (sig_model->priv->widgets,
Packit 1e8aac
							   widget), -1);
Packit 1e8aac
    }
Packit 1e8aac
  g_assert_not_reached();
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_signal_model_get_value (GtkTreeModel *model,
Packit 1e8aac
                              GtkTreeIter *iter,
Packit 1e8aac
                              gint column,
Packit 1e8aac
                              GValue *value)
Packit 1e8aac
{	
Packit 1e8aac
  const gchar *widget;
Packit 1e8aac
  GladeSignal *signal;
Packit 1e8aac
  GladeSignalModel *sig_model;
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (iter != NULL);
Packit 1e8aac
  g_return_if_fail (GLADE_IS_SIGNAL_MODEL(model));
Packit 1e8aac
Packit 1e8aac
  widget = iter->user_data;
Packit 1e8aac
  signal = iter->user_data2;
Packit 1e8aac
  sig_model = GLADE_SIGNAL_MODEL (model);
Packit 1e8aac
Packit 1e8aac
  value = g_value_init (value, 
Packit 1e8aac
			glade_signal_model_get_column_type (model, column));
Packit 1e8aac
Packit 1e8aac
  switch (column)
Packit 1e8aac
    {
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_NAME:
Packit 1e8aac
        if (signal)
Packit 1e8aac
        {
Packit 1e8aac
          g_value_set_static_string (value, glade_signal_get_name (signal));
Packit 1e8aac
          break;
Packit 1e8aac
        }
Packit 1e8aac
        else
Packit 1e8aac
          g_value_set_static_string (value, widget);
Packit 1e8aac
      break;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_SHOW_NAME:
Packit 1e8aac
        if (signal)
Packit 1e8aac
        {
Packit 1e8aac
          GPtrArray *handlers = g_hash_table_lookup (sig_model->priv->signals,
Packit 1e8aac
                                                     glade_signal_get_name (signal));
Packit 1e8aac
          guint index;
Packit 1e8aac
          if (!handlers || !handlers->len || (g_ptr_array_find (handlers, signal, &index) && index == 0))
Packit 1e8aac
            g_value_set_boolean (value, TRUE);
Packit 1e8aac
          else
Packit 1e8aac
            g_value_set_boolean (value, FALSE);
Packit 1e8aac
          break;
Packit 1e8aac
        }
Packit 1e8aac
        else if (widget)
Packit 1e8aac
          g_value_set_boolean (value, TRUE);
Packit 1e8aac
      break;	
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_HANDLER:
Packit 1e8aac
        if (signal)
Packit 1e8aac
          {
Packit 1e8aac
            const gchar *handler = glade_signal_get_handler (signal);
Packit 1e8aac
            g_value_set_static_string (value, handler ? handler : HANDLER_DEFAULT);
Packit 1e8aac
          }
Packit 1e8aac
        else 
Packit 1e8aac
          g_value_set_static_string (value, "");
Packit 1e8aac
      break;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_OBJECT:
Packit 1e8aac
        if (signal)
Packit 1e8aac
        {
Packit 1e8aac
          const gchar *userdata = glade_signal_get_userdata (signal);
Packit 1e8aac
          if (userdata && strlen (userdata))
Packit 1e8aac
            g_value_set_static_string (value, userdata);
Packit 1e8aac
          else
Packit 1e8aac
            g_value_set_static_string (value, USERDATA_DEFAULT);
Packit 1e8aac
          break;
Packit 1e8aac
        }
Packit 1e8aac
        else 
Packit 1e8aac
          g_value_set_static_string (value, "");
Packit 1e8aac
      break;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_SWAP:
Packit 1e8aac
        if (signal)
Packit 1e8aac
          g_value_set_boolean (value, glade_signal_get_swapped (signal));
Packit 1e8aac
        else 
Packit 1e8aac
          g_value_set_boolean (value, FALSE);
Packit 1e8aac
      break;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_AFTER:
Packit 1e8aac
        if (signal)
Packit 1e8aac
          g_value_set_boolean (value, glade_signal_get_after (signal));
Packit 1e8aac
        else 
Packit 1e8aac
          g_value_set_boolean (value, FALSE);
Packit 1e8aac
        break;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_TOOLTIP:
Packit 1e8aac
        if (signal)
Packit 1e8aac
          g_value_set_string (value, glade_signal_get_support_warning (signal));
Packit 1e8aac
        else
Packit 1e8aac
          g_value_set_static_string (value, NULL);
Packit 1e8aac
      break;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_SIGNAL:
Packit 1e8aac
        g_value_set_object (value, signal);
Packit 1e8aac
      break;
Packit 1e8aac
      case GLADE_SIGNAL_COLUMN_DETAIL:
Packit 1e8aac
        if (signal)
Packit 1e8aac
          {
Packit 1e8aac
            const gchar *detail = glade_signal_get_detail (signal);
Packit 1e8aac
            g_value_set_static_string (value, detail ? detail : DETAIL_DEFAULT);
Packit 1e8aac
          }
Packit 1e8aac
        else 
Packit 1e8aac
          g_value_set_static_string (value, "");
Packit 1e8aac
      break;
Packit 1e8aac
      default:
Packit 1e8aac
        g_assert_not_reached();
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_signal_model_iter_next_signal (GladeSignalModel *sig_model,
Packit 1e8aac
                                     const gchar *widget,
Packit 1e8aac
                                     GtkTreeIter *iter,
Packit 1e8aac
                                     GList *signal)
Packit 1e8aac
{
Packit 1e8aac
  if (signal->next)
Packit 1e8aac
    {
Packit 1e8aac
      signal = signal->next;
Packit 1e8aac
      GladeSignal *next_handler;
Packit 1e8aac
      GPtrArray *next_handlers = 
Packit 1e8aac
	g_hash_table_lookup (sig_model->priv->signals,
Packit 1e8aac
			     glade_signal_class_get_name (signal->data));
Packit 1e8aac
      if (next_handlers && next_handlers->len)
Packit 1e8aac
	{
Packit 1e8aac
	  next_handler = g_ptr_array_index (next_handlers, 0);
Packit 1e8aac
	}
Packit 1e8aac
      else
Packit 1e8aac
	{
Packit 1e8aac
	  next_handler = 
Packit 1e8aac
	    glade_signal_model_get_dummy_handler (sig_model,
Packit 1e8aac
						  signal->data);
Packit 1e8aac
	}
Packit 1e8aac
      glade_signal_model_create_signal_iter (sig_model, widget,
Packit 1e8aac
					     next_handler,
Packit 1e8aac
					     iter);
Packit 1e8aac
      g_list_free (signal);
Packit 1e8aac
      return TRUE;
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      g_list_free (signal);
Packit 1e8aac
      return FALSE;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_signal_model_iter_next (GtkTreeModel *model, GtkTreeIter *iter)
Packit 1e8aac
{
Packit 1e8aac
  const gchar *widget;
Packit 1e8aac
  GladeSignal *handler;
Packit 1e8aac
  GtkTreeIter parent;
Packit 1e8aac
  GladeSignalModel *sig_model;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (iter != NULL, FALSE);
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL_MODEL(model), FALSE);
Packit 1e8aac
Packit 1e8aac
  widget = iter->user_data;
Packit 1e8aac
  handler = iter->user_data2;
Packit 1e8aac
Packit 1e8aac
  sig_model = GLADE_SIGNAL_MODEL (model);  
Packit 1e8aac
Packit 1e8aac
  gtk_tree_model_iter_parent (model, &parent, iter);		
Packit 1e8aac
Packit 1e8aac
  if (handler)
Packit 1e8aac
    {
Packit 1e8aac
      const GladeSignalClass *sig_class = glade_signal_get_class (handler);
Packit 1e8aac
      GList *signals = 
Packit 1e8aac
	glade_signal_model_create_signal_list (sig_model,
Packit 1e8aac
					       widget);
Packit 1e8aac
      GList* signal = g_list_find (signals, sig_class);
Packit 1e8aac
      GPtrArray* handlers = g_hash_table_lookup (sig_model->priv->signals,
Packit 1e8aac
						 glade_signal_class_get_name (sig_class));
Packit 1e8aac
      if (glade_signal_model_is_dummy_handler (sig_model, handler))
Packit 1e8aac
	{
Packit 1e8aac
	  return glade_signal_model_iter_next_signal (sig_model, widget, iter, signal);
Packit 1e8aac
	}
Packit 1e8aac
      else if (handlers)
Packit 1e8aac
	{
Packit 1e8aac
	  guint new_index = 0;
Packit 1e8aac
	  if (g_ptr_array_find (handlers, handler, &new_index))
Packit 1e8aac
	    new_index++;
Packit 1e8aac
Packit 1e8aac
	  if (new_index < handlers->len)
Packit 1e8aac
	    {
Packit 1e8aac
	      glade_signal_model_create_signal_iter (sig_model, widget,
Packit 1e8aac
						     g_ptr_array_index (handlers, new_index),
Packit 1e8aac
						     iter);
Packit 1e8aac
	      g_list_free (signals);
Packit 1e8aac
	      return TRUE;
Packit 1e8aac
	    }
Packit 1e8aac
	  else if (new_index == handlers->len)
Packit 1e8aac
	    {
Packit 1e8aac
	      glade_signal_model_create_signal_iter (sig_model, widget,
Packit 1e8aac
						     glade_signal_model_get_dummy_handler (sig_model,
Packit 1e8aac
											   sig_class),
Packit 1e8aac
						     iter);
Packit 1e8aac
	      g_list_free (signals);
Packit 1e8aac
	      return TRUE;
Packit 1e8aac
	    }
Packit 1e8aac
	  else
Packit 1e8aac
	    {
Packit 1e8aac
	      return glade_signal_model_iter_next_signal (sig_model, widget, iter, signal);
Packit 1e8aac
	    }
Packit 1e8aac
	}
Packit 1e8aac
      else
Packit 1e8aac
	{
Packit 1e8aac
	  g_list_free (signals);
Packit 1e8aac
	  return FALSE;
Packit 1e8aac
	}
Packit 1e8aac
    }
Packit 1e8aac
  else if (widget)
Packit 1e8aac
    {
Packit 1e8aac
      gint new_index = g_list_index (sig_model->priv->widgets, widget) + 1;
Packit 1e8aac
      
Packit 1e8aac
      return gtk_tree_model_iter_nth_child (model, iter, NULL, new_index);
Packit 1e8aac
    }
Packit 1e8aac
  iter->user_data = NULL;
Packit 1e8aac
  iter->user_data2 = NULL;
Packit 1e8aac
  iter->user_data3 = NULL;
Packit 1e8aac
  iter->stamp = 0;
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gint
Packit 1e8aac
glade_signal_model_iter_n_children (GtkTreeModel *model, GtkTreeIter *iter)
Packit 1e8aac
{
Packit 1e8aac
  GladeSignal *handler;
Packit 1e8aac
  GladeSignalModel *sig_model;
Packit 1e8aac
  const gchar *widget;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL_MODEL(model), 0);
Packit 1e8aac
Packit 1e8aac
  /* FIXME: return the number of toplevels, if it makes sense in this context */
Packit 1e8aac
  if (iter == NULL) return 0;
Packit 1e8aac
  
Packit 1e8aac
  handler = iter->user_data2;
Packit 1e8aac
  sig_model = GLADE_SIGNAL_MODEL (model);
Packit 1e8aac
  widget = iter->user_data;
Packit 1e8aac
Packit 1e8aac
  if (handler)
Packit 1e8aac
    {
Packit 1e8aac
      return 0;
Packit 1e8aac
    }
Packit 1e8aac
  else if (widget)
Packit 1e8aac
    {
Packit 1e8aac
      GList *signals = glade_signal_model_create_signal_list (sig_model,
Packit 1e8aac
							      widget);
Packit 1e8aac
      GList *signal;
Packit 1e8aac
      gint retval = 0;
Packit 1e8aac
Packit 1e8aac
      for (signal = signals; signal != NULL; signal = g_list_next (signal))
Packit 1e8aac
	{
Packit 1e8aac
	  GPtrArray* handlers = g_hash_table_lookup (sig_model->priv->signals,
Packit 1e8aac
						     glade_signal_class_get_name (signal->data));
Packit 1e8aac
	  if (handlers)
Packit 1e8aac
	    retval += handlers->len;
Packit 1e8aac
	  retval++; 
Packit 1e8aac
	}
Packit 1e8aac
      g_list_free (signals);
Packit 1e8aac
      
Packit 1e8aac
      return retval;
Packit 1e8aac
    }
Packit 1e8aac
  g_assert_not_reached ();	
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_signal_model_iter_has_child (GtkTreeModel *model, GtkTreeIter *iter)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (iter != NULL, FALSE);
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL_MODEL(model), FALSE);
Packit 1e8aac
Packit 1e8aac
  return (glade_signal_model_iter_n_children (model, iter) != 0);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_signal_model_iter_nth_child (GtkTreeModel *model,
Packit 1e8aac
                                   GtkTreeIter *iter,
Packit 1e8aac
                                   GtkTreeIter *parent,
Packit 1e8aac
                                   gint n)
Packit 1e8aac
{
Packit 1e8aac
  GladeSignal *handler;
Packit 1e8aac
  GladeSignalModel *sig_model;
Packit 1e8aac
  const gchar *widget;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (iter != NULL, 0);
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL_MODEL(model), 0);
Packit 1e8aac
Packit 1e8aac
  handler = parent ? parent->user_data2 : NULL;
Packit 1e8aac
  sig_model = GLADE_SIGNAL_MODEL (model);
Packit 1e8aac
  widget = parent ? parent->user_data : NULL;
Packit 1e8aac
Packit 1e8aac
  if (handler)
Packit 1e8aac
    {
Packit 1e8aac
      return FALSE;
Packit 1e8aac
    }
Packit 1e8aac
  else if (widget)
Packit 1e8aac
    {
Packit 1e8aac
      GList *signals = glade_signal_model_create_signal_list (sig_model,
Packit 1e8aac
							      widget);
Packit 1e8aac
      GList *signal;
Packit 1e8aac
      for (signal = signals; signal != NULL; signal = g_list_next (signal))
Packit 1e8aac
	{
Packit 1e8aac
	  GPtrArray *handlers = g_hash_table_lookup (sig_model->priv->signals,
Packit 1e8aac
						     glade_signal_class_get_name (signal->data));
Packit 1e8aac
	  if (handlers)
Packit 1e8aac
	    {
Packit 1e8aac
	      if (n >= handlers->len)
Packit 1e8aac
		n -= handlers->len;
Packit 1e8aac
	      else
Packit 1e8aac
		{
Packit 1e8aac
		  glade_signal_model_create_signal_iter (sig_model,
Packit 1e8aac
							 widget,
Packit 1e8aac
							 g_ptr_array_index (handlers, n),
Packit 1e8aac
							 iter);
Packit 1e8aac
		  g_list_free (signals);
Packit 1e8aac
		  return TRUE;
Packit 1e8aac
		}
Packit 1e8aac
	    }
Packit 1e8aac
	  if (n == 0)
Packit 1e8aac
	    {
Packit 1e8aac
	      GladeSignal *handler =
Packit 1e8aac
		glade_signal_model_get_dummy_handler (sig_model,
Packit 1e8aac
						      signal->data);
Packit 1e8aac
	      glade_signal_model_create_signal_iter (sig_model,
Packit 1e8aac
						     widget,
Packit 1e8aac
						     handler,
Packit 1e8aac
						     iter);
Packit 1e8aac
	      g_list_free (signals);
Packit 1e8aac
	      return TRUE;
Packit 1e8aac
	    }
Packit 1e8aac
	  n--;
Packit 1e8aac
	}
Packit 1e8aac
      return FALSE;
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      if (g_list_length (sig_model->priv->widgets) > n)
Packit 1e8aac
	{
Packit 1e8aac
	  glade_signal_model_create_widget_iter (sig_model,
Packit 1e8aac
						 g_list_nth_data (sig_model->priv->widgets, n),
Packit 1e8aac
						 iter);
Packit 1e8aac
	  return TRUE;
Packit 1e8aac
	}
Packit 1e8aac
    }
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_signal_model_iter_children (GtkTreeModel *model,
Packit 1e8aac
                                  GtkTreeIter *iter,
Packit 1e8aac
                                  GtkTreeIter *parent)
Packit 1e8aac
{
Packit 1e8aac
  return glade_signal_model_iter_nth_child (model, iter, parent, 0);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_signal_model_iter_parent (GtkTreeModel *model,
Packit 1e8aac
                                GtkTreeIter *iter,
Packit 1e8aac
                                GtkTreeIter *child)
Packit 1e8aac
{
Packit 1e8aac
  GladeSignalModel *sig_model;
Packit 1e8aac
  GladeSignal *handler;
Packit 1e8aac
  const gchar *widget;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (iter != NULL, FALSE);
Packit 1e8aac
  g_return_val_if_fail (child != NULL, FALSE);
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL_MODEL(model), FALSE);  
Packit 1e8aac
Packit 1e8aac
  sig_model = GLADE_SIGNAL_MODEL (model);
Packit 1e8aac
  handler = child->user_data2;
Packit 1e8aac
  widget = child->user_data;
Packit 1e8aac
Packit 1e8aac
  if (handler)
Packit 1e8aac
    {
Packit 1e8aac
      glade_signal_model_create_widget_iter (sig_model, widget, iter);
Packit 1e8aac
      return TRUE;
Packit 1e8aac
    }
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
gtk_tree_model_iface_init (GtkTreeModelIface *iface)
Packit 1e8aac
{
Packit 1e8aac
  iface->get_flags = glade_signal_model_get_flags;
Packit 1e8aac
  iface->get_column_type = glade_signal_model_get_column_type;
Packit 1e8aac
  iface->get_n_columns = glade_signal_model_get_n_columns;
Packit 1e8aac
  iface->get_iter = glade_signal_model_get_iter;
Packit 1e8aac
  iface->get_path = glade_signal_model_get_path;
Packit 1e8aac
  iface->get_value = glade_signal_model_get_value;	
Packit 1e8aac
  iface->iter_next = glade_signal_model_iter_next;
Packit 1e8aac
  iface->iter_children = glade_signal_model_iter_children;
Packit 1e8aac
  iface->iter_has_child = glade_signal_model_iter_has_child;
Packit 1e8aac
  iface->iter_n_children = glade_signal_model_iter_n_children;
Packit 1e8aac
  iface->iter_nth_child = glade_signal_model_iter_nth_child;
Packit 1e8aac
  iface->iter_parent = glade_signal_model_iter_parent;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_signal_model_row_draggable (GtkTreeDragSource *model, GtkTreePath *path)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  GladeSignal *signal;
Packit 1e8aac
  gboolean retval;
Packit 1e8aac
  gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &iter, path);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
Packit 1e8aac
		      GLADE_SIGNAL_COLUMN_SIGNAL, &signal,
Packit 1e8aac
		      -1);
Packit 1e8aac
Packit 1e8aac
  retval = signal && !glade_signal_model_is_dummy_handler (GLADE_SIGNAL_MODEL (model),
Packit 1e8aac
							   signal);
Packit 1e8aac
Packit 1e8aac
  g_object_unref (signal);
Packit 1e8aac
  return retval;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_signal_model_drag_data_get (GtkTreeDragSource *model, 
Packit 1e8aac
                                  GtkTreePath *path,
Packit 1e8aac
                                  GtkSelectionData *data)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
Packit 1e8aac
  if (gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &iter, path))
Packit 1e8aac
    {
Packit 1e8aac
      GladeSignal *signal;
Packit 1e8aac
      const gchar *widget = iter.user_data;
Packit 1e8aac
      gchar *dnd_text;
Packit 1e8aac
      const gchar *user_data;
Packit 1e8aac
Packit 1e8aac
      gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
Packit 1e8aac
			  GLADE_SIGNAL_COLUMN_SIGNAL, &signal, -1);
Packit 1e8aac
Packit 1e8aac
      user_data = glade_signal_get_userdata (signal);
Packit 1e8aac
      
Packit 1e8aac
      dnd_text = g_strdup_printf ("%s:%s:%s:%s:%d:%d", widget, 
Packit 1e8aac
                                  glade_signal_get_name (signal),
Packit 1e8aac
                                  glade_signal_get_handler (signal),
Packit 1e8aac
                                  user_data && strlen (user_data) ? user_data : "(none)",
Packit 1e8aac
                                  glade_signal_get_swapped (signal),
Packit 1e8aac
                                  glade_signal_get_after (signal));
Packit 1e8aac
      gtk_selection_data_set (data,
Packit 1e8aac
			      gdk_atom_intern_static_string ("application/x-glade-signal"),
Packit 1e8aac
			      8,
Packit 1e8aac
			      (guchar*) dnd_text,
Packit 1e8aac
			      strlen (dnd_text));
Packit 1e8aac
Packit 1e8aac
      g_free (dnd_text);
Packit 1e8aac
      return TRUE;
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      return FALSE;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_signal_model_drag_data_delete (GtkTreeDragSource *model, 
Packit 1e8aac
                                     GtkTreePath *path)
Packit 1e8aac
{
Packit 1e8aac
  /* We don't move rows... */
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
gtk_tree_drag_source_iface_init (GtkTreeDragSourceIface *iface)
Packit 1e8aac
{
Packit 1e8aac
  iface->row_draggable = glade_signal_model_row_draggable;
Packit 1e8aac
  iface->drag_data_get = glade_signal_model_drag_data_get;
Packit 1e8aac
  iface->drag_data_delete = glade_signal_model_drag_data_delete;
Packit 1e8aac
}