summaryrefslogtreecommitdiff
path: root/gladeui
diff options
context:
space:
mode:
Diffstat (limited to 'gladeui')
-rw-r--r--gladeui/Makefile.am8
-rw-r--r--gladeui/glade-editable.c81
-rw-r--r--gladeui/glade-editable.h47
-rw-r--r--gladeui/glade-editor-property.c27
-rw-r--r--gladeui/glade-editor-property.h5
-rw-r--r--gladeui/glade-editor-table.c371
-rw-r--r--gladeui/glade-editor-table.h86
-rw-r--r--gladeui/glade-editor.c527
-rw-r--r--gladeui/glade-editor.h90
-rw-r--r--gladeui/glade-property-class.h25
-rw-r--r--gladeui/glade-widget-adaptor.c40
-rw-r--r--gladeui/glade-widget-adaptor.h27
-rw-r--r--gladeui/glade-xml-utils.h1
-rw-r--r--gladeui/glade.h2
14 files changed, 796 insertions, 541 deletions
diff --git a/gladeui/Makefile.am b/gladeui/Makefile.am
index 411a43f6..0e3adbbc 100644
--- a/gladeui/Makefile.am
+++ b/gladeui/Makefile.am
@@ -64,7 +64,9 @@ libgladeui_1_la_SOURCES = \
glade-accumulators.h \
glade-widget-action.c \
glade-name-context.c \
- glade-displayable-values.c
+ glade-displayable-values.c \
+ glade-editable.c \
+ glade-editor-table.c
libgladeui_1_la_CPPFLAGS = \
$(common_defines) \
@@ -115,7 +117,9 @@ libgladeuiinclude_HEADERS = \
glade-catalog.h \
glade-widget-action.h \
glade-name-context.h \
- glade-displayable-values.h
+ glade-displayable-values.h \
+ glade-editable.h \
+ glade-editor-table.h
if PLATFORM_WIN32
diff --git a/gladeui/glade-editable.c b/gladeui/glade-editable.c
new file mode 100644
index 00000000..68463316
--- /dev/null
+++ b/gladeui/glade-editable.c
@@ -0,0 +1,81 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * glade-name-context.c
+ *
+ * Copyright (C) 2008 Tristan Van Berkom.
+ *
+ * Authors:
+ * Tristan Van Berkom <tvb@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib/gi18n-lib.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+
+#include "glade-widget.h"
+#include "glade-editable.h"
+
+
+static void
+glade_editable_class_init (gpointer g_iface)
+{
+ /* */
+}
+
+GType
+glade_editable_get_type (void)
+{
+ static GType editable_type = 0;
+
+ if (!editable_type)
+ editable_type =
+ g_type_register_static_simple (G_TYPE_INTERFACE, "GladeEditable",
+ sizeof (GladeEditableIface),
+ (GClassInitFunc) glade_editable_class_init,
+ 0, NULL, (GTypeFlags)0);
+
+ return editable_type;
+}
+
+/**
+ * glade_editable_load:
+ * @editable: A #GladeEditable
+ * @widget: the #GladeWidget to load
+ *
+ */
+void
+glade_editable_load (GladeEditable *editable,
+ GladeWidget *widget)
+{
+ GladeEditableIface *iface;
+ g_return_if_fail (GLADE_IS_EDITABLE (editable));
+ g_return_if_fail (widget == NULL || GLADE_IS_WIDGET (widget));
+
+ iface = GLADE_EDITABLE_GET_IFACE (editable);
+
+ if (iface->load)
+ iface->load (editable, widget);
+ else
+ g_critical ("No GladeEditable::load() support on type %s",
+ G_OBJECT_TYPE_NAME (editable));
+}
diff --git a/gladeui/glade-editable.h b/gladeui/glade-editable.h
new file mode 100644
index 00000000..faea190f
--- /dev/null
+++ b/gladeui/glade-editable.h
@@ -0,0 +1,47 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+#ifndef __GLADE_EDITABLE_H__
+#define __GLADE_EDITABLE_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GLADE_TYPE_EDITABLE (glade_editable_get_type ())
+#define GLADE_EDITABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EDITABLE, GladeEditable))
+#define GLADE_EDITABLE_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GLADE_TYPE_EDITABLE, GladeEditableIface))
+#define GLADE_IS_EDITABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EDITABLE))
+#define GLADE_EDITABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GLADE_TYPE_EDITABLE, GladeEditableIface))
+
+
+typedef struct _GladeEditable GladeEditable; /* Dummy typedef */
+typedef struct _GladeEditableIface GladeEditableIface;
+
+typedef enum
+{
+ GLADE_PAGE_GENERAL,
+ GLADE_PAGE_COMMON,
+ GLADE_PAGE_PACKING,
+ GLADE_PAGE_ATK,
+ GLADE_PAGE_QUERY
+} GladeEditorPageType;
+
+
+struct _GladeEditableIface
+{
+ GTypeInterface g_iface;
+
+ /* virtual table */
+ void (* load) (GladeEditable *editable,
+ GladeWidget *widget);
+
+};
+
+GType glade_editable_get_type (void) G_GNUC_CONST;
+void glade_editable_load (GladeEditable *editable,
+ GladeWidget *widget);
+
+
+G_END_DECLS
+
+#endif /* __GLADE_EDITABLE_H__ */
diff --git a/gladeui/glade-editor-property.c b/gladeui/glade-editor-property.c
index 1f7c4546..11ec1eaf 100644
--- a/gladeui/glade-editor-property.c
+++ b/gladeui/glade-editor-property.c
@@ -57,16 +57,9 @@ enum {
PROP_USE_COMMAND
};
-enum {
- GTK_DOC_SEARCH,
- LAST_SIGNAL
-};
-
static GtkTableClass *table_class;
static GladeEditorPropertyClass *editor_property_class;
-static guint glade_editor_property_signals[LAST_SIGNAL] = { 0 };
-
#define GLADE_PROPERTY_TABLE_ROW_SPACING 2
#define FLAGS_COLUMN_SETTING 0
#define FLAGS_COLUMN_SYMBOL 1
@@ -570,26 +563,6 @@ glade_editor_property_class_init (GladeEditorPropertyClass *eprop_class)
eprop_class->load = glade_editor_property_load_common;
eprop_class->create_input = NULL;
- /**
- * GladeEditorProperty::gtk-doc-search:
- * @gladeeditor: the #GladeEditorProperty which received the signal.
- * @arg1: the (#gchar *) book to search or %NULL
- * @arg2: the (#gchar *) page to search or %NULL
- * @arg3: the (#gchar *) search string or %NULL
- *
- * Emitted when the editor property requests that a doc-search be performed.
- */
- glade_editor_property_signals[GTK_DOC_SEARCH] =
- g_signal_new ("gtk-doc-search",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GladeEditorPropertyClass,
- gtk_doc_search),
- NULL, NULL,
- glade_marshal_VOID__STRING_STRING_STRING,
- G_TYPE_NONE, 3,
- G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
-
/* Properties */
g_object_class_install_property
(object_class, PROP_PROPERTY_CLASS,
diff --git a/gladeui/glade-editor-property.h b/gladeui/glade-editor-property.h
index feb40daa..e085b4c3 100644
--- a/gladeui/glade-editor-property.h
+++ b/gladeui/glade-editor-property.h
@@ -123,11 +123,6 @@ struct _GladeEditorPropertyClass {
GtkWidget *(* create_input) (GladeEditorProperty *);
- void (* gtk_doc_search)(GladeEditorProperty *,
- const gchar *,
- const gchar *,
- const gchar *);
-
};
diff --git a/gladeui/glade-editor-table.c b/gladeui/glade-editor-table.c
new file mode 100644
index 00000000..93f7411b
--- /dev/null
+++ b/gladeui/glade-editor-table.c
@@ -0,0 +1,371 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008 Tristan Van Berkom.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Authors:
+ * Tristan Van Berkom <tvb@gnome.org>
+ */
+
+#include <config.h>
+#include <gladeui/glade.h>
+#include <glib/gi18n-lib.h>
+
+#include "glade-editor-table.h"
+
+static void glade_editor_table_init (GladeEditorTable *self);
+static void glade_editor_table_class_init (GladeEditorTableClass *klass);
+static void glade_editor_table_finalize (GObject *object);
+static void glade_editor_table_editable_init (GladeEditableIface *iface);
+static void glade_editor_table_grab_focus (GtkWidget *widget);
+static void append_packing_items (GladeEditorTable *table,
+ GladeWidget *widget);
+
+G_DEFINE_TYPE_WITH_CODE (GladeEditorTable, glade_editor_table, GTK_TYPE_TABLE,
+ G_IMPLEMENT_INTERFACE (GLADE_TYPE_EDITABLE,
+ glade_editor_table_editable_init));
+
+static void
+glade_editor_table_class_init (GladeEditorTableClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ object_class->finalize = glade_editor_table_finalize;
+ widget_class->grab_focus = glade_editor_table_grab_focus;
+}
+
+static void
+glade_editor_table_init (GladeEditorTable *self)
+{
+
+}
+
+static void
+glade_editor_table_finalize (GObject *object)
+{
+ GladeEditorTable *table = GLADE_EDITOR_TABLE (object);
+
+ table->properties =
+ (g_list_free (table->properties), NULL);
+ glade_editable_load (GLADE_EDITABLE (table), NULL);
+
+ G_OBJECT_CLASS (glade_editor_table_parent_class)->finalize (object);
+}
+
+static void
+glade_editor_table_grab_focus (GtkWidget *widget)
+{
+ GladeEditorTable *editor_table = GLADE_EDITOR_TABLE (widget);
+
+ if (editor_table->name_entry)
+ gtk_widget_grab_focus (editor_table->name_entry);
+ else if (editor_table->properties)
+ gtk_widget_grab_focus (GTK_WIDGET (editor_table->properties->data));
+ else
+ GTK_WIDGET_CLASS (glade_editor_table_parent_class)->grab_focus (widget);
+}
+
+
+static void
+widget_name_changed (GladeWidget *widget,
+ GParamSpec *pspec,
+ GladeEditorTable *table)
+{
+ table->loading = TRUE;
+ if (table->name_entry)
+ gtk_entry_set_text (GTK_ENTRY (table->name_entry), table->loaded_widget->name);
+ table->loading = FALSE;
+
+}
+
+static void
+widget_finalized (GladeEditorTable *table,
+ GladeWidget *where_widget_was)
+{
+ table->loaded_widget = NULL;
+
+ glade_editable_load (GLADE_EDITABLE (table), NULL);
+}
+
+
+static void
+glade_editor_table_load (GladeEditable *editable,
+ GladeWidget *widget)
+{
+ GladeEditorTable *table = GLADE_EDITOR_TABLE (editable);
+ GladeEditorProperty *property;
+ GList *list;
+
+ /* abort mission */
+ if ((!table->loaded_widget && !widget) ||
+ (table->loaded_widget && widget && table->loaded_widget == widget))
+ return;
+
+ table->loading = TRUE;
+
+ if (table->loaded_widget && table->name_entry)
+ {
+ g_signal_handlers_disconnect_by_func (G_OBJECT (table->loaded_widget),
+ G_CALLBACK (widget_name_changed), table);
+
+ /* The widget could die unexpectedly... */
+ g_object_weak_unref (G_OBJECT (table->loaded_widget),
+ (GWeakNotify)widget_finalized,
+ table);
+ }
+
+ table->loaded_widget = widget;
+
+ if (table->loaded_widget && table->name_entry)
+ {
+ g_signal_connect (G_OBJECT (table->loaded_widget), "notify::name",
+ G_CALLBACK (widget_name_changed), table);
+
+ /* The widget could die unexpectedly... */
+ g_object_weak_ref (G_OBJECT (table->loaded_widget),
+ (GWeakNotify)widget_finalized,
+ table);
+
+ gtk_entry_set_text (GTK_ENTRY (table->name_entry), widget->name);
+
+
+ }
+ else if (table->name_entry)
+ gtk_entry_set_text (GTK_ENTRY (table->name_entry), "");
+
+ /* If this is a packing page, we need to generate the properties here... */
+ if (table->loaded_widget && table->type == GLADE_PAGE_PACKING)
+ append_packing_items (table, table->loaded_widget);
+
+ /* Sync up properties, even if widget is NULL */
+ for (list = table->properties; list; list = list->next)
+ {
+ property = list->data;
+ glade_editor_property_load_by_widget (property, widget);
+ }
+
+ table->loading = FALSE;
+}
+
+static void
+glade_editor_table_editable_init (GladeEditableIface *iface)
+{
+ iface->load = glade_editor_table_load;
+}
+
+static void
+glade_editor_table_attach (GladeEditorTable *table,
+ GtkWidget *child,
+ gint pos, gint row)
+{
+ gtk_table_attach (GTK_TABLE (table), child,
+ pos, pos+1, row, row +1,
+ GTK_EXPAND | GTK_FILL,
+ GTK_EXPAND | GTK_FILL,
+ 3, 1);
+}
+
+static gint
+property_class_comp (gconstpointer a, gconstpointer b)
+{
+ const GladePropertyClass *ca = a, *cb = b;
+
+ if (ca->pspec->owner_type == cb->pspec->owner_type)
+ {
+ gdouble result = ca->weight - cb->weight;
+ /* Avoid cast to int */
+ if (result < 0.0) return -1;
+ else if (result > 0.0) return 1;
+ else return 0;
+ }
+ else
+ {
+ if (g_type_is_a (ca->pspec->owner_type, cb->pspec->owner_type))
+ return (ca->common || ca->packing) ? 1 : -1;
+ else
+ return (ca->common || ca->packing) ? -1 : 1;
+ }
+}
+
+static GList *
+get_sorted_properties (GladeWidgetAdaptor *adaptor,
+ GladeEditorPageType type)
+{
+ GList *l, *list = NULL;
+
+ for (l = adaptor->properties; l && l->data; l = g_list_next (l))
+ {
+ GladePropertyClass *klass = l->data;
+
+ /* Collect properties in our domain, query dialogs are allowed editor invisible properties */
+ if (GLADE_PROPERTY_CLASS_IS_TYPE (klass, type) &&
+ (glade_property_class_is_visible (klass) || type != GLADE_PAGE_QUERY))
+ list = g_list_prepend (list, klass);
+
+ }
+ return g_list_sort (list, property_class_comp);
+}
+
+static GladeEditorProperty *
+append_item (GladeEditorTable *table,
+ GladePropertyClass *klass,
+ gboolean from_query_dialog)
+{
+ GladeEditorProperty *property;
+
+ if (!(property = glade_widget_adaptor_create_eprop
+ (GLADE_WIDGET_ADAPTOR (klass->handle),
+ klass, from_query_dialog == FALSE)))
+ {
+ g_critical ("Unable to create editor for property '%s' of class '%s'",
+ klass->id, GLADE_WIDGET_ADAPTOR (klass->handle)->name);
+ return NULL;
+ }
+
+ gtk_widget_show (GTK_WIDGET (property));
+ gtk_widget_show_all (property->item_label);
+
+ glade_editor_table_attach (table, property->item_label, 0, table->rows);
+ glade_editor_table_attach (table, GTK_WIDGET (property), 1, table->rows);
+
+ table->rows++;
+
+ return property;
+}
+
+
+static void
+append_items (GladeEditorTable *table,
+ GladeWidgetAdaptor *adaptor,
+ GladeEditorPageType type)
+{
+ GladeEditorProperty *property;
+ GladePropertyClass *property_class;
+ GList *list, *sorted_list;
+
+ sorted_list = get_sorted_properties (adaptor, type);
+ for (list = sorted_list; list != NULL; list = list->next)
+ {
+ property_class = (GladePropertyClass *) list->data;
+
+ property = append_item (table, property_class, type == GLADE_PAGE_QUERY);
+ table->properties = g_list_prepend (table->properties, property);
+ }
+ g_list_free (sorted_list);
+
+ table->properties = g_list_reverse (table->properties);
+}
+
+static void
+append_packing_items (GladeEditorTable *table,
+ GladeWidget *widget)
+{
+ GladeEditorProperty *eprop;
+ GladeProperty *property;
+ GList *list;
+
+ for (list = widget->packing_properties; list != NULL; list = list->next)
+ {
+ property = list->data;
+
+ eprop = append_item (table, property->klass, FALSE);
+ table->properties = g_list_prepend (table->properties, eprop);
+ }
+
+ table->properties = g_list_reverse (table->properties);
+}
+
+
+static void
+widget_name_edited (GtkWidget *editable, GladeEditorTable *table)
+{
+ GladeWidget *widget;
+ gchar *new_name;
+
+ g_return_if_fail (GTK_IS_EDITABLE (editable));
+ g_return_if_fail (GLADE_IS_EDITOR_TABLE (table));
+
+ if (table->loading) return;
+
+ widget = table->loaded_widget;
+ new_name = gtk_editable_get_chars (GTK_EDITABLE (editable), 0, -1);
+
+ if (glade_project_available_widget_name (widget->project, widget, new_name))
+ glade_command_set_name (widget, new_name);
+ g_free (new_name);
+}
+
+
+static void
+append_name_field (GladeEditorTable *table)
+{
+ GtkWidget *label;
+ gchar *text = _("The Object's name");
+
+ /* Name */
+ label = gtk_label_new (_("Name:"));
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_widget_show (label);
+
+ table->name_entry = gtk_entry_new ();
+ gtk_widget_show (table->name_entry);
+
+ gtk_widget_set_tooltip_text (label, text);
+ gtk_widget_set_tooltip_text (table->name_entry, text);
+
+ g_signal_connect (G_OBJECT (table->name_entry), "activate",
+ G_CALLBACK (widget_name_edited), table);
+ g_signal_connect (G_OBJECT (table->name_entry), "changed",
+ G_CALLBACK (widget_name_edited), table);
+
+ glade_editor_table_attach (table, label, 0, table->rows);
+ glade_editor_table_attach (table, table->name_entry, 1, table->rows);
+
+ table->rows++;
+}
+
+/**
+ * glade_editor_table_new:
+ * @adaptor: A #GladeWidgetAdaptor
+ * @type: The #GladeEditorPageType
+ *
+ * Creates a new #GladeEditorTable.
+ *
+ * Returns: a new #GladeEditorTable
+ *
+ */
+GtkWidget *
+glade_editor_table_new (GladeWidgetAdaptor *adaptor,
+ GladeEditorPageType type)
+{
+ GladeEditorTable *table;
+
+ g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
+
+ table = g_object_new (GLADE_TYPE_EDITOR_TABLE, NULL);
+ table->adaptor = adaptor;
+ table->type = type;
+
+ if (type == GLADE_PAGE_GENERAL)
+ append_name_field (table);
+
+ append_items (table, adaptor, type);
+
+ gtk_widget_show (GTK_WIDGET (table));
+
+ return GTK_WIDGET (table);
+}
diff --git a/gladeui/glade-editor-table.h b/gladeui/glade-editor-table.h
new file mode 100644
index 00000000..51ae2b87
--- /dev/null
+++ b/gladeui/glade-editor-table.h
@@ -0,0 +1,86 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008 Tristan Van Berkom.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Authors:
+ * Tristan Van Berkom <tvb@gnome.org>
+ */
+#ifndef _GLADE_EDITOR_BUTTON_H_
+#define _GLADE_EDITOR_BUTTON_H_
+
+#include <gtk/gtk.h>
+#include <gladeui/glade-editable.h>
+
+
+G_BEGIN_DECLS
+
+#define GLADE_TYPE_EDITOR_TABLE (glade_editor_table_get_type ())
+#define GLADE_EDITOR_TABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EDITOR_TABLE, GladeEditorTable))
+#define GLADE_EDITOR_TABLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EDITOR_TABLE, GladeEditorTableClass))
+#define GLADE_IS_EDITOR_TABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EDITOR_TABLE))
+#define GLADE_IS_EDITOR_TABLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EDITOR_TABLE))
+#define GLADE_EDITOR_TABLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_TYPE_EDITOR_TABLE, GladeEditorEditorClass))
+
+typedef struct _GladeEditorTable GladeEditorTable;
+typedef struct _GladeEditorTableClass GladeEditorTableClass;
+
+struct _GladeEditorTable
+{
+ GtkTable parent;
+
+ GladeWidgetAdaptor *adaptor; /* The GladeWidgetAdaptor this
+ * table was created for.
+ */
+
+ GladeWidget *loaded_widget; /* A pointer to the currently loaded GladeWidget
+ */
+
+ GtkWidget *name_entry; /* A pointer to the gtk_entry that holds
+ * the name of the widget. This is the
+ * first item _pack'ed to the table_widget.
+ * We have a pointer here because it is an
+ * entry which will not be created from a
+ * GladeProperty but rather from code.
+ */
+
+ GList *properties; /* A list of GladeEditorPropery items.
+ * For each row in the gtk_table, there is a
+ * corrsponding GladeEditorProperty struct.
+ */
+
+ GladeEditorPageType type; /* Is this table to be used in the common tab, ?
+ * the general tab, a packing tab or the query popup ?
+ */
+
+ gboolean loading; /* Avoid recursion while loading values into widgets
+ */
+
+ gint rows;
+};
+
+struct _GladeEditorTableClass
+{
+ GtkTableClass parent;
+};
+
+GType glade_editor_table_get_type (void);
+GtkWidget *glade_editor_table_new (GladeWidgetAdaptor *adaptor,
+ GladeEditorPageType type);
+
+G_END_DECLS
+
+#endif /* _GLADE_EDITOR_TABLE_H_ */
diff --git a/gladeui/glade-editor.c b/gladeui/glade-editor.c
index e9942ee4..db78e6d8 100644
--- a/gladeui/glade-editor.c
+++ b/gladeui/glade-editor.c
@@ -85,18 +85,6 @@ glade_editor_search_doc_search (GladeEditor *editor,
}
-
-static void
-glade_editor_gtk_doc_search_cb (GladeEditorProperty *eprop,
- const gchar *book,
- const gchar *page,
- const gchar *search,
- GladeEditor *editor)
-{
- /* Just act as a hub for search signals here */
- glade_editor_search_doc_search (editor, book, page, search);
-}
-
static void
glade_editor_set_property (GObject *object,
guint prop_id,
@@ -265,7 +253,6 @@ glade_editor_on_docs_click (GtkButton *button,
}
}
-
static GtkWidget *
glade_editor_create_info_button (GladeEditor *editor)
{
@@ -286,7 +273,6 @@ glade_editor_create_info_button (GladeEditor *editor)
return button;
}
-
static GtkWidget *
glade_editor_create_reset_button (GladeEditor *editor)
{
@@ -306,6 +292,7 @@ glade_editor_create_reset_button (GladeEditor *editor)
return button;
}
+
static void
glade_editor_update_class_warning_cb (GladeWidget *widget,
GParamSpec *pspec,
@@ -319,6 +306,7 @@ glade_editor_update_class_warning_cb (GladeWidget *widget,
gtk_widget_set_tooltip_text (editor->warning, widget->support_warning);
}
+
static void
glade_editor_update_class_field (GladeEditor *editor)
{
@@ -349,6 +337,14 @@ glade_editor_update_class_field (GladeEditor *editor)
}
}
+static void
+glade_editor_update_widget_name_cb (GladeWidget *widget,
+ GParamSpec *pspec,
+ GladeEditor *editor)
+{
+ glade_editor_update_class_field (editor);
+}
+
static GtkWidget *
glade_editor_setup_class_field (GladeEditor *editor)
{
@@ -390,9 +386,9 @@ glade_editor_init (GladeEditor *editor)
editor->page_common = glade_editor_notebook_page (editor, _("_Common"));
editor->page_signals = glade_editor_notebook_page (editor, _("_Signals"));
editor->page_atk = glade_editor_notebook_page (editor, _("Accessibility"));
- editor->widget_tables = NULL;
- editor->packing_etable = NULL;
- editor->loading = FALSE;
+ editor->editables = NULL;
+ editor->packing_page = NULL;
+ editor->loading = FALSE;
editor->class_field = glade_editor_setup_class_field (editor);
@@ -469,323 +465,106 @@ glade_editor_new (void)
return editor;
}
-/*
- * We call this function when the user changes the widget name using the
- * entry on the properties editor.
- */
-static void
-glade_editor_widget_name_changed (GtkWidget *editable, GladeEditor *editor)
-{
- GladeWidget *widget;
- gchar *new_name;
-
- g_return_if_fail (GTK_IS_EDITABLE (editable));
- g_return_if_fail (GLADE_IS_EDITOR (editor));
-
- if (editor->loading) return;
-
- widget = editor->loaded_widget;
- new_name = gtk_editable_get_chars (GTK_EDITABLE (editable), 0, -1);
-
- if (glade_project_available_widget_name (widget->project, widget, new_name))
- glade_command_set_name (widget, new_name);
- g_free (new_name);
-}
-
-static void
-glade_editor_table_attach (GtkWidget *table, GtkWidget *child, gint pos, gint row)
-{
- gtk_table_attach (GTK_TABLE (table), child,
- pos, pos+1, row, row +1,
- GTK_EXPAND | GTK_FILL,
- GTK_EXPAND | GTK_FILL,
- 3, 1);
-}
-
-static GladeEditorProperty *
-glade_editor_table_append_item (GladeEditorTable *table,
- GladePropertyClass *klass,
- gboolean from_query_dialog)
-{
- GladeEditorProperty *property;
-
- if (!(property = glade_widget_adaptor_create_eprop
- (GLADE_WIDGET_ADAPTOR (klass->handle),
- klass, from_query_dialog == FALSE)))
- {
- g_critical ("Unable to create editor for property '%s' of class '%s'",
- klass->id, GLADE_WIDGET_ADAPTOR (klass->handle)->name);
- return NULL;
- }
-
- gtk_widget_show (GTK_WIDGET (property));
- gtk_widget_show_all (property->item_label);
-
- g_signal_connect (G_OBJECT (property), "gtk-doc-search",
- G_CALLBACK (glade_editor_gtk_doc_search_cb),
- table->editor);
-
- glade_editor_table_attach (table->table_widget, property->item_label, 0, table->rows);
- glade_editor_table_attach (table->table_widget, GTK_WIDGET (property), 1, table->rows);
-
- table->rows++;
-
- return property;
-}
-
-static void
-glade_editor_table_append_name_field (GladeEditorTable *table)
-{
- GtkWidget *label;
- gchar *text = _("The Object's name");
-
- /* Name */
- label = gtk_label_new (_("Name:"));
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
- gtk_widget_show (label);
-
- table->name_entry = gtk_entry_new ();
- gtk_widget_show (table->name_entry);
-
- gtk_widget_set_tooltip_text (label, text);
- gtk_widget_set_tooltip_text (table->name_entry, text);
-
- g_signal_connect (G_OBJECT (table->name_entry), "activate",
- G_CALLBACK (glade_editor_widget_name_changed),
- table->editor);
-
- g_signal_connect (G_OBJECT (table->name_entry), "changed",
- G_CALLBACK (glade_editor_widget_name_changed),
- table->editor);
-
- glade_editor_table_attach (table->table_widget, label, 0, table->rows);
- glade_editor_table_attach (table->table_widget, table->name_entry, 1, table->rows);
-
- table->rows++;
-}
-
-static gint
-glade_editor_property_class_comp (gconstpointer a, gconstpointer b)
-{
- const GladePropertyClass *ca = a, *cb = b;
-
- if (ca->pspec->owner_type == cb->pspec->owner_type)
- {
- gdouble result = ca->weight - cb->weight;
- /* Avoid cast to int */
- if (result < 0.0) return -1;
- else if (result > 0.0) return 1;
- else return 0;
- }
- else
- {
- if (g_type_is_a (ca->pspec->owner_type, cb->pspec->owner_type))
- return (ca->common || ca->packing) ? 1 : -1;
- else
- return (ca->common || ca->packing) ? -1 : 1;
- }
-}
-
-static GList *
-glade_editor_get_sorted_properties (GladeWidgetAdaptor *adaptor)
-{
- GList *l, *a = NULL, *b = NULL;
-
- for (l = adaptor->properties; l && l->data; l = g_list_next (l))
- {
- GladePropertyClass *klass = l->data;
-
- if (klass->common || klass->packing)
- a = g_list_prepend (a, klass);
- else
- b = g_list_prepend (b, klass);
- }
-
- a = g_list_sort (a, glade_editor_property_class_comp);
- b = g_list_sort (b, glade_editor_property_class_comp);
-
- return g_list_concat (a, b);
-}
-
-static gboolean
-glade_editor_table_append_items (GladeEditorTable *table,
- GladeWidgetAdaptor *adaptor,
- GladeEditorTableType type)
-{
- GladeEditorProperty *property;
- GladePropertyClass *property_class;
- GList *list, *sorted_list;
-
- sorted_list = glade_editor_get_sorted_properties (adaptor);
-
- for (list = sorted_list; list != NULL; list = list->next)
- {
- property_class = (GladePropertyClass *) list->data;
-
- if (!glade_property_class_is_visible (property_class) && type != TABLE_TYPE_QUERY)
- continue;
- if (type == TABLE_TYPE_QUERY && !property_class->query)
- continue;
- else if (type == TABLE_TYPE_COMMON && !property_class->common)
- continue;
- else if (type == TABLE_TYPE_GENERAL && property_class->common)
- continue;
- else if (type == TABLE_TYPE_ATK && !property_class->atk)
- continue;
- else if (type != TABLE_TYPE_ATK && property_class->atk)
- continue;
-
- property = glade_editor_table_append_item (table, property_class,
- type == TABLE_TYPE_QUERY);
- table->properties = g_list_prepend (table->properties, property);
- }
-
- g_list_free (sorted_list);
-
- return TRUE;
-}
-
-static GladeEditorTable *
-glade_editor_table_new (void)
-{
- GladeEditorTable *table;
-
- table = g_new0 (GladeEditorTable, 1);
-
- table->table_widget = gtk_table_new (0, 0, FALSE);
-
- g_object_ref (G_OBJECT(table->table_widget));
-
- return table;
-}
-
-static void
-glade_editor_table_free (GladeEditorTable *etable)
-{
- g_object_unref (G_OBJECT(etable->table_widget));
- g_free (etable);
-}
-
-static GladeEditorTable *
-glade_editor_table_create (GladeEditor *editor,
- GladeWidgetAdaptor *adaptor,
- GladeEditorTableType type)
-{
- GladeEditorTable *table;
-
- g_return_val_if_fail (GLADE_IS_EDITOR (editor), NULL);
- g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
-
- table = glade_editor_table_new ();
- table->editor = editor;
- table->adaptor = adaptor;
- table->type = type;
-
- if (type == TABLE_TYPE_GENERAL)
- glade_editor_table_append_name_field (table);
-
- if (!glade_editor_table_append_items (table, adaptor, type))
- return NULL;
-
- gtk_widget_show (table->table_widget);
-
- return table;
-}
-
-static GladeEditorTable *
-glade_editor_get_table_from_class (GladeEditor *editor,
- GladeWidgetAdaptor *adaptor,
- GladeEditorTableType type)
+static GtkWidget *
+glade_editor_get_editable_by_adaptor (GladeEditor *editor,
+ GladeWidgetAdaptor *adaptor,
+ GladeEditorPageType type)
{
- GladeEditorTable *table;
+ GtkWidget *editable;
GList *list;
g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
+ g_return_val_if_fail (type != GLADE_PAGE_PACKING, NULL);
- for (list = editor->widget_tables; list; list = list->next)
+ for (list = editor->editables; list; list = list->next)
{
- table = list->data;
- if (type != table->type)
+ editable = list->data;
+ if (type != GPOINTER_TO_INT (g_object_get_data (G_OBJECT (editable), "glade-editor-page-type")))
continue;
- if (table->adaptor == adaptor)
- return table;
+ if (g_object_get_data (G_OBJECT (editable), "glade-widget-adaptor") == adaptor)
+ return editable;
}
- table = glade_editor_table_create (editor, adaptor, type);
- g_return_val_if_fail (table != NULL, NULL);
+ editable = (GtkWidget *)glade_widget_adaptor_create_editable (adaptor, type);
+ g_return_val_if_fail (editable != NULL, NULL);
+
+ g_object_ref_sink (editable);
+ g_object_set_data (G_OBJECT (editable), "glade-editor-page-type", GINT_TO_POINTER (type));
+ g_object_set_data (G_OBJECT (editable), "glade-widget-adaptor", adaptor);
- editor->widget_tables = g_list_prepend (editor->widget_tables, table);
+ editor->editables = g_list_prepend (editor->editables, editable);
- return table;
+ return editable;
}
static void
-glade_editor_load_page (GladeEditor *editor,
- GladeWidgetAdaptor *adaptor,
- GladeEditorTableType type)
+glade_editor_load_editable_in_page (GladeEditor *editor,
+ GladeWidgetAdaptor *adaptor,
+ GladeEditorPageType type)
{
- GladeEditorTable *table;
- GtkContainer *container = NULL;
- GtkWidget *scrolled_window;
- GList *list, *children;
+ GtkContainer *container = NULL;
+ GtkWidget *scrolled_window, *editable;
GtkAdjustment *adj;
/* Remove the old table that was in this container */
switch (type)
{
- case TABLE_TYPE_GENERAL:
+ case GLADE_PAGE_GENERAL:
container = GTK_CONTAINER (editor->page_widget);
break;
- case TABLE_TYPE_COMMON:
+ case GLADE_PAGE_COMMON:
container = GTK_CONTAINER (editor->page_common);
break;
- case TABLE_TYPE_ATK:
+ case GLADE_PAGE_PACKING:
+ container = GTK_CONTAINER (editor->page_packing);
+ break;
+ case GLADE_PAGE_ATK:
container = GTK_CONTAINER (editor->page_atk);
break;
- case TABLE_TYPE_PACKING:
- case TABLE_TYPE_QUERY:
+ case GLADE_PAGE_QUERY:
default:
g_critical ("Unreachable code reached !");
break;
}
-
- children = gtk_container_get_children (container);
- for (list = children; list; list = list->next) {
- GtkWidget *widget = list->data;
- g_return_if_fail (GTK_IS_WIDGET (widget));
- gtk_widget_ref (widget);
- gtk_container_remove (container, widget);
- }
- g_list_free (children);
+
+ /* Remove the editable (this will destroy on packing pages) */
+ if (GTK_BIN (container)->child)
+ gtk_container_remove (container, GTK_BIN (container)->child);
if (!adaptor)
return;
+
+ if (type != GLADE_PAGE_PACKING)
+ editable = glade_editor_get_editable_by_adaptor (editor, adaptor, type);
+ else
+ {
+ /* Dont take a ref for packing pages, they are owned by thier container
+ * until we update it.
+ */
+ editable = (GtkWidget *)glade_widget_adaptor_create_editable (adaptor, type);
+ editor->packing_page = editable;
+ }
- table = glade_editor_get_table_from_class (editor, adaptor, type);
-
- /* Attach the new table */
- gtk_container_add (GTK_CONTAINER (container), table->table_widget);
+ /* Attach the new page */
+ gtk_container_add (GTK_CONTAINER (container), editable);
/* Enable tabbed keynav in the editor */
- if (table)
- {
- scrolled_window = gtk_widget_get_parent (GTK_WIDGET (container));
- scrolled_window = gtk_widget_get_parent (scrolled_window);
-
- /* FIXME: Save pointer to the scrolled window (or just the
- adjustments) before hand. */
- g_assert (GTK_IS_SCROLLED_WINDOW (scrolled_window));
-
- adj = gtk_scrolled_window_get_vadjustment
- (GTK_SCROLLED_WINDOW (scrolled_window));
- gtk_container_set_focus_vadjustment
- (GTK_CONTAINER (table->table_widget), adj);
-
- adj = gtk_scrolled_window_get_hadjustment
- (GTK_SCROLLED_WINDOW (scrolled_window));
+ scrolled_window = gtk_widget_get_parent (GTK_WIDGET (container));
+ scrolled_window = gtk_widget_get_parent (scrolled_window);
+
+ /* FIXME: Save pointer to the scrolled window (or just the
+ adjustments) before hand. */
+ g_assert (GTK_IS_SCROLLED_WINDOW (scrolled_window));
+
+ adj = gtk_scrolled_window_get_vadjustment
+ (GTK_SCROLLED_WINDOW (scrolled_window));
+ gtk_container_set_focus_vadjustment
+ (GTK_CONTAINER (editable), adj);
+
+ adj = gtk_scrolled_window_get_hadjustment
+ (GTK_SCROLLED_WINDOW (scrolled_window));
gtk_container_set_focus_hadjustment
- (GTK_CONTAINER (table->table_widget), adj);
- }
+ (GTK_CONTAINER (editable), adj);
}
static void
@@ -801,80 +580,17 @@ glade_editor_load_signal_page (GladeEditor *editor)
static void
glade_editor_load_widget_class (GladeEditor *editor, GladeWidgetAdaptor *adaptor)
{
- glade_editor_load_page (editor, adaptor, TABLE_TYPE_GENERAL);
- glade_editor_load_page (editor, adaptor, TABLE_TYPE_COMMON);
- glade_editor_load_page (editor, adaptor, TABLE_TYPE_ATK);
+
+ glade_editor_load_editable_in_page (editor, adaptor, GLADE_PAGE_GENERAL);
+ glade_editor_load_editable_in_page (editor, adaptor, GLADE_PAGE_COMMON);
+ glade_editor_load_editable_in_page (editor, adaptor, GLADE_PAGE_PACKING);
+ glade_editor_load_editable_in_page (editor, adaptor, GLADE_PAGE_ATK);
glade_editor_load_signal_page (editor);
editor->loaded_adaptor = adaptor;
}
-static gint
-glade_editor_property_comp (gconstpointer a, gconstpointer b)
-{
- const GladeProperty *prop_a = a, *prop_b = b;
- return glade_editor_property_class_comp (prop_a->klass, prop_b->klass);
-}
-
-static void
-glade_editor_load_packing_page (GladeEditor *editor, GladeWidget *widget)
-{
- GladeEditorProperty *editor_property;
- GladeProperty *property;
- GladeWidget *parent;
- GList *list, *sorted_list;
- GtkWidget *child;
-
- /* Remove the old properties */
- if ((child = gtk_bin_get_child (GTK_BIN (editor->page_packing))) != NULL)
- gtk_container_remove (GTK_CONTAINER (editor->page_packing), child);
-
- /* Free the packing editor table */
- if (editor->packing_etable)
- editor->packing_etable =
- (glade_editor_table_free (editor->packing_etable), NULL);
-
- /* Free the packing editor properties (we gave ownership to
- * packing_etable->table_widget, so no need to unref them here).
- */
- editor->packing_eprops = (g_list_free (editor->packing_eprops), NULL);
-
-
- /* if the widget is a toplevel there are no packing properties */
- if (widget == NULL || (parent = glade_widget_get_parent (widget)) == NULL)
- return;
-
- /* Now add the new properties */
- editor->packing_etable = glade_editor_table_new ();
- editor->packing_etable->editor = editor;
- editor->packing_etable->type = TABLE_TYPE_PACKING;
-
- /* Sort packing properties by weight */
- sorted_list = g_list_copy (widget->packing_properties);
- sorted_list = g_list_sort (sorted_list, glade_editor_property_comp);
-
- for (list = sorted_list; list && list->data; list = list->next)
- {
- property = GLADE_PROPERTY (list->data);
-
- if (glade_property_class_is_visible (property->klass) == FALSE)
- continue;
-
- editor_property = glade_editor_table_append_item (editor->packing_etable,
- property->klass, FALSE);
- editor->packing_eprops = g_list_prepend (editor->packing_eprops, editor_property);
- glade_editor_property_load (editor_property, property);
- }
-
- g_list_free (sorted_list);
-
- gtk_widget_show (editor->packing_etable->table_widget);
-
- gtk_container_add (GTK_CONTAINER (editor->page_packing),
- editor->packing_etable->table_widget);
-}
-
static void
glade_editor_close_cb (GladeProject *project,
GladeEditor *editor)
@@ -886,45 +602,25 @@ glade_editor_close_cb (GladeProject *project,
}
static void
-glade_editor_load_table (GladeEditor *editor,
- GladeWidget *widget,
- GladeEditorTableType type)
+glade_editor_load_editable (GladeEditor *editor,
+ GladeWidget *widget,
+ GladeEditorPageType type)
{
- GladeEditorProperty *property;
- GladeEditorTable *table;
- GList *list;
-
- table = glade_editor_get_table_from_class
- (editor, widget->adaptor, type);
- if (table->name_entry)
- gtk_entry_set_text (GTK_ENTRY (table->name_entry), widget->name);
+ GtkWidget *editable;
- for (list = table->properties; list; list = list->next)
- {
- property = list->data;
- glade_editor_property_load_by_widget (property, widget);
- }
-}
-
-static void
-glade_editor_update_widget_name_cb (GladeWidget *widget,
- GParamSpec *pspec,
- GladeEditor *editor)
-{
- GladeEditorTable *table;
-
- glade_editor_update_class_field (editor);
+ if (type == GLADE_PAGE_PACKING)
+ editable = editor->packing_page;
+ else
+ editable = glade_editor_get_editable_by_adaptor
+ (editor, widget->adaptor, type);
+
+ g_assert (editable);
- g_assert (editor->loaded_widget);
+ if (!widget) gtk_widget_hide (editable);
- table = glade_editor_get_table_from_class
- (editor, editor->loaded_adaptor, TABLE_TYPE_GENERAL);
+ glade_editable_load (GLADE_EDITABLE (editable), widget);
- g_signal_handlers_block_by_func (G_OBJECT (table->name_entry),
- glade_editor_widget_name_changed, editor);
- gtk_entry_set_text (GTK_ENTRY (table->name_entry), editor->loaded_widget->name);
- g_signal_handlers_unblock_by_func (G_OBJECT (table->name_entry),
- glade_editor_widget_name_changed, editor);
+ if (widget) gtk_widget_show (editable);
}
static void
@@ -951,7 +647,6 @@ glade_editor_load_widget_real (GladeEditor *editor, GladeWidget *widget)
if (editor->loaded_adaptor != adaptor || adaptor == NULL)
glade_editor_load_widget_class (editor, adaptor);
- glade_editor_load_packing_page (editor, widget);
glade_signal_editor_load_widget (editor->signal_editor, widget);
/* we are just clearing, we are done */
@@ -972,9 +667,10 @@ glade_editor_load_widget_real (GladeEditor *editor, GladeWidget *widget)
editor->loading = TRUE;
/* Load each GladeEditorProperty from 'widget' */
- glade_editor_load_table (editor, widget, TABLE_TYPE_GENERAL);
- glade_editor_load_table (editor, widget, TABLE_TYPE_COMMON);
- glade_editor_load_table (editor, widget, TABLE_TYPE_ATK);
+ glade_editor_load_editable (editor, widget, GLADE_PAGE_GENERAL);
+ glade_editor_load_editable (editor, widget, GLADE_PAGE_COMMON);
+ glade_editor_load_editable (editor, widget, GLADE_PAGE_ATK);
+ glade_editor_load_editable (editor, widget, GLADE_PAGE_PACKING);
editor->loaded_widget = widget;
editor->loading = FALSE;
@@ -1046,11 +742,8 @@ query_dialog_style_set_cb (GtkWidget *dialog,
gboolean
glade_editor_query_dialog (GladeEditor *editor, GladeWidget *widget)
{
- GtkWidget *dialog;
- GladeEditorTable *table;
+ GtkWidget *dialog, *editable;
gchar *title;
- GList *list;
- GladeEditorProperty *property;
gint answer;
gboolean retval = TRUE;
@@ -1071,19 +764,14 @@ glade_editor_query_dialog (GladeEditor *editor, GladeWidget *widget)
-1);
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
- table = glade_editor_get_table_from_class (editor,
- widget->adaptor,
- TABLE_TYPE_QUERY);
-
+ editable = glade_editor_get_editable_by_adaptor (editor,
+ widget->adaptor,
+ GLADE_PAGE_QUERY);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
- table->table_widget,
- FALSE, FALSE, 6);
- for (list = table->properties; list; list = list->next)
- {
- property = list->data;
- glade_editor_property_load_by_widget (property, widget);
- }
+ editable, FALSE, FALSE, 6);
+
+ glade_editable_load (GLADE_EDITABLE (editable), widget);
g_signal_connect (dialog, "style-set",
G_CALLBACK (query_dialog_style_set_cb),
@@ -1099,8 +787,7 @@ glade_editor_query_dialog (GladeEditor *editor, GladeWidget *widget)
if (answer == GTK_RESPONSE_CANCEL)
retval = FALSE;
- gtk_container_remove (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox),
- table->table_widget);
+ gtk_container_remove (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), editable);
gtk_widget_destroy (dialog);
return retval;
diff --git a/gladeui/glade-editor.h b/gladeui/glade-editor.h
index 3d78790d..0bae2b40 100644
--- a/gladeui/glade-editor.h
+++ b/gladeui/glade-editor.h
@@ -3,6 +3,7 @@
#define __GLADE_EDITOR_H__
#include <gladeui/glade-signal-editor.h>
+#include <gladeui/glade-editable.h>
G_BEGIN_DECLS
@@ -14,21 +15,8 @@ G_BEGIN_DECLS
#define GLADE_IS_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EDITOR))
#define GLADE_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GLADE_TYPE_EDITOR, GladeEditorClass))
-#define GLADE_EDITOR_TABLE(t) ((GladeEditorTable *)t)
-#define GLADE_IS_EDITOR_TABLE(t) (t != NULL)
-
typedef struct _GladeEditor GladeEditor;
typedef struct _GladeEditorClass GladeEditorClass;
-typedef struct _GladeEditorTable GladeEditorTable;
-
-typedef enum _GladeEditorTableType
-{
- TABLE_TYPE_GENERAL,
- TABLE_TYPE_COMMON,
- TABLE_TYPE_PACKING,
- TABLE_TYPE_ATK,
- TABLE_TYPE_QUERY
-} GladeEditorTableType;
/* The GladeEditor is a window that is used to display and modify widget
* properties. The glade editor contains the details of the selected
@@ -78,20 +66,15 @@ struct _GladeEditor
GladeSignalEditor *signal_editor; /* The signal editor packed into vbox_signals
*/
- GList *widget_tables; /* A list of GladeEditorTable. We have a table
- * (gtktable) for each GladeWidgetClass, if
- * we don't have one yet, we create it when
- * we are asked to load a widget of a particular
- * GladeWidgetClass
- */
-
- GladeEditorTable *packing_etable; /* Packing pages are dynamicly created each
- * selection, this pointer is only to free
- * the last packing page.
- */
-
- GList *packing_eprops; /* Current list of packing GladeEditorProperties
- */
+ GList *editables; /* A list of GladeEditables. We have a widget
+ * for each GladeWidgetAdaptor and we only load
+ * them on demand
+ */
+
+ GtkWidget *packing_page; /* Packing pages are dynamicly created each
+ * selection, this pointer is only to free
+ * the last packing page.
+ */
gboolean loading; /* Use when loading a GladeWidget into the editor
* we set this flag so that we can ignore the
@@ -100,15 +83,12 @@ struct _GladeEditor
* was loaded.
*/
-
gulong project_closed_signal_id; /* Unload widget when widget's project closes.
*/
gulong widget_warning_id; /* Update when widget changes warning messages.
*/
-
- gulong widget_name_id; /* Watch the actual widget name
- */
-
+ gulong widget_name_id; /* Update class field when widget name changes
+ */
GtkWidget *reset_button; /* The reset button
*/
@@ -154,52 +134,6 @@ struct _GladeEditorClass
};
-/* For each glade widget class that we have modified, we create a
- * GladeEditorTable. A GladeEditorTable is mainly a gtk_table with all the
- * widgets to edit a particular GladeWidgetClass (well the first tab of the
- * gtk notebook). When a widget of is selected
- * and going to be edited, we create a GladeEditorTable, when another widget
- * of the same class is loaded so that it can be edited, we just update the
- * contents of the editor table to relfect the values of that GladeWidget
- */
-struct _GladeEditorTable
-{
- GladeEditor *editor; /* Handy pointer that avoids havving to pass the
- * editor arround.
- */
-
- GladeWidgetAdaptor *adaptor; /* The GladeWidgetAdaptor this
- * table belongs to.
- */
-
- GtkWidget *table_widget; /* This widget is a gtk_vbox that is displayed
- * in the glade-editor when a widget of this
- * class is selected. It is hiden when another
- * type is selected. When we select a widget
- * we load into the inputs inside this table
- * the information about the selected widget.
- */
-
- GtkWidget *name_entry; /* A pointer to the gtk_entry that holds
- * the name of the widget. This is the
- * first item _pack'ed to the table_widget.
- * We have a pointer here because it is an
- * entry which will not be created from a
- * GladeProperty but rather from code.
- */
-
- GList *properties; /* A list of GladeEditorPropery items.
- * For each row in the gtk_table, there is a
- * corrsponding GladeEditorProperty struct.
- */
-
- GladeEditorTableType type; /* Is this table to be used in the common tab, ?
- * the general tab, a packing tab or the query popup ?
- */
-
- gint rows;
-};
-
GType glade_editor_get_type (void);
diff --git a/gladeui/glade-property-class.h b/gladeui/glade-property-class.h
index ac65e199..479194cd 100644
--- a/gladeui/glade-property-class.h
+++ b/gladeui/glade-property-class.h
@@ -17,6 +17,23 @@ G_BEGIN_DECLS
#define GLADE_PROPERTY_CLASS(gpc) ((GladePropertyClass *) gpc)
#define GLADE_IS_PROPERTY_CLASS(gpc) (gpc != NULL)
+
+/**
+ * GLADE_PROPERTY_CLASS_IS_TYPE:
+ * gpc: A #GladePropertyClass
+ * type: The #GladeEditorPageType to query
+ *
+ * Checks if @gpc is good to be loaded as @type
+ */
+#define GLADE_PROPERTY_CLASS_IS_TYPE(gpc, type) \
+ (((type) == GLADE_PAGE_GENERAL && \
+ !(gpc)->common && !(gpc)->packing && !(gpc)->atk) || \
+ ((type) == GLADE_PAGE_COMMON && (gpc)->common) || \
+ ((type) == GLADE_PAGE_PACKING && (gpc)->packing) || \
+ ((type) == GLADE_PAGE_ATK && (gpc)->atk) || \
+ ((type) == GLADE_PAGE_QUERY && (gpc)->query))
+
+
#define GPC_OBJECT_DELIMITER ", "
#define GPC_PROPERTY_NAMELEN 512 /* Enough space for a property name I think */
@@ -75,10 +92,6 @@ struct _GladePropertyClass
* to be of possible use in plugin code.
*/
- gboolean query; /* Whether we should explicitly ask the user about this property
- * when instantiating a widget with this property (through a popup
- * dialog).
- */
gboolean optional; /* Some properties are optional by nature like
* default width. It can be set or not set. A
@@ -93,6 +106,10 @@ struct _GladePropertyClass
gboolean common; /* Common properties go in the common tab */
gboolean atk; /* Atk properties go in the atk tab */
gboolean packing; /* Packing properties go in the packing tab */
+ gboolean query; /* Whether we should explicitly ask the user about this property
+ * when instantiating a widget with this property (through a popup
+ * dialog).
+ */
gboolean translatable; /* The property should be translatable, which
diff --git a/gladeui/glade-widget-adaptor.c b/gladeui/glade-widget-adaptor.c
index 36ea0767..186d047f 100644
--- a/gladeui/glade-widget-adaptor.c
+++ b/gladeui/glade-widget-adaptor.c
@@ -41,6 +41,7 @@
#include "glade-marshallers.h"
#include "glade-accumulators.h"
#include "glade-displayable-values.h"
+#include "glade-editor-table.h"
/* For g_file_exists */
#include <sys/types.h>
@@ -1172,6 +1173,14 @@ glade_widget_adaptor_object_string_from_value (GladeWidgetAdaptor *adaptor,
return glade_property_class_make_string_from_gvalue (klass, value, fmt);
}
+static GladeEditable *
+glade_widget_adaptor_object_create_editable (GladeWidgetAdaptor *adaptor,
+ GladeEditorPageType type)
+{
+ return (GladeEditable *)glade_editor_table_new (adaptor, type);
+}
+
+
/*******************************************************************************
GladeWidgetAdaptor type registration and class initializer
*******************************************************************************/
@@ -1219,8 +1228,7 @@ glade_widget_adaptor_class_init (GladeWidgetAdaptorClass *adaptor_class)
adaptor_class->write_child = glade_widget_adaptor_object_write_child;
adaptor_class->create_eprop = glade_widget_adaptor_object_create_eprop;
adaptor_class->string_from_value = glade_widget_adaptor_object_string_from_value;
-
-
+ adaptor_class->create_editable = glade_widget_adaptor_object_create_editable;
/* Base defaults here */
adaptor_class->fixed = FALSE;
@@ -1502,6 +1510,11 @@ gwa_extend_with_node_load_sym (GladeWidgetAdaptorClass *klass,
&symbol))
klass->string_from_value = symbol;
+ if (glade_xml_load_sym_from_node (node, module,
+ GLADE_TAG_CREATE_EDITABLE_FUNCTION,
+ &symbol))
+ klass->create_editable = symbol;
+
}
static void
@@ -3557,7 +3570,7 @@ glade_widget_adaptor_string_from_value (GladeWidgetAdaptor *adaptor,
/**
- * glade_widget_adaptor_string_from_value:
+ * glade_widget_adaptor_get_signal_class:
* @adaptor: A #GladeWidgetAdaptor
* @name: the name of the signal class.
*
@@ -3585,3 +3598,24 @@ glade_widget_adaptor_get_signal_class (GladeWidgetAdaptor *adaptor,
return NULL;
}
+
+/**
+ * glade_widget_adaptor_create_editable:
+ * @adaptor: A #GladeWidgetAdaptor
+ * @type: The #GladeEditorPageType
+ *
+ * This is used to allow the backend to override the way an
+ * editor page is layed out (note that editor widgets are created
+ * on demand and not at startup).
+ *
+ * Returns: A new #GladeEditable widget
+ */
+GladeEditable *
+glade_widget_adaptor_create_editable (GladeWidgetAdaptor *adaptor,
+ GladeEditorPageType type)
+{
+ g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
+
+ return GLADE_WIDGET_ADAPTOR_GET_CLASS
+ (adaptor)->create_editable (adaptor, type);
+}
diff --git a/gladeui/glade-widget-adaptor.h b/gladeui/glade-widget-adaptor.h
index ec3444e6..60984df8 100644
--- a/gladeui/glade-widget-adaptor.h
+++ b/gladeui/glade-widget-adaptor.h
@@ -6,6 +6,7 @@
#include <gladeui/glade-property-class.h>
#include <gladeui/glade-editor-property.h>
#include <gladeui/glade-catalog.h>
+#include <gladeui/glade-editable.h>
#include <glib-object.h>
#include <gmodule.h>
#include <gtk/gtk.h>
@@ -469,8 +470,9 @@ typedef GladeEditorProperty *(* GladeCreateEPropFunc) (GladeWidgetAdaptor *adapt
* @fmt: The #GladeProjectFormat the string should conform to
*
* For normal properties this is used to serialize
- * property values, for custom properties its still
- * needed to update the UI for undo/redo items etc.
+ * property values, for custom properties (only when new pspecs are
+ * introduced) its needed for value comparisons in boxed pspecs
+ * and also to update the UI for undo/redo items etc.
*
* Returns: A newly allocated string representation of @value
*/
@@ -480,6 +482,22 @@ typedef gchar *(* GladeStringFromValueFunc) (GladeWidgetAdaptor *adaptor,
GladeProjectFormat fmt);
+
+/**
+ * GladeCreateEditableFunc:
+ * @adaptor: A #GladeWidgetAdaptor
+ * @type: The #GladeEditorPageType
+ *
+ * This is used to allow the backend to override the way an
+ * editor page is layed out (note that editor widgets are created
+ * on demand and not at startup).
+ *
+ * Returns: A new #GladeEditable widget
+ */
+typedef GladeEditable *(* GladeCreateEditableFunc) (GladeWidgetAdaptor *adaptor,
+ GladeEditorPageType type);
+
+
/* GladeSignalClass contains all the info we need for a given signal, such as
* the signal name, and maybe more in the future
*/
@@ -663,6 +681,8 @@ struct _GladeWidgetAdaptorClass
GladeCreateEPropFunc create_eprop; /* Creates a GladeEditorProperty */
GladeStringFromValueFunc string_from_value; /* Creates a string for a value */
+
+ GladeCreateEditableFunc create_editable; /* Creates a page for the editor */
};
#define glade_widget_adaptor_create_widget(adaptor, query, ...) \
@@ -849,6 +869,9 @@ gchar *glade_widget_adaptor_string_from_value (GladeWidgetAdaptor
const GValue *value,
GladeProjectFormat fmt);
+GladeEditable *glade_widget_adaptor_create_editable (GladeWidgetAdaptor *adaptor,
+ GladeEditorPageType type);
+
GladeSignalClass *glade_widget_adaptor_get_signal_class (GladeWidgetAdaptor *adaptor,
const gchar *name);
diff --git a/gladeui/glade-xml-utils.h b/gladeui/glade-xml-utils.h
index 228839d8..011abe25 100644
--- a/gladeui/glade-xml-utils.h
+++ b/gladeui/glade-xml-utils.h
@@ -138,6 +138,7 @@ typedef enum {
#define GLADE_TAG_WRITE_CHILD_FUNCTION "write-child-function"
#define GLADE_TAG_CREATE_EPROP_FUNCTION "create-editor-property-function"
#define GLADE_TAG_STRING_FROM_VALUE_FUNCTION "string-from-value-function"
+#define GLADE_TAG_CREATE_EDITABLE_FUNCTION "create-editable-function"
#define GLADE_TAG_PROPERTIES "properties"
#define GLADE_TAG_PACKING_PROPERTIES "packing-properties"
#define GLADE_TAG_PROPERTY "property"
diff --git a/gladeui/glade.h b/gladeui/glade.h
index a496bfc1..287f5382 100644
--- a/gladeui/glade.h
+++ b/gladeui/glade.h
@@ -44,5 +44,7 @@
#include <gladeui/glade-builtins.h>
#include <gladeui/glade-fixed.h>
#include <gladeui/glade-name-context.h>
+#include <gladeui/glade-editable.h>
+#include <gladeui/glade-displayable-values.h>
#endif /* __GLADE_H__ */