/* glade-signal-class.c
 *
 * Copyright (C) 2011 Openismus GmbH
 *
 * Authors:
 *      Tristan Van Berkom <tristanvb@openismus.com>
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public 
 * License along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */


#include <config.h>
#include "glade-signal-class.h"
#include "glade-widget-adaptor.h"

struct _GladeSignalClass
{
  GladeWidgetAdaptor *adaptor; /* The adaptor that originated this signal.
				*/
  GSignalQuery        query;

  guint16             version_since_major; /* Version in which this signal was */
  guint16             version_since_minor; /* introduced
					    */

  const gchar        *name;                /* Name of the signal, eg clicked */
  const gchar        *type;                /* Name of the object class that this signal 
					    * belongs to eg GtkButton */

  guint deprecated : 1;                    /* True if this signal is deprecated */
};

GladeSignalClass *
glade_signal_class_new  (GladeWidgetAdaptor *adaptor,
			 GType               for_type,
			 guint               signal_id)
{
  GladeSignalClass *class;

  class = g_slice_new0 (GladeSignalClass);

  class->adaptor = adaptor;

  /* Since glib gave us this signal id... it should
   * exist no matter what.
   */
  g_signal_query (signal_id, &(class->query));
  if (class->query.signal_id == 0)
    {
      g_critical ("glade_signal_class_new() called with an invalid signal id");

      glade_signal_class_free (class);
      return NULL;
    }

  class->name = (class->query.signal_name);
  class->type = g_type_name (for_type);

  /* Initialize signal versions & deprecated to adaptor version */
  class->version_since_major = GWA_VERSION_SINCE_MAJOR (adaptor);
  class->version_since_minor = GWA_VERSION_SINCE_MINOR (adaptor);
  class->deprecated          = GWA_DEPRECATED (adaptor);

  return class;
}

void
glade_signal_class_free (GladeSignalClass *signal_class)
{
  g_slice_free (GladeSignalClass, signal_class);
}

void
glade_signal_class_update_from_node (GladeSignalClass *signal_class,
				     GladeXmlNode     *node,
				     const gchar      *domain)
{
  g_return_if_fail (signal_class != NULL);
  g_return_if_fail (node != NULL);

  glade_xml_get_property_version (node, GLADE_TAG_VERSION_SINCE,
				  &signal_class->version_since_major, 
				  &signal_class->version_since_minor);

  signal_class->deprecated =
    glade_xml_get_property_boolean (node,
				    GLADE_TAG_DEPRECATED,
				    signal_class->deprecated);
}

GladeWidgetAdaptor *
glade_signal_class_get_adaptor (const GladeSignalClass *signal_class)
{
  g_return_val_if_fail (signal_class != NULL, NULL);

  return signal_class->adaptor;
}

G_CONST_RETURN gchar *
glade_signal_class_get_name (const GladeSignalClass *signal_class)
{
  g_return_val_if_fail (signal_class != NULL, NULL);

  return signal_class->name;
}

G_CONST_RETURN gchar *
glade_signal_class_get_type (const GladeSignalClass *signal_class)
{
  g_return_val_if_fail (signal_class != NULL, NULL);

  return signal_class->type;
}

GSignalFlags
glade_signal_class_get_flags (const GladeSignalClass *signal_class)
{
  g_return_val_if_fail (signal_class != NULL, 0);

  return signal_class->query.signal_flags;
}

void
glade_signal_class_set_since (GladeSignalClass *signal_class,
			      guint16           since_major,
			      guint16           since_minor)
{
  g_return_if_fail (signal_class != NULL);

  signal_class->version_since_major = since_major;
  signal_class->version_since_minor = since_minor;
}

guint16
glade_signal_class_since_major (GladeSignalClass *signal_class)
{
  g_return_val_if_fail (signal_class != NULL, 0);

  return signal_class->version_since_major;
}

guint16
glade_signal_class_since_minor (GladeSignalClass *signal_class)
{
  g_return_val_if_fail (signal_class != NULL, 0);

  return signal_class->version_since_minor;
}

void
glade_signal_class_set_deprecated (GladeSignalClass *signal_class,
				   gboolean          deprecated)
{
  g_return_if_fail (signal_class != NULL);

  signal_class->deprecated = deprecated;
}

gboolean
glade_signal_class_deprecated (GladeSignalClass *signal_class)
{
  g_return_val_if_fail (signal_class != NULL, FALSE);

  return signal_class->deprecated;
}
