Blame gladeui/glade-editor-skeleton.c

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
}