|
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 |
}
|