Blame gladeui/glade-object-stub.c

Packit 1e8aac
/*
Packit 1e8aac
 * glade-object-stub.c
Packit 1e8aac
 *
Packit 1e8aac
 * Copyright (C) 2011 Juan Pablo Ugarte
Packit 1e8aac
   *
Packit 1e8aac
 * Author: Juan Pablo Ugarte <juanpablougarte@gmail.com>
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
 */
Packit 1e8aac
Packit 1e8aac
#include <config.h>
Packit 1e8aac
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
#include "glade-object-stub.h"
Packit 1e8aac
#include "glade-project.h"
Packit 1e8aac
Packit 1e8aac
struct _GladeObjectStubPrivate
Packit 1e8aac
{
Packit 1e8aac
  GtkLabel *label;
Packit 1e8aac
  
Packit 1e8aac
  gchar *type;
Packit 1e8aac
  GladeXmlNode *node;
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
enum
Packit 1e8aac
{
Packit 1e8aac
  PROP_0,
Packit 1e8aac
Packit 1e8aac
  PROP_OBJECT_TYPE,
Packit 1e8aac
  PROP_XML_NODE
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
G_DEFINE_TYPE_WITH_PRIVATE (GladeObjectStub, glade_object_stub, GTK_TYPE_INFO_BAR);
Packit 1e8aac
Packit 1e8aac
#define RESPONSE_DELETE 1
Packit 1e8aac
#define RESPONSE_DELETE_ALL 2
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
on_infobar_response (GladeObjectStub *stub, gint response_id)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *gwidget = glade_widget_get_from_gobject (stub);
Packit 1e8aac
  
Packit 1e8aac
  if (response_id == RESPONSE_DELETE)
Packit 1e8aac
    {
Packit 1e8aac
      GList widgets = {0, };
Packit 1e8aac
      widgets.data = gwidget;
Packit 1e8aac
      glade_command_delete (&widgets);
Packit 1e8aac
    }
Packit 1e8aac
  else if (response_id == RESPONSE_DELETE_ALL)
Packit 1e8aac
    {
Packit 1e8aac
      GladeProject *project = glade_widget_get_project (gwidget);
Packit 1e8aac
      GList *stubs = NULL;
Packit 1e8aac
      const GList *l;
Packit 1e8aac
Packit 1e8aac
      for (l = glade_project_get_objects (project); l; l = g_list_next (l))
Packit 1e8aac
        {
Packit 1e8aac
          if (GLADE_IS_OBJECT_STUB (l->data))
Packit 1e8aac
            {
Packit 1e8aac
              GladeWidget *gobj = glade_widget_get_from_gobject (l->data);
Packit 1e8aac
              stubs = g_list_prepend (stubs, gobj);
Packit 1e8aac
            }
Packit 1e8aac
        }
Packit 1e8aac
Packit 1e8aac
      glade_command_delete (stubs);
Packit 1e8aac
      g_list_free (stubs);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_object_stub_init (GladeObjectStub *object)
Packit 1e8aac
{
Packit 1e8aac
  GladeObjectStubPrivate *priv = glade_object_stub_get_instance_private (object);
Packit 1e8aac
  GtkWidget *label = gtk_label_new (NULL);
Packit 1e8aac
Packit 1e8aac
  object->priv = priv;
Packit 1e8aac
  priv->type = NULL;
Packit 1e8aac
  priv->node = NULL;
Packit 1e8aac
  
Packit 1e8aac
  priv->label = GTK_LABEL (label);
Packit 1e8aac
  gtk_label_set_line_wrap (priv->label, TRUE);
Packit 1e8aac
  
Packit 1e8aac
  gtk_container_add (GTK_CONTAINER (gtk_info_bar_get_content_area (GTK_INFO_BAR (object))), label);
Packit 1e8aac
Packit 1e8aac
  gtk_info_bar_add_button (GTK_INFO_BAR (object),
Packit 1e8aac
                           _("Delete"), RESPONSE_DELETE);
Packit 1e8aac
  gtk_info_bar_add_button (GTK_INFO_BAR (object),
Packit 1e8aac
                           _("Delete All"), RESPONSE_DELETE_ALL);
Packit 1e8aac
  
Packit 1e8aac
  g_signal_connect (object, "response", G_CALLBACK (on_infobar_response), NULL);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_object_stub_finalize (GObject *object)
Packit 1e8aac
{
Packit 1e8aac
  GladeObjectStubPrivate *priv = GLADE_OBJECT_STUB (object)->priv;
Packit 1e8aac
Packit 1e8aac
  g_free (priv->type);
Packit 1e8aac
  
Packit 1e8aac
  if (priv->node) glade_xml_node_delete (priv->node);
Packit 1e8aac
Packit 1e8aac
  G_OBJECT_CLASS (glade_object_stub_parent_class)->finalize (object);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_object_stub_refresh_text (GladeObjectStub *stub)
Packit 1e8aac
{
Packit 1e8aac
  GladeObjectStubPrivate *priv = stub->priv;
Packit 1e8aac
  gchar *markup;
Packit 1e8aac
  GType type;
Packit 1e8aac
Packit 1e8aac
  if (priv->type == NULL) return;
Packit 1e8aac
Packit 1e8aac
  type = g_type_from_name (priv->type);
Packit 1e8aac
Packit 1e8aac
  if ((type != G_TYPE_INVALID && (!G_TYPE_IS_INSTANTIATABLE (type) || G_TYPE_IS_ABSTRACT (type))))
Packit 1e8aac
    markup = g_markup_printf_escaped ("FIXME: Unable to create uninstantiable object with type %s", priv->type);
Packit 1e8aac
  else
Packit 1e8aac
    markup = g_markup_printf_escaped ("FIXME: Unable to create object with type %s", priv->type);
Packit 1e8aac
  
Packit 1e8aac
  gtk_label_set_markup (priv->label, markup);
Packit 1e8aac
  gtk_info_bar_set_message_type (GTK_INFO_BAR (stub), GTK_MESSAGE_WARNING);
Packit 1e8aac
  g_free (markup);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_object_stub_set_property (GObject      *object,
Packit 1e8aac
                                guint         prop_id,
Packit 1e8aac
                                const GValue *value,
Packit 1e8aac
                                GParamSpec   *pspec)
Packit 1e8aac
{
Packit 1e8aac
  GladeObjectStubPrivate *priv;
Packit 1e8aac
  GladeObjectStub *stub;
Packit 1e8aac
  
Packit 1e8aac
  g_return_if_fail (GLADE_IS_OBJECT_STUB (object));
Packit 1e8aac
Packit 1e8aac
  stub = GLADE_OBJECT_STUB (object);
Packit 1e8aac
  priv = stub->priv;
Packit 1e8aac
  
Packit 1e8aac
  switch (prop_id)
Packit 1e8aac
    {
Packit 1e8aac
      case PROP_OBJECT_TYPE:
Packit 1e8aac
        g_free (priv->type);
Packit 1e8aac
        priv->type = g_value_dup_string (value);
Packit 1e8aac
        glade_object_stub_refresh_text (stub);
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_XML_NODE:
Packit 1e8aac
        if (priv->node) glade_xml_node_delete (priv->node);
Packit 1e8aac
        priv->node = g_value_dup_boxed (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_object_stub_get_property (GObject    *object,
Packit 1e8aac
                                guint       prop_id,
Packit 1e8aac
                                GValue     *value,
Packit 1e8aac
                                GParamSpec *pspec)
Packit 1e8aac
{
Packit 1e8aac
  GladeObjectStubPrivate *priv;
Packit 1e8aac
  
Packit 1e8aac
  g_return_if_fail (GLADE_IS_OBJECT_STUB (object));
Packit 1e8aac
Packit 1e8aac
  priv = GLADE_OBJECT_STUB (object)->priv;
Packit 1e8aac
  
Packit 1e8aac
  switch (prop_id)
Packit 1e8aac
    {
Packit 1e8aac
      case PROP_OBJECT_TYPE:
Packit 1e8aac
        g_value_set_string (value, priv->type);
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_XML_NODE:
Packit 1e8aac
        g_value_set_boxed (value, priv->node);
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 GType
Packit 1e8aac
glade_xml_node_get_type (void)
Packit 1e8aac
{
Packit 1e8aac
  static GType type = 0;
Packit 1e8aac
Packit 1e8aac
  if (type) return type;
Packit 1e8aac
Packit 1e8aac
  type = g_boxed_type_register_static ("GladeXmlNode",
Packit 1e8aac
                                       (GBoxedCopyFunc) glade_xml_node_copy,
Packit 1e8aac
                                       (GBoxedFreeFunc) glade_xml_node_delete);
Packit 1e8aac
  return type;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_object_stub_class_init (GladeObjectStubClass *klass)
Packit 1e8aac
{
Packit 1e8aac
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit 1e8aac
Packit 1e8aac
  object_class->finalize = glade_object_stub_finalize;
Packit 1e8aac
  object_class->set_property = glade_object_stub_set_property;
Packit 1e8aac
  object_class->get_property = glade_object_stub_get_property;
Packit 1e8aac
Packit 1e8aac
  g_object_class_install_property (object_class,
Packit 1e8aac
                                   PROP_OBJECT_TYPE,
Packit 1e8aac
                                   g_param_spec_string ("object-type",
Packit 1e8aac
                                                        "Object Type",
Packit 1e8aac
                                                        "The object type this stub replaces",
Packit 1e8aac
                                                        NULL,
Packit 1e8aac
                                                        G_PARAM_READWRITE));
Packit 1e8aac
  g_object_class_install_property (object_class,
Packit 1e8aac
                                   PROP_XML_NODE,
Packit 1e8aac
                                   g_param_spec_boxed ("xml-node",
Packit 1e8aac
                                                       "XML node",
Packit 1e8aac
                                                       "The XML representation of the original object this is replacing",
Packit 1e8aac
                                                       glade_xml_node_get_type (),
Packit 1e8aac
                                                       G_PARAM_READWRITE));
Packit 1e8aac
}