|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* Copyright (C) 2013 Tristan Van Berkom.
|
|
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 |
* Authors:
|
|
Packit |
1e8aac |
* Tristan Van Berkom <tvb@gnome.org>
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#ifdef HAVE_CONFIG_H
|
|
Packit |
1e8aac |
#include <config.h>
|
|
Packit |
1e8aac |
#endif
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include <glib/gi18n-lib.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include "glade.h"
|
|
Packit |
1e8aac |
#include "glade-widget.h"
|
|
Packit |
1e8aac |
#include "glade-popup.h"
|
|
Packit |
1e8aac |
#include "glade-editable.h"
|
|
Packit |
1e8aac |
#include "glade-editor-skeleton.h"
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* GObjectClass */
|
|
Packit |
1e8aac |
static void glade_editor_skeleton_dispose (GObject *object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* GladeEditableIface */
|
|
Packit |
1e8aac |
static void glade_editor_skeleton_editable_init (GladeEditableIface *iface);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* GtkBuildableIface */
|
|
Packit |
1e8aac |
static void glade_editor_skeleton_buildable_init (GtkBuildableIface *iface);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
struct _GladeEditorSkeletonPrivate
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GSList *editors;
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GladeEditableIface *parent_editable_iface;
|
|
Packit |
1e8aac |
static GtkBuildableIface *parent_buildable_iface;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_DEFINE_TYPE_WITH_CODE (GladeEditorSkeleton, glade_editor_skeleton, GTK_TYPE_BOX,
|
|
Packit |
1e8aac |
G_ADD_PRIVATE (GladeEditorSkeleton)
|
|
Packit |
1e8aac |
G_IMPLEMENT_INTERFACE (GLADE_TYPE_EDITABLE,
|
|
Packit |
1e8aac |
glade_editor_skeleton_editable_init)
|
|
Packit |
1e8aac |
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
|
|
Packit |
1e8aac |
glade_editor_skeleton_buildable_init));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_skeleton_init (GladeEditorSkeleton *skeleton)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
skeleton->priv = glade_editor_skeleton_get_instance_private (skeleton);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_skeleton_class_init (GladeEditorSkeletonClass *klass)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gobject_class->dispose = glade_editor_skeleton_dispose;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/***********************************************************
|
|
Packit |
1e8aac |
* GObjectClass *
|
|
Packit |
1e8aac |
***********************************************************/
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_skeleton_dispose (GObject *object)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorSkeleton *skeleton = GLADE_EDITOR_SKELETON (object);
|
|
Packit |
1e8aac |
GladeEditorSkeletonPrivate *priv = skeleton->priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (priv->editors)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_slist_free_full (priv->editors, (GDestroyNotify)g_object_unref);
|
|
Packit |
1e8aac |
priv->editors = NULL;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_OBJECT_CLASS (glade_editor_skeleton_parent_class)->dispose (object);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*******************************************************************************
|
|
Packit |
1e8aac |
* GladeEditableIface *
|
|
Packit |
1e8aac |
*******************************************************************************/
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_skeleton_load (GladeEditable *editable,
|
|
Packit |
1e8aac |
GladeWidget *widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorSkeleton *skeleton = GLADE_EDITOR_SKELETON (editable);
|
|
Packit |
1e8aac |
GladeEditorSkeletonPrivate *priv = skeleton->priv;
|
|
Packit |
1e8aac |
GSList *l;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Chain up to default implementation */
|
|
Packit |
1e8aac |
parent_editable_iface->load (editable, widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (l = priv->editors; l; l = l->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditable *editor = l->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_editable_load (editor, widget);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_skeleton_set_show_name (GladeEditable *editable, gboolean show_name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorSkeleton *skeleton = GLADE_EDITOR_SKELETON (editable);
|
|
Packit |
1e8aac |
GladeEditorSkeletonPrivate *priv = skeleton->priv;
|
|
Packit |
1e8aac |
GSList *l;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (l = priv->editors; l; l = l->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditable *editor = l->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_editable_set_show_name (editor, show_name);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_skeleton_editable_init (GladeEditableIface *iface)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
parent_editable_iface = g_type_default_interface_peek (GLADE_TYPE_EDITABLE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
iface->load = glade_editor_skeleton_load;
|
|
Packit |
1e8aac |
iface->set_show_name = glade_editor_skeleton_set_show_name;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*******************************************************************************
|
|
Packit |
1e8aac |
* GtkBuildableIface *
|
|
Packit |
1e8aac |
*******************************************************************************/
|
|
Packit |
1e8aac |
typedef struct
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GSList *editors;
|
|
Packit |
1e8aac |
} EditorParserData;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
editor_start_element (GMarkupParseContext *context,
|
|
Packit |
1e8aac |
const gchar *element_name,
|
|
Packit |
1e8aac |
const gchar **names,
|
|
Packit |
1e8aac |
const gchar **values,
|
|
Packit |
1e8aac |
gpointer user_data,
|
|
Packit |
1e8aac |
GError **error)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
EditorParserData *editor_data = (EditorParserData *)user_data;
|
|
Packit |
1e8aac |
gchar *id;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (strcmp (element_name, "editor") == 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (g_markup_collect_attributes (element_name,
|
|
Packit |
1e8aac |
names,
|
|
Packit |
1e8aac |
values,
|
|
Packit |
1e8aac |
error,
|
|
Packit |
1e8aac |
G_MARKUP_COLLECT_STRDUP, "id", &id,
|
|
Packit |
1e8aac |
G_MARKUP_COLLECT_INVALID))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
editor_data->editors = g_slist_append (editor_data->editors, id);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (strcmp (element_name, "child-editors") == 0)
|
|
Packit |
1e8aac |
;
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_warning ("Unsupported tag for GladeEditorSkeleton: %s\n", element_name);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static const GMarkupParser editor_parser =
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
editor_start_element,
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_editor_skeleton_custom_tag_start (GtkBuildable *buildable,
|
|
Packit |
1e8aac |
GtkBuilder *builder,
|
|
Packit |
1e8aac |
GObject *child,
|
|
Packit |
1e8aac |
const gchar *tagname,
|
|
Packit |
1e8aac |
GMarkupParser *parser,
|
|
Packit |
1e8aac |
gpointer *data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (strcmp (tagname, "child-editors") == 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
EditorParserData *parser_data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
parser_data = g_slice_new0 (EditorParserData);
|
|
Packit |
1e8aac |
*parser = editor_parser;
|
|
Packit |
1e8aac |
*data = parser_data;
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return parent_buildable_iface->custom_tag_start (buildable, builder, child,
|
|
Packit |
1e8aac |
tagname, parser, data);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_skeleton_custom_finished (GtkBuildable *buildable,
|
|
Packit |
1e8aac |
GtkBuilder *builder,
|
|
Packit |
1e8aac |
GObject *child,
|
|
Packit |
1e8aac |
const gchar *tagname,
|
|
Packit |
1e8aac |
gpointer user_data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
EditorParserData *editor_data = (EditorParserData *)user_data;
|
|
Packit |
1e8aac |
GSList *l;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (strcmp (tagname, "child-editors") != 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
parent_buildable_iface->custom_finished (buildable, builder, child,
|
|
Packit |
1e8aac |
tagname, user_data);
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (l = editor_data->editors; l; l = l->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GObject *object;
|
|
Packit |
1e8aac |
gchar *id = l->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
object = gtk_builder_get_object (builder, id);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!GLADE_EDITABLE (object))
|
|
Packit |
1e8aac |
g_warning ("Object '%s' is not a GladeEditable\n",
|
|
Packit |
1e8aac |
object ? G_OBJECT_TYPE_NAME (object) : "(null)");
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
glade_editor_skeleton_add_editor (GLADE_EDITOR_SKELETON (buildable),
|
|
Packit |
1e8aac |
GLADE_EDITABLE (object));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_slist_free_full (editor_data->editors, g_free);
|
|
Packit |
1e8aac |
g_slice_free (EditorParserData, editor_data);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_skeleton_buildable_init (GtkBuildableIface *iface)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
parent_buildable_iface = g_type_interface_peek_parent (iface);
|
|
Packit |
1e8aac |
iface->custom_tag_start = glade_editor_skeleton_custom_tag_start;
|
|
Packit |
1e8aac |
iface->custom_finished = glade_editor_skeleton_custom_finished;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*******************************************************************************
|
|
Packit |
1e8aac |
* API *
|
|
Packit |
1e8aac |
*******************************************************************************/
|
|
Packit |
1e8aac |
GtkWidget *
|
|
Packit |
1e8aac |
glade_editor_skeleton_new (void)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return g_object_new (GLADE_TYPE_EDITOR_SKELETON, NULL);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_editor_skeleton_add_editor (GladeEditorSkeleton *skeleton,
|
|
Packit |
1e8aac |
GladeEditable *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorSkeletonPrivate *priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_EDITOR_SKELETON (skeleton));
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_EDITABLE (editor));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
priv = skeleton->priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_ref (editor);
|
|
Packit |
1e8aac |
priv->editors = g_slist_prepend (priv->editors, editor);
|
|
Packit |
1e8aac |
}
|