Blame gladeui/glade-editable.c

Packit 1e8aac
/*
Packit 1e8aac
 * glade-editable.c
Packit 1e8aac
 *
Packit 1e8aac
 * Copyright (C) 2008 Tristan Van Berkom.
Packit 1e8aac
 *
Packit 1e8aac
 * Authors:
Packit 1e8aac
 *   Tristan Van Berkom <tvb@gnome.org>
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
#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 <string.h>
Packit 1e8aac
#include <stdlib.h>
Packit 1e8aac
Packit 1e8aac
#include "glade-project.h"
Packit 1e8aac
#include "glade-widget.h"
Packit 1e8aac
#include "glade-editable.h"
Packit 1e8aac
Packit 1e8aac
G_DEFINE_INTERFACE (GladeEditable, glade_editable, GTK_TYPE_WIDGET);
Packit 1e8aac
Packit 1e8aac
static GQuark glade_editable_project_quark = 0;
Packit 1e8aac
static GQuark glade_editable_widget_quark = 0;
Packit 1e8aac
static GQuark glade_editable_loading_quark = 0;
Packit 1e8aac
static GQuark glade_editable_destroy_quark = 0;
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
project_changed (GladeProject  *project,
Packit 1e8aac
                 GladeCommand  *command,
Packit 1e8aac
                 gboolean       execute, 
Packit 1e8aac
		 GladeEditable *editable)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *widget;
Packit 1e8aac
Packit 1e8aac
  widget = g_object_get_qdata (G_OBJECT (editable), glade_editable_widget_quark);
Packit 1e8aac
Packit 1e8aac
  glade_editable_load (editable, widget);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
project_closed (GladeProject  *project,
Packit 1e8aac
		GladeEditable *editable)
Packit 1e8aac
{
Packit 1e8aac
  glade_editable_load (editable, NULL);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
editable_destroyed (GladeEditable *editable)
Packit 1e8aac
{
Packit 1e8aac
  glade_editable_load (editable, NULL);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editable_load_default (GladeEditable  *editable,
Packit 1e8aac
			     GladeWidget    *widget)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget  *old_widget;
Packit 1e8aac
  GladeProject *old_project;
Packit 1e8aac
Packit 1e8aac
  old_widget  = g_object_get_qdata (G_OBJECT (editable), glade_editable_widget_quark);
Packit 1e8aac
  old_project = g_object_get_qdata (G_OBJECT (editable), glade_editable_project_quark);
Packit 1e8aac
Packit 1e8aac
  if (old_widget != widget)
Packit 1e8aac
    {
Packit 1e8aac
      if (old_widget)
Packit 1e8aac
	{
Packit 1e8aac
	  g_signal_handlers_disconnect_by_func (old_project, G_CALLBACK (project_changed), editable);
Packit 1e8aac
	  g_signal_handlers_disconnect_by_func (old_project, G_CALLBACK (project_closed), editable);
Packit 1e8aac
Packit 1e8aac
	  g_object_set_qdata (G_OBJECT (editable), glade_editable_widget_quark, NULL);
Packit 1e8aac
	  g_object_set_qdata (G_OBJECT (editable), glade_editable_project_quark, NULL);
Packit 1e8aac
	}
Packit 1e8aac
Packit 1e8aac
      if (widget)
Packit 1e8aac
	{
Packit 1e8aac
	  GladeProject *project = glade_widget_get_project (widget);
Packit 1e8aac
Packit 1e8aac
	  g_object_set_qdata (G_OBJECT (editable), glade_editable_widget_quark, widget);
Packit 1e8aac
	  g_object_set_qdata (G_OBJECT (editable), glade_editable_project_quark, project);
Packit 1e8aac
Packit 1e8aac
	  g_signal_connect (project, "changed", 
Packit 1e8aac
			    G_CALLBACK (project_changed), editable);
Packit 1e8aac
	  g_signal_connect (project, "close", 
Packit 1e8aac
			    G_CALLBACK (project_closed), editable);
Packit 1e8aac
	}
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editable_default_init (GladeEditableIface *iface)
Packit 1e8aac
{
Packit 1e8aac
  glade_editable_project_quark = g_quark_from_static_string ("glade-editable-project-quark");
Packit 1e8aac
  glade_editable_widget_quark  = g_quark_from_static_string ("glade-editable-widget-quark");
Packit 1e8aac
  glade_editable_loading_quark = g_quark_from_static_string ("glade-editable-loading-quark");
Packit 1e8aac
  glade_editable_destroy_quark = g_quark_from_static_string ("glade-editable-destroy-quark");
Packit 1e8aac
Packit 1e8aac
  iface->load = glade_editable_load_default;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_editable_load:
Packit 1e8aac
 * @editable: A #GladeEditable
Packit 1e8aac
 * @widget: the #GladeWidget to load
Packit 1e8aac
 *
Packit 1e8aac
 * Loads @widget property values into @editable
Packit 1e8aac
 * (the editable will watch the widgets properties
Packit 1e8aac
 * until its loaded with another widget or %NULL)
Packit 1e8aac
 */
