|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* Copyright (C) 2001 Ximian, Inc.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
1e8aac |
* it under the terms of the GNU General Public License as
|
|
Packit |
1e8aac |
* published by the Free Software Foundation; either version 2 of the
|
|
Packit |
1e8aac |
* License, or (at your option) any later version.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
1e8aac |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
1e8aac |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
1e8aac |
* GNU General Public License for more details.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* You should have received a copy of the GNU General Public License
|
|
Packit |
1e8aac |
* 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 |
* Chema Celorio <chema@celorio.com>
|
|
Packit |
1e8aac |
* Tristan Van Berkom <tvb@gnome.org>
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#ifdef HAVE_CONFIG_H
|
|
Packit |
1e8aac |
#include <config.h>
|
|
Packit |
1e8aac |
#endif
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* SECTION:glade-editor
|
|
Packit |
1e8aac |
* @Short_Description: A Widget to edit a #GladeWidget.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This is the Glade Notebook containing all the controls needed to configure a #GladeWidget.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include <stdio.h>
|
|
Packit |
1e8aac |
#include <string.h>
|
|
Packit |
1e8aac |
#include <glib/gi18n-lib.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include <gtk/gtk.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include "glade.h"
|
|
Packit |
1e8aac |
#include "glade-widget.h"
|
|
Packit |
1e8aac |
#include "glade-widget-adaptor.h"
|
|
Packit |
1e8aac |
#include "glade-editor.h"
|
|
Packit |
1e8aac |
#include "glade-signal-editor.h"
|
|
Packit |
1e8aac |
#include "glade-property.h"
|
|
Packit |
1e8aac |
#include "glade-property-class.h"
|
|
Packit |
1e8aac |
#include "glade-command.h"
|
|
Packit |
1e8aac |
#include "glade-debug.h"
|
|
Packit |
1e8aac |
#include "glade-marshallers.h"
|
|
Packit |
1e8aac |
#include "glade-project.h"
|
|
Packit |
1e8aac |
#include "glade-utils.h"
|
|
Packit |
1e8aac |
#include "glade-editor-property.h"
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void glade_editor_switch_page (GtkNotebook *notebook,
|
|
Packit |
1e8aac |
GtkWidget *page,
|
|
Packit |
1e8aac |
guint page_num,
|
|
Packit |
1e8aac |
GladeEditor *editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
enum
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
PROP_0,
|
|
Packit |
1e8aac |
PROP_SHOW_INFO,
|
|
Packit |
1e8aac |
PROP_WIDGET,
|
|
Packit |
1e8aac |
PROP_SHOW_CLASS_FIELD,
|
|
Packit |
1e8aac |
PROP_CLASS_FIELD,
|
|
Packit |
1e8aac |
PROP_SHOW_BORDER,
|
|
Packit |
1e8aac |
N_PROPERTIES
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#define GLADE_EDITOR_PRIVATE(object) (((GladeEditor*)object)->priv)
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
struct _GladeEditorPrivate
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GtkWidget *notebook; /* The notebook widget */
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeWidget *loaded_widget; /* A handy pointer to the GladeWidget
|
|
Packit |
1e8aac |
* that is loaded in the editor. NULL
|
|
Packit |
1e8aac |
* if no widgets are selected
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeWidgetAdaptor *loaded_adaptor; /* A pointer to the loaded
|
|
Packit |
1e8aac |
* GladeWidgetAdaptor. Note that we can
|
|
Packit |
1e8aac |
* have a class loaded without a
|
|
Packit |
1e8aac |
* loaded_widget. For this reason we
|
|
Packit |
1e8aac |
* can't use loaded_widget->adaptor.
|
|
Packit |
1e8aac |
* When a widget is selected we load
|
|
Packit |
1e8aac |
* this class in the editor first and
|
|
Packit |
1e8aac |
* then fill the values of the inputs
|
|
Packit |
1e8aac |
* with the GladeProperty items.
|
|
Packit |
1e8aac |
* This is usefull for not having
|
|
Packit |
1e8aac |
* to redraw/container_add the widgets
|
|
Packit |
1e8aac |
* when we switch from widgets of the
|
|
Packit |
1e8aac |
* same class
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GtkWidget *page_widget;
|
|
Packit |
1e8aac |
GtkWidget *page_packing;
|
|
Packit |
1e8aac |
GtkWidget *page_common;
|
|
Packit |
1e8aac |
GtkWidget *page_atk;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeSignalEditor *signal_editor; /* The signal editor packed into vbox_signals
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GList *editables; /* A list of GladeEditables. We have a widget
|
|
Packit |
1e8aac |
* for each GladeWidgetAdaptor and we only load
|
|
Packit |
1e8aac |
* them on demand
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GtkWidget *packing_page; /* Packing pages are dynamicly created each
|
|
Packit |
1e8aac |
* selection, this pointer is only to free
|
|
Packit |
1e8aac |
* the last packing page.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean loading; /* Use when loading a GladeWidget into the editor
|
|
Packit |
1e8aac |
* we set this flag so that we can ignore the
|
|
Packit |
1e8aac |
* "changed" signal of the name entry text since
|
|
Packit |
1e8aac |
* the name has not really changed, just a new name
|
|
Packit |
1e8aac |
* was loaded.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gulong project_closed_signal_id; /* Unload widget when widget's project closes */
|
|
Packit |
1e8aac |
gulong project_removed_signal_id; /* Unload widget when its removed from the project. */
|
|
Packit |
1e8aac |
gulong widget_warning_id; /* Update when widget changes warning messages. */
|
|
Packit |
1e8aac |
gulong widget_name_id; /* Update class field when widget name changes */
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GtkWidget *class_field; /* The class header */
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GtkWidget *warning; /* A pointer to an icon we can show in the class
|
|
Packit |
1e8aac |
* field to publish tooltips for class related
|
|
Packit |
1e8aac |
* versioning errors.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GtkWidget *class_icon; /* An image with the current widget's class icon. */
|
|
Packit |
1e8aac |
GtkWidget *class_label; /* A label with the current class label. */
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean show_class_field; /* Whether or not to show the class field at the top */
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_DEFINE_TYPE_WITH_PRIVATE (GladeEditor, glade_editor, GTK_TYPE_BOX);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GParamSpec *properties[N_PROPERTIES];
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_set_property (GObject *object,
|
|
Packit |
1e8aac |
guint prop_id,
|
|
Packit |
1e8aac |
const GValue *value,
|
|
Packit |
1e8aac |
GParamSpec *pspec)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditor *editor = GLADE_EDITOR (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
switch (prop_id)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case PROP_SHOW_INFO:
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_WIDGET:
|
|
Packit |
1e8aac |
glade_editor_load_widget (editor,
|
|
Packit |
1e8aac |
GLADE_WIDGET (g_value_get_object (value)));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_SHOW_CLASS_FIELD:
|
|
Packit |
1e8aac |
if (g_value_get_boolean (value))
|
|
Packit |
1e8aac |
glade_editor_show_class_field (editor);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
glade_editor_hide_class_field (editor);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_SHOW_BORDER:
|
|
Packit |
1e8aac |
gtk_notebook_set_show_border (GTK_NOTEBOOK (editor->priv->notebook),
|
|
Packit |
1e8aac |
g_value_get_boolean (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_editor_get_property (GObject *object,
|
|
Packit |
1e8aac |
guint prop_id,
|
|
Packit |
1e8aac |
GValue *value,
|
|
Packit |
1e8aac |
GParamSpec *pspec)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditor *editor = GLADE_EDITOR (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
switch (prop_id)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case PROP_SHOW_INFO:
|
|
Packit |
1e8aac |
g_value_set_boolean (value, FALSE);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_WIDGET:
|
|
Packit |
1e8aac |
g_value_set_object (value, editor->priv->loaded_widget);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_SHOW_CLASS_FIELD:
|
|
Packit |
1e8aac |
g_value_set_boolean (value, editor->priv->show_class_field);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_CLASS_FIELD:
|
|
Packit |
1e8aac |
g_value_set_static_string (value, gtk_label_get_label (GTK_LABEL (editor->priv->class_label)));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case PROP_SHOW_BORDER:
|
|
Packit |
1e8aac |
g_value_set_boolean (value, gtk_notebook_get_show_border (GTK_NOTEBOOK (editor->priv->notebook)));
|
|
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_editor_dispose (GObject *object)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorPrivate *priv = GLADE_EDITOR_PRIVATE (object);
|
|
Packit |
1e8aac |
GladeEditor *editor = GLADE_EDITOR (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_editor_load_widget (editor, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Unref all the cached pages */
|
|
Packit |
1e8aac |
g_list_foreach (priv->editables, (GFunc) g_object_unref, NULL);
|
|
Packit |
1e8aac |
priv->editables = (g_list_free (priv->editables), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_OBJECT_CLASS (glade_editor_parent_class)->dispose (object);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_class_init (GladeEditorClass *klass)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
Packit |
1e8aac |
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
object_class->dispose = glade_editor_dispose;
|
|
Packit |
1e8aac |
object_class->set_property = glade_editor_set_property;
|
|
Packit |
1e8aac |
object_class->get_property = glade_editor_get_property;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Properties */
|
|
Packit |
1e8aac |
properties[PROP_SHOW_INFO] =
|
|
Packit |
1e8aac |
g_param_spec_boolean ("show-info",
|
|
Packit |
1e8aac |
_("Show info"),
|
|
Packit |
1e8aac |
_("Whether to show an informational "
|
|
Packit |
1e8aac |
"button for the loaded widget"),
|
|
Packit |
1e8aac |
FALSE,
|
|
Packit |
1e8aac |
G_PARAM_READABLE | G_PARAM_DEPRECATED);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
properties[PROP_WIDGET] =
|
|
Packit |
1e8aac |
g_param_spec_object ("widget",
|
|
Packit |
1e8aac |
_("Widget"),
|
|
Packit |
1e8aac |
_("The currently loaded widget in this editor"),
|
|
Packit |
1e8aac |
GLADE_TYPE_WIDGET,
|
|
Packit |
1e8aac |
G_PARAM_READWRITE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
properties[PROP_SHOW_CLASS_FIELD] =
|
|
Packit |
1e8aac |
g_param_spec_boolean ("show-class-field",
|
|
Packit |
1e8aac |
_("Show Class Field"),
|
|
Packit |
1e8aac |
_("Whether to show the class field at the top"),
|
|
Packit |
1e8aac |
TRUE,
|
|
Packit |
1e8aac |
G_PARAM_READWRITE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
properties[PROP_CLASS_FIELD] =
|
|
Packit |
1e8aac |
g_param_spec_string ("class-field",
|
|
Packit |
1e8aac |
_("Class Field"),
|
|
Packit |
1e8aac |
_("The class field string"),
|
|
Packit |
1e8aac |
NULL,
|
|
Packit |
1e8aac |
G_PARAM_READABLE);
|
|
Packit |
1e8aac |
properties[PROP_SHOW_BORDER] =
|
|
Packit |
1e8aac |
g_param_spec_boolean ("show-boder",
|
|
Packit |
1e8aac |
_("Show Border"),
|
|
Packit |
1e8aac |
_("Whether the border should be shown"),
|
|
Packit |
1e8aac |
TRUE,
|
|
Packit |
1e8aac |
G_PARAM_READWRITE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Install all properties */
|
|
Packit |
1e8aac |
g_object_class_install_properties (object_class, N_PROPERTIES, properties);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Bind to template */
|
|
Packit |
1e8aac |
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/gladeui/glade-editor.ui");
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, notebook);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, page_widget);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, page_packing);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, page_common);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, page_atk);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, class_field);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, class_icon);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, class_label);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, warning);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, signal_editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_callback (widget_class, glade_editor_switch_page);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_update_class_warning_cb (GladeWidget *widget,
|
|
Packit |
1e8aac |
GParamSpec *pspec,
|
|
Packit |
1e8aac |
GladeEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorPrivate *priv = GLADE_EDITOR_PRIVATE (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_widget_support_warning (widget))
|
|
Packit |
1e8aac |
gtk_widget_show (priv->warning);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
gtk_widget_hide (priv->warning);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_set_tooltip_text (priv->warning, glade_widget_support_warning (widget));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_update_class_field (GladeEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorPrivate *priv = GLADE_EDITOR_PRIVATE (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (priv->loaded_widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *widget = priv->loaded_widget;
|
|
Packit |
1e8aac |
gchar *text;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_image_set_from_icon_name (GTK_IMAGE (priv->class_icon),
|
|
Packit |
1e8aac |
glade_widget_adaptor_get_icon_name (priv->loaded_adaptor),
|
|
Packit |
1e8aac |
GTK_ICON_SIZE_BUTTON);
|
|
Packit |
1e8aac |
gtk_widget_show (priv->class_icon);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_widget_has_name (widget))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* translators: %s(Class Title) Properties - %s (ClassName) [%s(WidgetName)]
|
|
Packit |
1e8aac |
* example: Window Properties - GtkWindow [window1]
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
text = g_strdup_printf (_("%s Properties - %s [%s]"),
|
|
Packit |
1e8aac |
glade_widget_adaptor_get_title (priv->loaded_adaptor),
|
|
Packit |
1e8aac |
glade_widget_adaptor_get_name (priv->loaded_adaptor),
|
|
Packit |
1e8aac |
glade_widget_get_display_name (widget));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* translators: %s(Class Title) Properties - %s (ClassName)
|
|
Packit |
1e8aac |
* example: Window Properties - GtkWindow
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
text = g_strdup_printf (_("%s Properties - %s"),
|
|
Packit |
1e8aac |
glade_widget_adaptor_get_title (priv->loaded_adaptor),
|
|
Packit |
1e8aac |
glade_widget_adaptor_get_name (priv->loaded_adaptor));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_label_set_text (GTK_LABEL (priv->class_label), text);
|
|
Packit |
1e8aac |
g_free (text);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_editor_update_class_warning_cb (priv->loaded_widget, NULL, editor);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_widget_hide (priv->class_icon);
|
|
Packit |
1e8aac |
gtk_widget_hide (priv->warning);
|
|
Packit |
1e8aac |
gtk_label_set_text (GTK_LABEL (priv->class_label), _("Properties"));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (editor), properties[PROP_CLASS_FIELD]);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_update_widget_name_cb (GladeWidget *widget,
|
|
Packit |
1e8aac |
GParamSpec *pspec,
|
|
Packit |
1e8aac |
GladeEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_editor_update_class_field (editor);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_switch_page (GtkNotebook *notebook,
|
|
Packit |
1e8aac |
GtkWidget *page,
|
|
Packit |
1e8aac |
guint page_num,
|
|
Packit |
1e8aac |
GladeEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorPrivate *priv = GLADE_EDITOR_PRIVATE (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_hide (priv->page_widget);
|
|
Packit |
1e8aac |
gtk_widget_hide (priv->page_packing);
|
|
Packit |
1e8aac |
gtk_widget_hide (priv->page_common);
|
|
Packit |
1e8aac |
gtk_widget_hide (priv->page_atk);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
switch (page_num)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case 0:
|
|
Packit |
1e8aac |
gtk_widget_show (priv->page_widget);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case 1:
|
|
Packit |
1e8aac |
gtk_widget_show (priv->page_packing);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case 2:
|
|
Packit |
1e8aac |
gtk_widget_show (priv->page_common);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case 4:
|
|
Packit |
1e8aac |
gtk_widget_show (priv->page_atk);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_init (GladeEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorPrivate *priv;
|
|
Packit |
1e8aac |
gint icon_height;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
editor->priv = priv = glade_editor_get_instance_private (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
priv->show_class_field = TRUE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_init_template (GTK_WIDGET (editor));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_icon_size_lookup (GTK_ICON_SIZE_BUTTON, NULL, &icon_height);
|
|
Packit |
1e8aac |
gtk_widget_set_size_request (priv->class_label, -1, icon_height + 2);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_editor_update_class_field (editor);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GtkWidget *
|
|
Packit |
1e8aac |
glade_editor_get_editable_by_adaptor (GladeEditor *editor,
|
|
Packit |
1e8aac |
GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GladeEditorPageType type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorPrivate *priv = GLADE_EDITOR_PRIVATE (editor);
|
|
Packit |
1e8aac |
GtkWidget *editable;
|
|
Packit |
1e8aac |
GList *list;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (list = priv->editables; list; list = list->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
editable = list->data;
|
|
Packit |
1e8aac |
if (type !=
|
|
Packit |
1e8aac |
GPOINTER_TO_INT (g_object_get_data
|
|
Packit |
1e8aac |
(G_OBJECT (editable), "glade-editor-page-type")))
|
|
Packit |
1e8aac |
continue;
|
|
Packit |
1e8aac |
if (g_object_get_data (G_OBJECT (editable), "glade-widget-adaptor") ==
|
|
Packit |
1e8aac |
adaptor)
|
|
Packit |
1e8aac |
return editable;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
editable = (GtkWidget *) glade_widget_adaptor_create_editable (adaptor, type);
|
|
Packit |
1e8aac |
g_return_val_if_fail (editable != NULL, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_set_data (G_OBJECT (editable), "glade-editor-page-type",
|
|
Packit |
1e8aac |
GINT_TO_POINTER (type));
|
|
Packit |
1e8aac |
g_object_set_data (G_OBJECT (editable), "glade-widget-adaptor", adaptor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (type != GLADE_PAGE_PACKING)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
priv->editables = g_list_prepend (priv->editables, editable);
|
|
Packit |
1e8aac |
g_object_ref_sink (editable);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return editable;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
hide_or_remove_visible_child (GtkContainer *container, gboolean remove)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *l, *children = gtk_container_get_children (container);
|
|
Packit |
1e8aac |
GtkWidget *widget;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (l = children; l; l = l->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
widget = l->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (gtk_widget_get_visible (widget))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_widget_hide (widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (remove)
|
|
Packit |
1e8aac |
gtk_container_remove (container, widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
g_list_free (children);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GtkWidget *
|
|
Packit |
1e8aac |
glade_editor_load_editable_in_page (GladeEditor *editor,
|
|
Packit |
1e8aac |
GladeWidgetAdaptor *adaptor,
|
|
Packit |
1e8aac |
GladeEditorPageType type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorPrivate *priv = GLADE_EDITOR_PRIVATE (editor);
|
|
Packit |
1e8aac |
GtkContainer *container = NULL;
|
|
Packit |
1e8aac |
GtkWidget *scrolled_window, *editable;
|
|
Packit |
1e8aac |
GtkAdjustment *adj;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Remove the old table that was in this container */
|
|
Packit |
1e8aac |
switch (type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case GLADE_PAGE_GENERAL:
|
|
Packit |
1e8aac |
container = GTK_CONTAINER (priv->page_widget);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GLADE_PAGE_COMMON:
|
|
Packit |
1e8aac |
container = GTK_CONTAINER (priv->page_common);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GLADE_PAGE_PACKING:
|
|
Packit |
1e8aac |
container = GTK_CONTAINER (priv->page_packing);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GLADE_PAGE_ATK:
|
|
Packit |
1e8aac |
container = GTK_CONTAINER (priv->page_atk);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
case GLADE_PAGE_QUERY:
|
|
Packit |
1e8aac |
default:
|
|
Packit |
1e8aac |
g_critical ("Unreachable code reached !");
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Hide the editable (this will destroy on packing pages) */
|
|
Packit |
1e8aac |
hide_or_remove_visible_child (container, type == GLADE_PAGE_PACKING);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!adaptor)
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((editable =
|
|
Packit |
1e8aac |
glade_editor_get_editable_by_adaptor (editor, adaptor, type)) == NULL)
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Attach the new page */
|
|
Packit |
1e8aac |
if (!gtk_widget_get_parent (editable))
|
|
Packit |
1e8aac |
gtk_container_add (GTK_CONTAINER (container), editable);
|
|
Packit |
1e8aac |
gtk_widget_show (editable);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((scrolled_window =
|
|
Packit |
1e8aac |
gtk_widget_get_ancestor (GTK_WIDGET (container),
|
|
Packit |
1e8aac |
GTK_TYPE_SCROLLED_WINDOW)) != NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window));
|
|
Packit |
1e8aac |
gtk_container_set_focus_vadjustment (GTK_CONTAINER (editable), adj);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
adj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window));
|
|
Packit |
1e8aac |
gtk_container_set_focus_hadjustment (GTK_CONTAINER (editable), adj);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return editable;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_load_widget_class (GladeEditor *editor,
|
|
Packit |
1e8aac |
GladeWidgetAdaptor *adaptor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_editor_load_editable_in_page (editor, adaptor, GLADE_PAGE_GENERAL);
|
|
Packit |
1e8aac |
glade_editor_load_editable_in_page (editor, adaptor, GLADE_PAGE_COMMON);
|
|
Packit |
1e8aac |
glade_editor_load_editable_in_page (editor, adaptor, GLADE_PAGE_ATK);
|
|
Packit |
1e8aac |
glade_editor_load_editable_in_page (editor, NULL, GLADE_PAGE_PACKING);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
editor->priv->loaded_adaptor = adaptor;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_close_cb (GladeProject *project, GladeEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* project we are viewing was closed,
|
|
Packit |
1e8aac |
* detatch from editor.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
glade_editor_load_widget (editor, NULL);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_removed_cb (GladeProject *project,
|
|
Packit |
1e8aac |
GladeWidget *widget,
|
|
Packit |
1e8aac |
GladeEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Widget we were viewing was removed from project,
|
|
Packit |
1e8aac |
* detatch from editor.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (widget == editor->priv->loaded_widget)
|
|
Packit |
1e8aac |
glade_editor_load_widget (editor, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_load_editable (GladeEditor *editor,
|
|
Packit |
1e8aac |
GladeWidget *widget,
|
|
Packit |
1e8aac |
GladeEditorPageType type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *editable;
|
|
Packit |
1e8aac |
GladeWidget *parent = glade_widget_get_parent (widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Use the parenting adaptor for packing pages... so deffer creating the widgets
|
|
Packit |
1e8aac |
* until load time.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (type == GLADE_PAGE_PACKING)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidgetAdaptor *adaptor;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!parent)
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
adaptor = glade_widget_get_adaptor (parent);
|
|
Packit |
1e8aac |
editable =
|
|
Packit |
1e8aac |
glade_editor_load_editable_in_page (editor, adaptor,
|
|
Packit |
1e8aac |
GLADE_PAGE_PACKING);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
editable =
|
|
Packit |
1e8aac |
glade_editor_get_editable_by_adaptor (editor,
|
|
Packit |
1e8aac |
glade_widget_get_adaptor (widget),
|
|
Packit |
1e8aac |
type);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_assert (editable);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!widget)
|
|
Packit |
1e8aac |
gtk_widget_hide (editable);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_editable_load (GLADE_EDITABLE (editable), widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (widget)
|
|
Packit |
1e8aac |
gtk_widget_show (editable);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
clear_editables (GladeEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditable *editable;
|
|
Packit |
1e8aac |
GList *l;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (l = editor->priv->editables; l; l = l->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
editable = l->data;
|
|
Packit |
1e8aac |
glade_editable_load (editable, NULL);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_load_widget_real (GladeEditor *editor, GladeWidget *widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorPrivate *priv = GLADE_EDITOR_PRIVATE (editor);
|
|
Packit |
1e8aac |
GladeWidgetAdaptor *adaptor;
|
|
Packit |
1e8aac |
GladeProject *project;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Disconnect from last widget */
|
|
Packit |
1e8aac |
if (priv->loaded_widget != NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* better pay a small price now and avoid unseen editables
|
|
Packit |
1e8aac |
* waking up on project metadata changes.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
clear_editables (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
project = glade_widget_get_project (priv->loaded_widget);
|
|
Packit |
1e8aac |
g_signal_handler_disconnect (G_OBJECT (project),
|
|
Packit |
1e8aac |
priv->project_closed_signal_id);
|
|
Packit |
1e8aac |
g_signal_handler_disconnect (G_OBJECT (project),
|
|
Packit |
1e8aac |
priv->project_removed_signal_id);
|
|
Packit |
1e8aac |
g_signal_handler_disconnect (G_OBJECT (priv->loaded_widget),
|
|
Packit |
1e8aac |
priv->widget_warning_id);
|
|
Packit |
1e8aac |
g_signal_handler_disconnect (G_OBJECT (priv->loaded_widget),
|
|
Packit |
1e8aac |
priv->widget_name_id);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Load the GladeWidgetClass */
|
|
Packit |
1e8aac |
adaptor = widget ? glade_widget_get_adaptor (widget) : NULL;
|
|
Packit |
1e8aac |
if (priv->loaded_adaptor != adaptor || adaptor == NULL)
|
|
Packit |
1e8aac |
glade_editor_load_widget_class (editor, adaptor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_signal_editor_load_widget (priv->signal_editor, widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* we are just clearing, we are done */
|
|
Packit |
1e8aac |
if (widget == NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
priv->loaded_widget = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Clear class header */
|
|
Packit |
1e8aac |
glade_editor_update_class_field (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (editor), properties[PROP_WIDGET]);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
priv->loading = TRUE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Load each GladeEditorProperty from 'widget' */
|
|
Packit |
1e8aac |
glade_editor_load_editable (editor, widget, GLADE_PAGE_GENERAL);
|
|
Packit |
1e8aac |
glade_editor_load_editable (editor, widget, GLADE_PAGE_COMMON);
|
|
Packit |
1e8aac |
glade_editor_load_editable (editor, widget, GLADE_PAGE_ATK);
|
|
Packit |
1e8aac |
glade_editor_load_editable (editor, widget, GLADE_PAGE_PACKING);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
priv->loaded_widget = widget;
|
|
Packit |
1e8aac |
priv->loading = FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Update class header */
|
|
Packit |
1e8aac |
glade_editor_update_class_field (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Connect to new widget */
|
|
Packit |
1e8aac |
project = glade_widget_get_project (priv->loaded_widget);
|
|
Packit |
1e8aac |
priv->project_closed_signal_id =
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (project), "close",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_editor_close_cb), editor);
|
|
Packit |
1e8aac |
priv->project_removed_signal_id =
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (project), "remove-widget",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_editor_removed_cb), editor);
|
|
Packit |
1e8aac |
priv->widget_warning_id =
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (widget), "notify::support-warning",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_editor_update_class_warning_cb),
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
priv->widget_name_id =
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (widget), "notify::name",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_editor_update_widget_name_cb),
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (editor), properties[PROP_WIDGET]);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_editor_new:
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: a new #GladeEditor
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
GladeEditor *
|
|
Packit |
1e8aac |
glade_editor_new (void)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditor *editor;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
editor = g_object_new (GLADE_TYPE_EDITOR, "spacing", 6, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return editor;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_editor_load_widget:
|
|
Packit |
1e8aac |
* @editor: a #GladeEditor
|
|
Packit |
1e8aac |
* @widget: a #GladeWidget
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Load @widget into @editor. If @widget is %NULL, clear the editor.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_editor_load_widget (GladeEditor *editor, GladeWidget *widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_EDITOR (editor));
|
|
Packit |
1e8aac |
g_return_if_fail (widget == NULL || GLADE_IS_WIDGET (widget));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (editor->priv->loaded_widget == widget)
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_editor_load_widget_real (editor, widget);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
query_dialog_style_set_cb (GtkWidget *dialog,
|
|
Packit |
1e8aac |
GtkStyle *previous_style,
|
|
Packit |
1e8aac |
gpointer user_data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *content_area, *action_area;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
|
|
Packit |
1e8aac |
gtk_container_set_border_width (GTK_CONTAINER (content_area), 12);
|
|
Packit |
1e8aac |
gtk_box_set_spacing (GTK_BOX (content_area), 12);
|
|
Packit |
1e8aac |
action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
|
|
Packit |
1e8aac |
gtk_container_set_border_width (GTK_CONTAINER (action_area), 0);
|
|
Packit |
1e8aac |
gtk_box_set_spacing (GTK_BOX (action_area), 6);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
query_dialog_delete_event_cb (GtkDialog *dialog,
|
|
Packit |
1e8aac |
GdkEvent *event,
|
|
Packit |
1e8aac |
gpointer user_data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_dialog_response (dialog, GTK_RESPONSE_CANCEL);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean
|
|
Packit |
1e8aac |
glade_editor_query_dialog (GladeWidget *widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidgetAdaptor *adaptor;
|
|
Packit |
1e8aac |
GtkWidget *dialog, *editable, *content_area;
|
|
Packit |
1e8aac |
GtkWidget *create;
|
|
Packit |
1e8aac |
gchar *title;
|
|
Packit |
1e8aac |
gint answer;
|
|
Packit |
1e8aac |
gboolean retval = TRUE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_WIDGET (widget), FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
adaptor = glade_widget_get_adaptor (widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
title = g_strdup_printf (_("Create a %s"), glade_widget_adaptor_get_name (adaptor));
|
|
Packit |
1e8aac |
dialog = gtk_dialog_new_with_buttons (title, NULL,
|
|
Packit |
1e8aac |
GTK_DIALOG_MODAL |
|
|
Packit |
1e8aac |
GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
Packit |
1e8aac |
_("_Cancel"), GTK_RESPONSE_CANCEL,
|
|
Packit |
1e8aac |
NULL);
|
|
Packit |
1e8aac |
g_free (title);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
create = gtk_button_new_with_mnemonic (_("Crea_te"));
|
|
Packit |
1e8aac |
gtk_widget_show (create);
|
|
Packit |
1e8aac |
gtk_widget_set_can_default (create, TRUE);
|
|
Packit |
1e8aac |
gtk_dialog_add_action_widget (GTK_DIALOG (dialog), create, GTK_RESPONSE_OK);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
|
|
Packit |
1e8aac |
GTK_RESPONSE_OK,
|
|
Packit |
1e8aac |
GTK_RESPONSE_CANCEL, -1);
|
|
Packit |
1e8aac |
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
editable = (GtkWidget *) glade_widget_adaptor_create_editable (adaptor, GLADE_PAGE_QUERY);
|
|
Packit |
1e8aac |
gtk_widget_show (editable);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (content_area), editable, FALSE, FALSE, 6);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_editable_load (GLADE_EDITABLE (editable), widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (dialog, "style-set",
|
|
Packit |
1e8aac |
G_CALLBACK (query_dialog_style_set_cb), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (dialog, "delete-event",
|
|
Packit |
1e8aac |
G_CALLBACK (query_dialog_delete_event_cb), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
answer = gtk_dialog_run (GTK_DIALOG (dialog));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* If user cancel's we cancel the whole "create operation" by
|
|
Packit |
1e8aac |
* return FALSE. glade_widget_new() will see the FALSE, and
|
|
Packit |
1e8aac |
* take care of canceling the "create" operation.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (answer == GTK_RESPONSE_CANCEL)
|
|
Packit |
1e8aac |
retval = FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_destroy (dialog);
|
|
Packit |
1e8aac |
return retval;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
enum
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
COLUMN_ENABLED = 0,
|
|
Packit |
1e8aac |
COLUMN_PROP_NAME,
|
|
Packit |
1e8aac |
COLUMN_PROPERTY,
|
|
Packit |
1e8aac |
COLUMN_WEIGHT,
|
|
Packit |
1e8aac |
COLUMN_CHILD,
|
|
Packit |
1e8aac |
COLUMN_DEFAULT,
|
|
Packit |
1e8aac |
COLUMN_NDEFAULT,
|
|
Packit |
1e8aac |
COLUMN_DEFSTRING,
|
|
Packit |
1e8aac |
NUM_COLUMNS
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_reset_toggled (GtkCellRendererToggle *cell,
|
|
Packit |
1e8aac |
gchar *path_str,
|
|
Packit |
1e8aac |
GtkTreeModel *model)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
gboolean enabled;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* get toggled iter */
|
|
Packit |
1e8aac |
gtk_tree_model_get_iter (model, &iter, path);
|
|
Packit |
1e8aac |
gtk_tree_model_get (model, &iter, COLUMN_ENABLED, &enabled, -1);
|
|
Packit |
1e8aac |
gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
|
|
Packit |
1e8aac |
COLUMN_ENABLED, !enabled, -1);
|
|
Packit |
1e8aac |
gtk_tree_path_free (path);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GtkWidget *
|
|
Packit |
1e8aac |
glade_editor_reset_view (void)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *view_widget;
|
|
Packit |
1e8aac |
GtkTreeModel *model;
|
|
Packit |
1e8aac |
GtkCellRenderer *renderer;
|
|
Packit |
1e8aac |
GtkTreeViewColumn *column;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
model = (GtkTreeModel *) gtk_tree_store_new (NUM_COLUMNS, G_TYPE_BOOLEAN, /* Enabled value */
|
|
Packit |
1e8aac |
G_TYPE_STRING, /* Property name */
|
|
Packit |
1e8aac |
GLADE_TYPE_PROPERTY, /* The property */
|
|
Packit |
1e8aac |
G_TYPE_INT, /* Parent node ? */
|
|
Packit |
1e8aac |
G_TYPE_BOOLEAN, /* Child node ? */
|
|
Packit |
1e8aac |
G_TYPE_BOOLEAN, /* Has default value */
|
|
Packit |
1e8aac |
G_TYPE_BOOLEAN, /* Doesn't have defaut */
|
|
Packit |
1e8aac |
G_TYPE_STRING); /* Default string */
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
view_widget = gtk_tree_view_new_with_model (model);
|
|
Packit |
1e8aac |
g_object_set (G_OBJECT (view_widget), "enable-search", FALSE, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/********************* fake invisible column *********************/
|
|
Packit |
1e8aac |
renderer = gtk_cell_renderer_text_new ();
|
|
Packit |
1e8aac |
g_object_set (G_OBJECT (renderer), "editable", FALSE, "visible", FALSE, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
column = gtk_tree_view_column_new_with_attributes (NULL, renderer, NULL);
|
|
Packit |
1e8aac |
gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_column_set_visible (column, FALSE);
|
|
Packit |
1e8aac |
gtk_tree_view_set_expander_column (GTK_TREE_VIEW (view_widget), column);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/************************ enabled column ************************/
|
|
Packit |
1e8aac |
renderer = gtk_cell_renderer_toggle_new ();
|
|
Packit |
1e8aac |
g_object_set (G_OBJECT (renderer),
|
|
Packit |
1e8aac |
"mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE,
|
|
Packit |
1e8aac |
"activatable", TRUE, NULL);
|
|
Packit |
1e8aac |
g_signal_connect (renderer, "toggled",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_editor_reset_toggled), model);
|
|
Packit |
1e8aac |
gtk_tree_view_insert_column_with_attributes
|
|
Packit |
1e8aac |
(GTK_TREE_VIEW (view_widget), COLUMN_ENABLED,
|
|
Packit |
1e8aac |
_("Reset"), renderer,
|
|
Packit |
1e8aac |
"sensitive", COLUMN_NDEFAULT,
|
|
Packit |
1e8aac |
"activatable", COLUMN_NDEFAULT,
|
|
Packit |
1e8aac |
"active", COLUMN_ENABLED, "visible", COLUMN_CHILD, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/********************* property name column *********************/
|
|
Packit |
1e8aac |
renderer = gtk_cell_renderer_text_new ();
|
|
Packit |
1e8aac |
g_object_set (G_OBJECT (renderer), "editable", FALSE, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_insert_column_with_attributes
|
|
Packit |
1e8aac |
(GTK_TREE_VIEW (view_widget), COLUMN_PROP_NAME,
|
|
Packit |
1e8aac |
_("Property"), renderer,
|
|
Packit |
1e8aac |
"text", COLUMN_PROP_NAME, "weight", COLUMN_WEIGHT, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/******************* default indicator column *******************/
|
|
Packit |
1e8aac |
renderer = gtk_cell_renderer_text_new ();
|
|
Packit |
1e8aac |
g_object_set (G_OBJECT (renderer),
|
|
Packit |
1e8aac |
"editable", FALSE,
|
|
Packit |
1e8aac |
"style", PANGO_STYLE_ITALIC, "foreground", "Gray", NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_insert_column_with_attributes
|
|
Packit |
1e8aac |
(GTK_TREE_VIEW (view_widget), COLUMN_DEFSTRING,
|
|
Packit |
1e8aac |
NULL, renderer,
|
|
Packit |
1e8aac |
"text", COLUMN_DEFSTRING, "visible", COLUMN_DEFAULT, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return view_widget;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_populate_reset_view (GladeWidget *widget, GtkTreeView *tree_view)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeStore *model = GTK_TREE_STORE (gtk_tree_view_get_model (tree_view));
|
|
Packit |
1e8aac |
GtkTreeIter property_iter, general_iter, common_iter, atk_iter, *iter;
|
|
Packit |
1e8aac |
GList *list;
|
|
Packit |
1e8aac |
GladeProperty *property;
|
|
Packit |
1e8aac |
GladePropertyClass *pclass;
|
|
Packit |
1e8aac |
gboolean def;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (widget != NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_store_append (model, &general_iter, NULL);
|
|
Packit |
1e8aac |
gtk_tree_store_set (model, &general_iter,
|
|
Packit |
1e8aac |
COLUMN_PROP_NAME, _("General"),
|
|
Packit |
1e8aac |
COLUMN_PROPERTY, NULL,
|
|
Packit |
1e8aac |
COLUMN_WEIGHT, PANGO_WEIGHT_BOLD,
|
|
Packit |
1e8aac |
COLUMN_CHILD, FALSE,
|
|
Packit |
1e8aac |
COLUMN_DEFAULT, FALSE, COLUMN_NDEFAULT, FALSE, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_store_append (model, &common_iter, NULL);
|
|
Packit |
1e8aac |
gtk_tree_store_set (model, &common_iter,
|
|
Packit |
1e8aac |
COLUMN_PROP_NAME, _("Common"),
|
|
Packit |
1e8aac |
COLUMN_PROPERTY, NULL,
|
|
Packit |
1e8aac |
COLUMN_WEIGHT, PANGO_WEIGHT_BOLD,
|
|
Packit |
1e8aac |
COLUMN_CHILD, FALSE,
|
|
Packit |
1e8aac |
COLUMN_DEFAULT, FALSE, COLUMN_NDEFAULT, FALSE, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_store_append (model, &atk_iter, NULL);
|
|
Packit |
1e8aac |
gtk_tree_store_set (model, &atk_iter,
|
|
Packit |
1e8aac |
COLUMN_PROP_NAME, _("Accessibility"),
|
|
Packit |
1e8aac |
COLUMN_PROPERTY, NULL,
|
|
Packit |
1e8aac |
COLUMN_WEIGHT, PANGO_WEIGHT_BOLD,
|
|
Packit |
1e8aac |
COLUMN_CHILD, FALSE,
|
|
Packit |
1e8aac |
COLUMN_DEFAULT, FALSE, COLUMN_NDEFAULT, FALSE, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* General & Common */
|
|
Packit |
1e8aac |
for (list = glade_widget_get_properties (widget); list; list = list->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
property = list->data;
|
|
Packit |
1e8aac |
pclass = glade_property_get_class (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_property_class_is_visible (pclass) == FALSE)
|
|
Packit |
1e8aac |
continue;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_property_class_atk (pclass))
|
|
Packit |
1e8aac |
iter = &atk_iter;
|
|
Packit |
1e8aac |
else if (glade_property_class_common (pclass))
|
|
Packit |
1e8aac |
iter = &common_iter;
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
iter = &general_iter;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
def = glade_property_default (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_store_append (model, &property_iter, iter);
|
|
Packit |
1e8aac |
gtk_tree_store_set (model, &property_iter,
|
|
Packit |
1e8aac |
COLUMN_ENABLED, !def,
|
|
Packit |
1e8aac |
COLUMN_PROP_NAME, glade_property_class_get_name (pclass),
|
|
Packit |
1e8aac |
COLUMN_PROPERTY, property,
|
|
Packit |
1e8aac |
COLUMN_WEIGHT, PANGO_WEIGHT_NORMAL,
|
|
Packit |
1e8aac |
COLUMN_CHILD, TRUE,
|
|
Packit |
1e8aac |
COLUMN_DEFAULT, def,
|
|
Packit |
1e8aac |
COLUMN_NDEFAULT, !def,
|
|
Packit |
1e8aac |
COLUMN_DEFSTRING, _("(default)"), -1);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_editor_reset_selection_changed_cb (GtkTreeSelection *selection,
|
|
Packit |
1e8aac |
GtkTextView *desc_view)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
GladeProperty *property = NULL;
|
|
Packit |
1e8aac |
GtkTreeModel *model = NULL;
|
|
Packit |
1e8aac |
GtkTextBuffer *text_buffer;
|
|
Packit |
1e8aac |
GladePropertyClass *pclass = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
const gchar *message =
|
|
Packit |
1e8aac |
_("Select the properties that you want to reset to their default values");
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Find selected data and show property blurb here */
|
|
Packit |
1e8aac |
if (gtk_tree_selection_get_selected (selection, &model, &iter))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (desc_view));
|
|
Packit |
1e8aac |
gtk_tree_model_get (model, &iter, COLUMN_PROPERTY, &property, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (property)
|
|
Packit |
1e8aac |
pclass = glade_property_get_class (property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_text_buffer_set_text (text_buffer,
|
|
Packit |
1e8aac |
pclass ? glade_property_class_get_tooltip (pclass) : message,
|
|
Packit |
1e8aac |
-1);
|
|
Packit |
1e8aac |
if (property)
|
|
Packit |
1e8aac |
g_object_unref (G_OBJECT (property));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_editor_reset_foreach_selection (GtkTreeModel *model,
|
|
Packit |
1e8aac |
GtkTreePath *path,
|
|
Packit |
1e8aac |
GtkTreeIter *iter,
|
|
Packit |
1e8aac |
gboolean select)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gboolean def;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (model, iter, COLUMN_DEFAULT, &def, -1);
|
|
Packit |
1e8aac |
/* Dont modify rows that are already default */
|
|
Packit |
1e8aac |
if (def == FALSE)
|
|
Packit |
1e8aac |
gtk_tree_store_set (GTK_TREE_STORE (model), iter,
|
|
Packit |
1e8aac |
COLUMN_ENABLED, select, -1);
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_reset_select_all_clicked (GtkButton *button,
|
|
Packit |
1e8aac |
GtkTreeView *tree_view)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
|
|
Packit |
1e8aac |
gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc)
|
|
Packit |
1e8aac |
glade_editor_reset_foreach_selection,
|
|
Packit |
1e8aac |
GINT_TO_POINTER (TRUE));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_reset_unselect_all_clicked (GtkButton *button,
|
|
Packit |
1e8aac |
GtkTreeView *tree_view)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
|
|
Packit |
1e8aac |
gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc)
|
|
Packit |
1e8aac |
glade_editor_reset_foreach_selection,
|
|
Packit |
1e8aac |
GINT_TO_POINTER (FALSE));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_editor_reset_accumulate_selected_props (GtkTreeModel *model,
|
|
Packit |
1e8aac |
GtkTreePath *path,
|
|
Packit |
1e8aac |
GtkTreeIter *iter,
|
|
Packit |
1e8aac |
GList **accum)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeProperty *property;
|
|
Packit |
1e8aac |
gboolean enabled, def;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (model, iter,
|
|
Packit |
1e8aac |
COLUMN_PROPERTY, &property,
|
|
Packit |
1e8aac |
COLUMN_ENABLED, &enabled, COLUMN_DEFAULT, &def, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (property && enabled && !def)
|
|
Packit |
1e8aac |
*accum = g_list_prepend (*accum, property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (property)
|
|
Packit |
1e8aac |
g_object_unref (G_OBJECT (property));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GList *
|
|
Packit |
1e8aac |
glade_editor_reset_get_selected_props (GtkTreeModel *model)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *ret = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc)
|
|
Packit |
1e8aac |
glade_editor_reset_accumulate_selected_props, &ret;;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return ret;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_editor_reset_properties (GList *props)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *list, *sdata_list = NULL;
|
|
Packit |
1e8aac |
GCSetPropData *sdata;
|
|
Packit |
1e8aac |
GladeProperty *prop;
|
|
Packit |
1e8aac |
GladeWidget *widget;
|
|
Packit |
1e8aac |
GladeProject *project = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (list = props; list; list = list->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
prop = list->data;
|
|
Packit |
1e8aac |
widget = glade_property_get_widget (prop);
|
|
Packit |
1e8aac |
project = glade_widget_get_project (widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
sdata = g_new (GCSetPropData, 1);
|
|
Packit |
1e8aac |
sdata->property = prop;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
sdata->old_value = g_new0 (GValue, 1);
|
|
Packit |
1e8aac |
sdata->new_value = g_new0 (GValue, 1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_get_value (prop, sdata->old_value);
|
|
Packit |
1e8aac |
glade_property_get_default (prop, sdata->new_value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
sdata_list = g_list_prepend (sdata_list, sdata);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (project)
|
|
Packit |
1e8aac |
/* GladeCommand takes ownership of allocated list, ugly but practicle */
|
|
Packit |
1e8aac |
glade_command_set_properties_list (project, sdata_list);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_editor_reset_dialog_run (GtkWidget *parent, GladeWidget *gwidget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeSelection *selection;
|
|
Packit |
1e8aac |
GtkWidget *dialog;
|
|
Packit |
1e8aac |
GtkWidget *vbox, *hbox, *label, *sw, *button;
|
|
Packit |
1e8aac |
GtkWidget *tree_view, *description_view;
|
|
Packit |
1e8aac |
gint res;
|
|
Packit |
1e8aac |
GList *list;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
dialog = gtk_dialog_new_with_buttons (_("Reset Widget Properties"),
|
|
Packit |
1e8aac |
parent ? GTK_WINDOW (parent) : NULL,
|
|
Packit |
1e8aac |
GTK_DIALOG_MODAL |
|
|
Packit |
1e8aac |
GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
Packit |
1e8aac |
_("_Cancel"), GTK_RESPONSE_CANCEL,
|
|
Packit |
1e8aac |
_("_OK"), GTK_RESPONSE_OK, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
|
|
Packit |
1e8aac |
gtk_widget_show (vbox);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX
|
|
Packit |
1e8aac |
(gtk_dialog_get_content_area (GTK_DIALOG (dialog))), vbox,
|
|
Packit |
1e8aac |
TRUE, TRUE, 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Checklist */
|
|
Packit |
1e8aac |
label = gtk_label_new_with_mnemonic (_("_Properties:"));
|
|
Packit |
1e8aac |
gtk_widget_show (label);
|
|
Packit |
1e8aac |
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
sw = gtk_scrolled_window_new (NULL, NULL);
|
|
Packit |
1e8aac |
gtk_widget_show (sw);
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
|
|
Packit |
1e8aac |
gtk_widget_set_size_request (sw, 400, 200);
|
|
Packit |
1e8aac |
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
|
Packit |
1e8aac |
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
|
Packit |
1e8aac |
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
tree_view = glade_editor_reset_view ();
|
|
Packit |
1e8aac |
if (gwidget)
|
|
Packit |
1e8aac |
glade_editor_populate_reset_view (gwidget, GTK_TREE_VIEW (tree_view));
|
|
Packit |
1e8aac |
gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_show (tree_view);
|
|
Packit |
1e8aac |
gtk_label_set_mnemonic_widget (GTK_LABEL (label), tree_view);
|
|
Packit |
1e8aac |
gtk_container_add (GTK_CONTAINER (sw), tree_view);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Select all / Unselect all */
|
|
Packit |
1e8aac |
hbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
|
|
Packit |
1e8aac |
gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_END);
|
|
Packit |
1e8aac |
gtk_widget_show (hbox);
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
button = gtk_button_new_with_mnemonic (_("_Select All"));
|
|
Packit |
1e8aac |
gtk_widget_show (button);
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
|
|
Packit |
1e8aac |
gtk_container_set_border_width (GTK_CONTAINER (button), 6);
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (button), "clicked",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_editor_reset_select_all_clicked),
|
|
Packit |
1e8aac |
tree_view);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
button = gtk_button_new_with_mnemonic (_("_Unselect All"));
|
|
Packit |
1e8aac |
gtk_widget_show (button);
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
|
|
Packit |
1e8aac |
gtk_container_set_border_width (GTK_CONTAINER (button), 6);
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (button), "clicked",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_editor_reset_unselect_all_clicked),
|
|
Packit |
1e8aac |
tree_view);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Description */
|
|
Packit |
1e8aac |
label = gtk_label_new_with_mnemonic (_("Property _Description:"));
|
|
Packit |
1e8aac |
gtk_widget_show (label);
|
|
Packit |
1e8aac |
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
sw = gtk_scrolled_window_new (NULL, NULL);
|
|
Packit |
1e8aac |
gtk_widget_show (sw);
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
|
|
Packit |
1e8aac |
gtk_widget_set_size_request (sw, 400, 80);
|
|
Packit |
1e8aac |
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
|
|
Packit |
1e8aac |
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
|
Packit |
1e8aac |
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
description_view = gtk_text_view_new ();
|
|
Packit |
1e8aac |
gtk_text_view_set_editable (GTK_TEXT_VIEW (description_view), FALSE);
|
|
Packit |
1e8aac |
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (description_view), GTK_WRAP_WORD);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_show (description_view);
|
|
Packit |
1e8aac |
gtk_label_set_mnemonic_widget (GTK_LABEL (label), description_view);
|
|
Packit |
1e8aac |
gtk_container_add (GTK_CONTAINER (sw), description_view);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Update description */
|
|
Packit |
1e8aac |
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (selection), "changed",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_editor_reset_selection_changed_cb),
|
|
Packit |
1e8aac |
description_view);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Run the dialog */
|
|
Packit |
1e8aac |
res = gtk_dialog_run (GTK_DIALOG (dialog));
|
|
Packit |
1e8aac |
if (res == GTK_RESPONSE_OK)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* get all selected properties and reset properties through glade_command */
|
|
Packit |
1e8aac |
if ((list = glade_editor_reset_get_selected_props
|
|
Packit |
1e8aac |
(gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view)))) != NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_editor_reset_properties (list);
|
|
Packit |
1e8aac |
g_list_free (list);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
gtk_widget_destroy (dialog);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_editor_show_info (GladeEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_warning ("%s function is deprecated and does nothing", __func__);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_editor_hide_info (GladeEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_warning ("%s function is deprecated and does nothing", __func__);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_editor_show_class_field (GladeEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorPrivate *priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_EDITOR (editor));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
priv = GLADE_EDITOR_PRIVATE (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (priv->show_class_field != TRUE)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
priv->show_class_field = TRUE;
|
|
Packit |
1e8aac |
gtk_widget_show (priv->class_field);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (editor), properties[PROP_SHOW_CLASS_FIELD]);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_editor_hide_class_field (GladeEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorPrivate *priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_EDITOR (editor));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
priv = GLADE_EDITOR_PRIVATE (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (priv->show_class_field != FALSE)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
priv->show_class_field = FALSE;
|
|
Packit |
1e8aac |
gtk_widget_hide (priv->class_field);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (editor), properties[PROP_SHOW_CLASS_FIELD]);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
editor_widget_name_changed (GladeWidget *widget,
|
|
Packit |
1e8aac |
GParamSpec *pspec,
|
|
Packit |
1e8aac |
GtkWindow *window)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gchar *title, *prj_name;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
prj_name = glade_project_get_name (glade_widget_get_project (widget));
|
|
Packit |
1e8aac |
/* Translators: first %s is the project name, second is a widget name */
|
|
Packit |
1e8aac |
title = g_strdup_printf (_("%s - %s Properties"), prj_name,
|
|
Packit |
1e8aac |
glade_widget_get_display_name (widget));
|
|
Packit |
1e8aac |
gtk_window_set_title (window, title);
|
|
Packit |
1e8aac |
g_free (title);
|
|
Packit |
1e8aac |
g_free (prj_name);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_editor_dialog_for_widget:
|
|
Packit |
1e8aac |
* @widget: a #GladeWidget
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This convenience function creates a new dialog window to edit @widget
|
|
Packit |
1e8aac |
* specifically.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: the newly created dialog window
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
GtkWidget *
|
|
Packit |
1e8aac |
glade_editor_dialog_for_widget (GladeWidget *widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *window, *editor;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_WIDGET (widget), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Window */
|
|
Packit |
1e8aac |
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
Packit |
1e8aac |
gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_UTILITY);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Keep the title up to date */
|
|
Packit |
1e8aac |
editor_widget_name_changed (widget, NULL, GTK_WINDOW (window));
|
|
Packit |
1e8aac |
g_signal_connect_object (G_OBJECT (widget), "notify::name",
|
|
Packit |
1e8aac |
G_CALLBACK (editor_widget_name_changed), window, 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_app_get_accel_group ())
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_window_add_accel_group (GTK_WINDOW (window),
|
|
Packit |
1e8aac |
glade_app_get_accel_group ());
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (window), "key-press-event",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_utils_hijack_key_press), NULL);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
editor = (GtkWidget *)glade_editor_new ();
|
|
Packit |
1e8aac |
glade_editor_load_widget (GLADE_EDITOR (editor), widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect_swapped (G_OBJECT (editor), "notify::widget",
|
|
Packit |
1e8aac |
G_CALLBACK (gtk_widget_destroy), window);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_container_set_border_width (GTK_CONTAINER (editor), 6);
|
|
Packit |
1e8aac |
gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (editor));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_window_set_default_size (GTK_WINDOW (window), 400, 480);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_show (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return window;
|
|
Packit |
1e8aac |
}
|