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