Packit 1e8aac
void
Packit 1e8aac
glade_editable_load (GladeEditable *editable, GladeWidget *widget)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditableIface *iface;
Packit 1e8aac
  g_return_if_fail (GLADE_IS_EDITABLE (editable));
Packit 1e8aac
  g_return_if_fail (widget == NULL || GLADE_IS_WIDGET (widget));
Packit 1e8aac
Packit 1e8aac
  /* Connect to the destroy signal once, make sure we unload the widget and disconnect
Packit 1e8aac
   * to any signals when destroying
Packit 1e8aac
   */
Packit 1e8aac
  if (!GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (editable), glade_editable_destroy_quark)))
Packit 1e8aac
    {
Packit 1e8aac
      g_signal_connect (editable, "destroy", G_CALLBACK (editable_destroyed), NULL);
Packit 1e8aac
      g_object_set_qdata (G_OBJECT (editable), glade_editable_destroy_quark, GINT_TO_POINTER (TRUE));
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  iface = GLADE_EDITABLE_GET_IFACE (editable);
Packit 1e8aac
Packit 1e8aac
  g_object_set_qdata (G_OBJECT (editable), glade_editable_loading_quark, GINT_TO_POINTER (TRUE));
Packit 1e8aac
Packit 1e8aac
  if (iface->load)
Packit 1e8aac
    iface->load (editable, widget);
Packit 1e8aac
  else
Packit 1e8aac
    g_critical ("No GladeEditable::load() support on type %s",
Packit 1e8aac
                G_OBJECT_TYPE_NAME (editable));
Packit 1e8aac
Packit 1e8aac
  g_object_set_qdata (G_OBJECT (editable), glade_editable_loading_quark, GINT_TO_POINTER (FALSE));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_editable_set_show_name:
Packit 1e8aac
 * @editable: A #GladeEditable
Packit 1e8aac
 * @show_name: Whether or not to show the name entry
Packit 1e8aac
 *
Packit 1e8aac
 * This only applies for the general page in the property
Packit 1e8aac
 * editor, editables that embed the #GladeEditorTable implementation
Packit 1e8aac
 * for the general page should use this to forward the message
Packit 1e8aac
 * to its embedded editable.
Packit 1e8aac
 */
Packit 1e8aac
void
Packit 1e8aac
glade_editable_set_show_name (GladeEditable *editable, gboolean show_name)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditableIface *iface;
Packit 1e8aac
  g_return_if_fail (GLADE_IS_EDITABLE (editable));
Packit 1e8aac
Packit 1e8aac
  iface = GLADE_EDITABLE_GET_IFACE (editable);
Packit 1e8aac
Packit 1e8aac
  if (iface->set_show_name)
Packit 1e8aac
    iface->set_show_name (editable, show_name);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GladeWidget *
Packit 1e8aac
glade_editable_loaded_widget (GladeEditable *editable)
Packit 1e8aac
{
Packit 1e8aac
  return g_object_get_qdata (G_OBJECT (editable), glade_editable_widget_quark);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
gboolean
Packit 1e8aac
glade_editable_loading (GladeEditable *editable)
Packit 1e8aac
{
Packit 1e8aac
  return GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (editable), glade_editable_loading_quark));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_editable_block (GladeEditable *editable)
Packit 1e8aac
{
Packit 1e8aac
  GladeProject *project;
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_EDITABLE (editable));
Packit 1e8aac
Packit 1e8aac
  project = g_object_get_qdata (G_OBJECT (editable), glade_editable_project_quark);
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_PROJECT (project));
Packit 1e8aac
Packit 1e8aac
  g_signal_handlers_block_by_func (project, G_CALLBACK (project_changed), editable);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_editable_unblock (GladeEditable *editable)
Packit 1e8aac
{
Packit 1e8aac
  GladeProject *project;
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_EDITABLE (editable));
Packit 1e8aac
Packit 1e8aac
  project = g_object_get_qdata (G_OBJECT (editable), glade_editable_project_quark);
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_PROJECT (project));
Packit 1e8aac
Packit 1e8aac
  g_signal_handlers_unblock_by_func (project, G_CALLBACK (project_changed), editable);
Packit 1e8aac
}