summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTristan Van Berkom <tvb@src.gnome.org>2008-04-02 05:17:18 +0000
committerTristan Van Berkom <tvb@src.gnome.org>2008-04-02 05:17:18 +0000
commit744a528262ba5ef273c8c820034ad5289ae41796 (patch)
tree7872d002fe4e05b191dfb66de1cc492411e9ff54
parent431d89ffc1d850045eb24bfd05b73783e6183381 (diff)
downloadglade-744a528262ba5ef273c8c820034ad5289ae41796.tar.gz
Added new entry points to create editor widgets for plugin provided pspecs
* gladeui/glade-widget-adaptor.[ch]: Added new entry points to create editor widgets for plugin provided pspecs and also to create strings based on plugin provided pspec. Moved all accelerater code out of the core and into the plugin, still working on loading glade files with the new parser... A plugins/gtk+/glade-keysyms.c M plugins/gtk+/glade-gtk.c M plugins/gtk+/gtk+.xml.in A plugins/gtk+/glade-accels.c M plugins/gtk+/Makefile.am A plugins/gtk+/glade-accels.h M ChangeLog M gladeui/glade-editor.c M gladeui/glade-editor-property.c M gladeui/glade-editor-property.h M gladeui/glade-widget.c M gladeui/glade-widget.h M gladeui/glade-widget-adaptor.c M gladeui/glade-command.c M gladeui/glade-widget-adaptor.h M gladeui/glade-base-editor.c M gladeui/glade-xml-utils.h D gladeui/glade-keysyms.c M gladeui/glade-property.c M gladeui/glade-property-class.c M gladeui/glade-builtins.c M gladeui/glade-builtins.h M gladeui/glade-project.c M gladeui/Makefile.am svn path=/branches/builder/; revision=1756
-rw-r--r--ChangeLog9
-rw-r--r--gladeui/Makefile.am1
-rw-r--r--gladeui/glade-base-editor.c2
-rw-r--r--gladeui/glade-builtins.c221
-rw-r--r--gladeui/glade-builtins.h39
-rw-r--r--gladeui/glade-command.c11
-rw-r--r--gladeui/glade-editor-property.c909
-rw-r--r--gladeui/glade-editor-property.h104
-rw-r--r--gladeui/glade-editor.c5
-rw-r--r--gladeui/glade-project.c5
-rw-r--r--gladeui/glade-property-class.c124
-rw-r--r--gladeui/glade-property.c19
-rw-r--r--gladeui/glade-widget-adaptor.c163
-rw-r--r--gladeui/glade-widget-adaptor.h53
-rw-r--r--gladeui/glade-widget.c49
-rw-r--r--gladeui/glade-widget.h21
-rw-r--r--gladeui/glade-xml-utils.h2
-rw-r--r--plugins/gtk+/Makefile.am2
-rw-r--r--plugins/gtk+/glade-accels.c943
-rw-r--r--plugins/gtk+/glade-accels.h50
-rw-r--r--plugins/gtk+/glade-gtk.c53
-rw-r--r--plugins/gtk+/glade-keysyms.c (renamed from gladeui/glade-keysyms.c)2
-rw-r--r--plugins/gtk+/gtk+.xml.in3
23 files changed, 1485 insertions, 1305 deletions
diff --git a/ChangeLog b/ChangeLog
index 45ae1805..04963d49 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-04-02 Tristan Van Berkom <tvb@gnome.org>
+
+ * gladeui/glade-widget-adaptor.[ch]: Added new entry points
+ to create editor widgets for plugin provided pspecs and also
+ to create strings based on plugin provided pspec.
+
+ Moved all accelerater code out of the core and into the plugin,
+ still working on loading glade files with the new parser...
+
2008-04-01 Tristan Van Berkom <tvb@gnome.org>
* gladeui/glade-widget.[ch], gladeui/glade-widget-adaptor.[ch],
diff --git a/gladeui/Makefile.am b/gladeui/Makefile.am
index 12f947b6..efa884cb 100644
--- a/gladeui/Makefile.am
+++ b/gladeui/Makefile.am
@@ -53,7 +53,6 @@ libgladeui_1_la_SOURCES = \
glade-accumulators.c \
glade-builtins.c \
glade-app.c \
- glade-keysyms.c \
glade-fixed.c \
glade-base-editor.c \
glade-palette-item.h \
diff --git a/gladeui/glade-base-editor.c b/gladeui/glade-base-editor.c
index 224cbd91..9b70be04 100644
--- a/gladeui/glade-base-editor.c
+++ b/gladeui/glade-base-editor.c
@@ -1675,7 +1675,7 @@ glade_base_editor_add_properties (GladeBaseEditor *editor,
while (property)
{
- eprop = glade_editor_property_new_from_widget (gchild, property, packing, TRUE);
+ eprop = glade_widget_create_editor_property (gchild, property, packing, TRUE);
if (eprop)
glade_base_editor_table_attach (editor,
GLADE_EDITOR_PROPERTY (eprop)->item_label,
diff --git a/gladeui/glade-builtins.c b/gladeui/glade-builtins.c
index 51ce5355..cff51d34 100644
--- a/gladeui/glade-builtins.c
+++ b/gladeui/glade-builtins.c
@@ -41,15 +41,6 @@ struct _GladeParamSpecObjects {
*/
};
-struct _GladeParamSpecAccel {
- GParamSpec parent_instance;
-
- GType type; /* The type this accel key is for; this allows
- * us to verify the validity of any signals for
- * this type.
- */
-};
-
typedef struct _GladeStockItem {
gchar *value_name;
gchar *value_nick;
@@ -277,10 +268,9 @@ glade_standard_stock_image_spec (void)
0, G_PARAM_READWRITE);
}
-
/****************************************************************
* A GList boxed type used by GladeParamSpecObjects and *
- * GladeParamSpecAccel *
+ * GladeParamSpecAccel (which is now in the glade-gtk backend) *
****************************************************************/
GType
glade_glist_get_type (void)
@@ -295,180 +285,6 @@ glade_glist_get_type (void)
return type_id;
}
-GList *
-glade_accel_list_copy (GList *accels)
-{
- GList *ret = NULL, *list;
- GladeAccelInfo *info, *dup_info;
-
- for (list = accels; list; list = list->next)
- {
- info = list->data;
-
- dup_info = g_new0 (GladeAccelInfo, 1);
- dup_info->signal = g_strdup (info->signal);
- dup_info->key = info->key;
- dup_info->modifiers = info->modifiers;
-
- ret = g_list_prepend (ret, dup_info);
- }
-
- return g_list_reverse (ret);
-}
-
-void
-glade_accel_list_free (GList *accels)
-{
- GList *list;
- GladeAccelInfo *info;
-
- for (list = accels; list; list = list->next)
- {
- info = list->data;
-
- g_free (info->signal);
- g_free (info);
- }
- g_list_free (accels);
-}
-
-GType
-glade_accel_glist_get_type (void)
-{
- static GType type_id = 0;
-
- if (!type_id)
- type_id = g_boxed_type_register_static
- ("GladeAccelGList",
- (GBoxedCopyFunc) glade_accel_list_copy,
- (GBoxedFreeFunc) glade_accel_list_free);
- return type_id;
-}
-
-
-/****************************************************************
- * Built-in GladeParamSpecAccel for accelerator properties *
- ****************************************************************/
-gboolean
-glade_keyval_valid (guint val)
-{
- gint i;
-
- for (i = 0; GladeKeys[i].name != NULL; i++)
- {
- if (GladeKeys[i].value == val)
- return TRUE;
- }
- return FALSE;
-}
-
-
-static void
-param_accel_init (GParamSpec *pspec)
-{
- GladeParamSpecAccel *ospec = GLADE_PARAM_SPEC_ACCEL (pspec);
- ospec->type = G_TYPE_OBJECT;
-}
-
-static void
-param_accel_set_default (GParamSpec *pspec,
- GValue *value)
-{
- if (value->data[0].v_pointer != NULL)
- {
- g_free (value->data[0].v_pointer);
- }
- value->data[0].v_pointer = NULL;
-}
-
-static gboolean
-param_accel_validate (GParamSpec *pspec,
- GValue *value)
-{
- /* GladeParamSpecAccel *aspec = GLADE_PARAM_SPEC_ACCEL (pspec); */
- GList *accels, *list, *toremove = NULL;
- GladeAccelInfo *info;
-
- accels = value->data[0].v_pointer;
-
- for (list = accels; list; list = list->next)
- {
- info = list->data;
-
- /* Is it an invalid key ? */
- if (glade_keyval_valid (info->key) == FALSE ||
- /* Does the modifier contain any unwanted bits ? */
- info->modifiers & GDK_MODIFIER_MASK ||
- /* Do we have a signal ? */
- /* FIXME: Check if the signal is valid for 'type' */
- info->signal == NULL)
- toremove = g_list_prepend (toremove, info);
- }
-
- for (list = toremove; list; list = list->next)
- accels = g_list_remove (accels, list->data);
-
- if (toremove) g_list_free (toremove);
-
- value->data[0].v_pointer = accels;
-
- return toremove != NULL;
-}
-
-static gint
-param_accel_values_cmp (GParamSpec *pspec,
- const GValue *value1,
- const GValue *value2)
-{
- guint8 *p1 = value1->data[0].v_pointer;
- guint8 *p2 = value2->data[0].v_pointer;
-
- /* not much to compare here, try to at least provide stable lesser/greater result */
-
- return p1 < p2 ? -1 : p1 > p2;
-}
-
-GType
-glade_param_accel_get_type (void)
-{
- static GType accel_type = 0;
-
- if (accel_type == 0)
- {
- static /* const */ GParamSpecTypeInfo pspec_info = {
- sizeof (GladeParamSpecAccel), /* instance_size */
- 16, /* n_preallocs */
- param_accel_init, /* instance_init */
- 0xdeadbeef, /* value_type, assigned further down */
- NULL, /* finalize */
- param_accel_set_default, /* value_set_default */
- param_accel_validate, /* value_validate */
- param_accel_values_cmp, /* values_cmp */
- };
- pspec_info.value_type = GLADE_TYPE_ACCEL_GLIST;
-
- accel_type = g_param_type_register_static
- ("GladeParamAccel", &pspec_info);
- }
- return accel_type;
-}
-
-GParamSpec *
-glade_param_spec_accel (const gchar *name,
- const gchar *nick,
- const gchar *blurb,
- GType widget_type,
- GParamFlags flags)
-{
- GladeParamSpecAccel *pspec;
-
- pspec = g_param_spec_internal (GLADE_TYPE_PARAM_ACCEL,
- name, nick, blurb, flags);
-
- pspec->type = widget_type;
- return G_PARAM_SPEC (pspec);
-}
-
/****************************************************************
* Built-in GladeParamSpecObjects for object list properties *
* (Used as a pspec to desctibe an AtkRelationSet, but can *
@@ -628,16 +444,6 @@ glade_standard_gdkcolor_spec (void)
G_PARAM_READWRITE);
}
-/* Accelerator spec */
-GParamSpec *
-glade_standard_accel_spec (void)
-{
- return glade_param_spec_accel ("accelerators", _("Accelerators"),
- _("A list of accelerator keys"),
- GTK_TYPE_WIDGET,
- G_PARAM_READWRITE);
-}
-
/****************************************************************
* Basic types follow *
****************************************************************/
@@ -692,31 +498,6 @@ glade_standard_boolean_spec (void)
G_PARAM_READWRITE);
}
-guint
-glade_builtin_key_from_string (const gchar *string)
-{
- gint i;
-
- g_return_val_if_fail (string != NULL, 0);
-
- for (i = 0; GladeKeys[i].name != NULL; i++)
- if (!strcmp (string, GladeKeys[i].name))
- return GladeKeys[i].value;
-
- return 0;
-}
-
-const gchar *
-glade_builtin_string_from_key (guint key)
-{
- gint i;
-
- for (i = 0; GladeKeys[i].name != NULL; i++)
- if (GladeKeys[i].value == key)
- return GladeKeys[i].name;
- return NULL;
-}
-
GType
glade_item_appearance_get_type (void)
{
diff --git a/gladeui/glade-builtins.h b/gladeui/glade-builtins.h
index 378824d8..178bb51f 100644
--- a/gladeui/glade-builtins.h
+++ b/gladeui/glade-builtins.h
@@ -8,28 +8,12 @@
G_BEGIN_DECLS
typedef struct _GladeParamSpecObjects GladeParamSpecObjects;
-typedef struct _GladeParamSpecAccel GladeParamSpecAccel;
-typedef struct _GladeKey GladeKey;
-struct _GladeKey {
- guint value;
- gchar *name;
-};
-
-extern const GladeKey GladeKeys[];
-
-#define GLADE_KEYS_LAST_ALPHANUM "9"
-#define GLADE_KEYS_LAST_EXTRA "questiondown"
-#define GLADE_KEYS_LAST_KP "KP_9"
-#define GLADE_KEYS_LAST_FKEY "F35"
-
#define GLADE_TYPE_STOCK (glade_standard_stock_get_type())
#define GLADE_TYPE_STOCK_IMAGE (glade_standard_stock_image_get_type())
#define GLADE_TYPE_GLIST (glade_glist_get_type())
-#define GLADE_TYPE_ACCEL_GLIST (glade_accel_glist_get_type())
#define GLADE_TYPE_PARAM_OBJECTS (glade_param_objects_get_type())
-#define GLADE_TYPE_PARAM_ACCEL (glade_param_accel_get_type())
#define GLADE_TYPE_ITEM_APPEARANCE (glade_item_appearance_get_type())
#define GLADE_IS_STOCK(pspec) \
@@ -45,42 +29,22 @@ extern const GladeKey GladeKeys[];
(G_TYPE_CHECK_INSTANCE_CAST ((pspec), \
GLADE_TYPE_PARAM_OBJECTS, GladeParamSpecObjects))
-#define GLADE_IS_PARAM_SPEC_ACCEL(pspec) \
- (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), \
- GLADE_TYPE_PARAM_ACCEL))
-#define GLADE_PARAM_SPEC_ACCEL(pspec) \
- (G_TYPE_CHECK_INSTANCE_CAST ((pspec), \
- GLADE_TYPE_PARAM_ACCEL, GladeParamSpecAccel))
-
GType glade_standard_stock_get_type (void) G_GNUC_CONST;
GType glade_standard_stock_image_get_type (void) G_GNUC_CONST;
GType glade_glist_get_type (void) G_GNUC_CONST;
-GType glade_accel_glist_get_type (void) G_GNUC_CONST;
GType glade_param_objects_get_type (void) G_GNUC_CONST;
-GType glade_param_accel_get_type (void) G_GNUC_CONST;
GType glade_item_appearance_get_type (void) G_GNUC_CONST;
guint glade_builtin_key_from_string (const gchar *string);
const gchar *glade_builtin_string_from_key (guint key);
-GList *glade_accel_list_copy (GList *accels);
-void glade_accel_list_free (GList *accels);
-
-
-
GParamSpec *glade_param_spec_objects (const gchar *name,
const gchar *nick,
const gchar *blurb,
GType accepted_type,
GParamFlags flags);
-GParamSpec *glade_param_spec_accel (const gchar *name,
- const gchar *nick,
- const gchar *blurb,
- GType widget_type,
- GParamFlags flags);
-
void glade_param_spec_objects_set_type (GladeParamSpecObjects *pspec,
GType type);
GType glade_param_spec_objects_get_type (GladeParamSpecObjects *pspec);
@@ -90,7 +54,6 @@ GParamSpec *glade_standard_gdkcolor_spec (void);
GParamSpec *glade_standard_objects_spec (void);
GParamSpec *glade_standard_stock_spec (void);
GParamSpec *glade_standard_stock_image_spec (void);
-GParamSpec *glade_standard_accel_spec (void);
GParamSpec *glade_standard_int_spec (void);
GParamSpec *glade_standard_uint_spec (void);
GParamSpec *glade_standard_string_spec (void);
@@ -100,8 +63,6 @@ GParamSpec *glade_standard_boolean_spec (void);
void glade_standard_stock_append_prefix (const gchar *prefix);
-gboolean glade_keyval_valid (guint val);
-
G_END_DECLS
#endif /* __GLADE_BUILTINS_H__ */
diff --git a/gladeui/glade-command.c b/gladeui/glade-command.c
index 9bf91f65..1a1e42b1 100644
--- a/gladeui/glade-command.c
+++ b/gladeui/glade-command.c
@@ -364,8 +364,9 @@ glade_command_set_property_execute (GladeCommand *cmd)
#if 0
{
gchar *str =
- glade_property_class_make_string_from_gvalue
- (sdata->property->klass, &new_value);
+ glade_widget_adaptor_string_from_value
+ (GLADE_WIDGET_ADAPTOR (sdata->property->klass->handle),
+ sdata->property->klass, &new_value);
g_print ("Setting %s property of %s to %s (sumode: %d)\n",
sdata->property->klass->id,
@@ -550,8 +551,10 @@ glade_command_set_property_description (GladeCommandSetProperty *me)
else
{
sdata = me->sdata->data;
- value_name = glade_property_class_make_string_from_gvalue (sdata->property->klass,
- sdata->new_value);
+ value_name = glade_widget_adaptor_string_from_value
+ (GLADE_WIDGET_ADAPTOR (sdata->property->klass->handle),
+ sdata->property->klass, sdata->new_value);
+
if (!value_name || strlen (value_name) > MAX_UNDO_MENU_ITEM_VALUE_LEN
|| strchr (value_name, '_')) {
description = g_strdup_printf (_("Setting %s of %s"),
diff --git a/gladeui/glade-editor-property.c b/gladeui/glade-editor-property.c
index 27e6e410..d74c8fee 100644
--- a/gladeui/glade-editor-property.c
+++ b/gladeui/glade-editor-property.c
@@ -70,61 +70,6 @@ static guint glade_editor_property_signals[LAST_SIGNAL] = {
#define FLAGS_COLUMN_SETTING 0
#define FLAGS_COLUMN_SYMBOL 1
-/*******************************************************************************
- Boiler plate macros (inspired from glade-command.c)
- *******************************************************************************/
-#define MAKE_TYPE(func, type, parent) \
-GType \
-func ## _get_type (void) \
-{ \
- static GType cmd_type = 0; \
- \
- if (!cmd_type) \
- { \
- static const GTypeInfo info = \
- { \
- sizeof (type ## Class), \
- (GBaseInitFunc) NULL, \
- (GBaseFinalizeFunc) NULL, \
- (GClassInitFunc) func ## _class_init, \
- (GClassFinalizeFunc) NULL, \
- NULL, \
- sizeof (type), \
- 0, \
- (GInstanceInitFunc) NULL \
- }; \
- \
- cmd_type = g_type_register_static (parent, #type, &info, 0); \
- } \
- \
- return cmd_type; \
-} \
-
-
-#define GLADE_MAKE_EPROP(type, func) \
-static void \
-func ## _finalize (GObject *object); \
-static void \
-func ## _load (GladeEditorProperty *me, GladeProperty *property); \
-static GtkWidget * \
-func ## _create_input (GladeEditorProperty *me); \
-static void \
-func ## _class_init (gpointer parent_tmp, gpointer notused) \
-{ \
- GladeEditorPropertyClass *parent = parent_tmp; \
- GObjectClass* object_class; \
- object_class = G_OBJECT_CLASS (parent); \
- parent->load = func ## _load; \
- parent->create_input = func ## _create_input; \
- object_class->finalize = func ## _finalize; \
-} \
-typedef struct { \
- GladeEditorPropertyClass cmd; \
-} type ## Class; \
-static MAKE_TYPE(func, type, GLADE_TYPE_EDITOR_PROPERTY)
-
-
-
/*******************************************************************************
GladeEditorPropertyClass
@@ -134,9 +79,15 @@ static MAKE_TYPE(func, type, GLADE_TYPE_EDITOR_PROPERTY)
static void glade_editor_property_load_common (GladeEditorProperty *eprop,
GladeProperty *property);
-/* For use in editor implementations
+/**
+ * glade_editor_property_commit:
+ * @eprop: A #GladeEditorProperty
+ * @value: The #GValue
+ *
+ * Commits the value onto the widget and glade-command interface
+ * (for use in GladeEditorProperty implementations)
*/
-static void
+void
glade_editor_property_commit (GladeEditorProperty *eprop,
GValue *value)
{
@@ -596,7 +547,6 @@ typedef struct {
} GladeEPropNumeric;
GLADE_MAKE_EPROP (GladeEPropNumeric, glade_eprop_numeric)
-#define GLADE_TYPE_EPROP_NUMERIC (glade_eprop_numeric_get_type())
#define GLADE_EPROP_NUMERIC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_NUMERIC, GladeEPropNumeric))
#define GLADE_EPROP_NUMERIC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_NUMERIC, GladeEPropNumericClass))
#define GLADE_IS_EPROP_NUMERIC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_NUMERIC))
@@ -717,7 +667,6 @@ typedef struct {
} GladeEPropEnum;
GLADE_MAKE_EPROP (GladeEPropEnum, glade_eprop_enum)
-#define GLADE_TYPE_EPROP_ENUM (glade_eprop_enum_get_type())
#define GLADE_EPROP_ENUM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_ENUM, GladeEPropEnum))
#define GLADE_EPROP_ENUM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_ENUM, GladeEPropEnumClass))
#define GLADE_IS_EPROP_ENUM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_ENUM))
@@ -871,7 +820,6 @@ typedef struct {
} GladeEPropFlags;
GLADE_MAKE_EPROP (GladeEPropFlags, glade_eprop_flags)
-#define GLADE_TYPE_EPROP_FLAGS (glade_eprop_flags_get_type())
#define GLADE_EPROP_FLAGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_FLAGS, GladeEPropFlags))
#define GLADE_EPROP_FLAGS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_FLAGS, GladeEPropFlagsClass))
#define GLADE_IS_EPROP_FLAGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_FLAGS))
@@ -1160,7 +1108,6 @@ typedef struct {
} GladeEPropColor;
GLADE_MAKE_EPROP (GladeEPropColor, glade_eprop_color)
-#define GLADE_TYPE_EPROP_COLOR (glade_eprop_color_get_type())
#define GLADE_EPROP_COLOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_COLOR, GladeEPropColor))
#define GLADE_EPROP_COLOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_COLOR, GladeEPropColorClass))
#define GLADE_IS_EPROP_COLOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_COLOR))
@@ -1187,8 +1134,9 @@ glade_eprop_color_load (GladeEditorProperty *eprop, GladeProperty *property)
if (property)
{
- if ((text = glade_property_class_make_string_from_gvalue
- (eprop->klass, property->value)) != NULL)
+ if ((text = glade_widget_adaptor_string_from_value
+ (GLADE_WIDGET_ADAPTOR (eprop->klass->handle),
+ eprop->klass, property->value)) != NULL)
{
gtk_entry_set_text (GTK_ENTRY (eprop_color->entry), text);
g_free (text);
@@ -1268,7 +1216,6 @@ typedef struct {
} GladeEPropNamedIcon;
GLADE_MAKE_EPROP (GladeEPropNamedIcon, glade_eprop_named_icon)
-#define GLADE_TYPE_EPROP_NAMED_ICON (glade_eprop_named_icon_get_type())
#define GLADE_EPROP_NAMED_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_NAMED_ICON, GladeEPropNamedIcon))
#define GLADE_EPROP_NAMED_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_NAMED_ICON, GladeEPropNamedIconClass))
#define GLADE_IS_EPROP_NAMED_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_NAMED_ICON))
@@ -1478,7 +1425,6 @@ typedef struct {
} GladeEPropText;
GLADE_MAKE_EPROP (GladeEPropText, glade_eprop_text)
-#define GLADE_TYPE_EPROP_TEXT (glade_eprop_text_get_type())
#define GLADE_EPROP_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_TEXT, GladeEPropText))
#define GLADE_EPROP_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_TEXT, GladeEPropTextClass))
#define GLADE_IS_EPROP_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_TEXT))
@@ -1519,8 +1465,9 @@ glade_eprop_text_load (GladeEditorProperty *eprop, GladeProperty *property)
if (G_VALUE_HOLDS (property->value, G_TYPE_STRV) ||
G_VALUE_HOLDS (property->value, G_TYPE_VALUE_ARRAY))
{
- gchar *text = glade_property_class_make_string_from_gvalue (
- property->klass, property->value);
+ gchar *text = glade_widget_adaptor_string_from_value
+ (GLADE_WIDGET_ADAPTOR (property->klass->handle),
+ property->klass, property->value);
gtk_text_buffer_set_text (buffer, text ? text : "", -1);
g_free (text);
}
@@ -1860,7 +1807,6 @@ typedef struct {
} GladeEPropBool;
GLADE_MAKE_EPROP (GladeEPropBool, glade_eprop_bool)
-#define GLADE_TYPE_EPROP_BOOL (glade_eprop_bool_get_type())
#define GLADE_EPROP_BOOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_BOOL, GladeEPropBool))
#define GLADE_EPROP_BOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_BOOL, GladeEPropBoolClass))
#define GLADE_IS_EPROP_BOOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_BOOL))
@@ -1942,7 +1888,6 @@ typedef struct {
} GladeEPropUnichar;
GLADE_MAKE_EPROP (GladeEPropUnichar, glade_eprop_unichar)
-#define GLADE_TYPE_EPROP_UNICHAR (glade_eprop_unichar_get_type())
#define GLADE_EPROP_UNICHAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_UNICHAR, GladeEPropUnichar))
#define GLADE_EPROP_UNICHAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_UNICHAR, GladeEPropUnicharClass))
#define GLADE_IS_EPROP_UNICHAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_UNICHAR))
@@ -2072,7 +2017,6 @@ typedef struct {
} GladeEPropResource;
GLADE_MAKE_EPROP (GladeEPropResource, glade_eprop_resource)
-#define GLADE_TYPE_EPROP_RESOURCE (glade_eprop_resource_get_type())
#define GLADE_EPROP_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_RESOURCE, GladeEPropResource))
#define GLADE_EPROP_RESOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_RESOURCE, GladeEPropResourceClass))
#define GLADE_IS_EPROP_RESOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_RESOURCE))
@@ -2173,8 +2117,9 @@ glade_eprop_resource_load (GladeEditorProperty *eprop, GladeProperty *property)
if (property == NULL) return;
- file = glade_property_class_make_string_from_gvalue
- (eprop->klass, property->value);
+ file = glade_widget_adaptor_string_from_value
+ (GLADE_WIDGET_ADAPTOR (eprop->klass->handle),
+ eprop->klass, property->value);
if (file)
{
gtk_entry_set_text (GTK_ENTRY (eprop_resource->entry), file);
@@ -2238,7 +2183,6 @@ typedef struct {
} GladeEPropObject;
GLADE_MAKE_EPROP (GladeEPropObject, glade_eprop_object)
-#define GLADE_TYPE_EPROP_OBJECT (glade_eprop_object_get_type())
#define GLADE_EPROP_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_OBJECT, GladeEPropObject))
#define GLADE_EPROP_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_OBJECT, GladeEPropObjectClass))
#define GLADE_IS_EPROP_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_OBJECT))
@@ -2682,8 +2626,9 @@ glade_eprop_object_load (GladeEditorProperty *eprop, GladeProperty *property)
if (property == NULL) return;
- if ((obj_name = glade_property_class_make_string_from_gvalue
- (eprop->klass, property->value)) != NULL)
+ if ((obj_name = glade_widget_adaptor_string_from_value
+ (GLADE_WIDGET_ADAPTOR (eprop->klass->handle),
+ eprop->klass, property->value)) != NULL)
{
gtk_entry_set_text (GTK_ENTRY (eprop_object->entry), obj_name);
g_free (obj_name);
@@ -2728,7 +2673,6 @@ typedef struct {
} GladeEPropObjects;
GLADE_MAKE_EPROP (GladeEPropObjects, glade_eprop_objects)
-#define GLADE_TYPE_EPROP_OBJECTS (glade_eprop_objects_get_type())
#define GLADE_EPROP_OBJECTS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_OBJECTS, GladeEPropObjects))
#define GLADE_EPROP_OBJECTS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_OBJECTS, GladeEPropObjectsClass))
#define GLADE_IS_EPROP_OBJECTS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_OBJECTS))
@@ -2753,8 +2697,9 @@ glade_eprop_objects_load (GladeEditorProperty *eprop, GladeProperty *property)
if (property == NULL) return;
- if ((obj_name = glade_property_class_make_string_from_gvalue
- (eprop->klass, property->value)) != NULL)
+ if ((obj_name = glade_widget_adaptor_string_from_value
+ (GLADE_WIDGET_ADAPTOR (eprop->klass->handle),
+ eprop->klass, property->value)) != NULL)
{
gtk_entry_set_text (GTK_ENTRY (eprop_objects->entry), obj_name);
g_free (obj_name);
@@ -2913,7 +2858,6 @@ typedef struct {
} GladeEPropAdjustment;
GLADE_MAKE_EPROP (GladeEPropAdjustment, glade_eprop_adjustment)
-#define GLADE_TYPE_EPROP_ADJUSTMENT (glade_eprop_adjustment_get_type())
#define GLADE_EPROP_ADJUSTMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_ADJUSTMENT, GladeEPropAdjustment))
#define GLADE_EPROP_ADJUSTMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_ADJUSTMENT, GladeEPropAdjustmentClass))
#define GLADE_IS_EPROP_ADJUSTMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_ADJUSTMENT))
@@ -3165,813 +3109,10 @@ glade_eprop_adjustment_create_input (GladeEditorProperty *eprop)
/*******************************************************************************
- GladeEditorPropertyAccelClass
- *******************************************************************************/
-enum {
- ACCEL_COLUMN_SIGNAL = 0,
- ACCEL_COLUMN_REAL_SIGNAL,
- ACCEL_COLUMN_KEY,
- ACCEL_COLUMN_MOD_SHIFT,
- ACCEL_COLUMN_MOD_CNTL,
- ACCEL_COLUMN_MOD_ALT,
- ACCEL_COLUMN_IS_CLASS,
- ACCEL_COLUMN_IS_SIGNAL,
- ACCEL_COLUMN_KEY_ENTERED,
- ACCEL_COLUMN_KEY_SLOT,
- ACCEL_NUM_COLUMNS
-};
-
-enum {
- ACCEL_COMBO_COLUMN_TEXT = 0,
- ACCEL_COMBO_NUM_COLUMNS,
-};
-
-typedef struct {
- GladeEditorProperty parent_instance;
-
- GtkWidget *entry;
- GList *parent_iters;
- GtkTreeModel *model;
-} GladeEPropAccel;
-
-typedef struct {
- GtkTreeIter *iter;
- gchar *name; /* <-- dont free */
-} GladeEpropIterTab;
-
-
-static GtkTreeModel *keysyms_model = NULL;
-
-GLADE_MAKE_EPROP (GladeEPropAccel, glade_eprop_accel)
-#define GLADE_TYPE_EPROP_ACCEL (glade_eprop_accel_get_type())
-#define GLADE_EPROP_ACCEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_ACCEL, GladeEPropAccel))
-#define GLADE_EPROP_ACCEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_ACCEL, GladeEPropAccelClass))
-#define GLADE_IS_EPROP_ACCEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_ACCEL))
-#define GLADE_IS_EPROP_ACCEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EPROP_ACCEL))
-#define GLADE_EPROP_ACCEL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GLADE_EPROP_ACCEL, GladeEPropAccelClass))
-
-
-static GtkTreeModel *
-create_keysyms_model (void)
-{
- GtkTreeModel *model;
- GtkTreeIter iter, alphanum, fkey, keypad, other, extra;
- GtkTreeIter *parent;
- gint i;
-
- model = (GtkTreeModel *)gtk_tree_store_new
- (ACCEL_COMBO_NUM_COLUMNS,
- G_TYPE_STRING); /* The Key charachter name */
-
- gtk_tree_store_append (GTK_TREE_STORE (model), &alphanum, NULL);
- gtk_tree_store_set
- (GTK_TREE_STORE (model), &alphanum,
- ACCEL_COMBO_COLUMN_TEXT, _("Alphanumerical"), -1);
-
- gtk_tree_store_append (GTK_TREE_STORE (model), &extra, NULL);
- gtk_tree_store_set
- (GTK_TREE_STORE (model), &extra,
- ACCEL_COMBO_COLUMN_TEXT, _("Extra"), -1);
-
- gtk_tree_store_append (GTK_TREE_STORE (model), &keypad, NULL);
- gtk_tree_store_set
- (GTK_TREE_STORE (model), &keypad,
- ACCEL_COMBO_COLUMN_TEXT, _("Keypad"), -1);
-
- gtk_tree_store_append (GTK_TREE_STORE (model), &fkey, NULL);
- gtk_tree_store_set
- (GTK_TREE_STORE (model), &fkey,
- ACCEL_COMBO_COLUMN_TEXT, _("Functions"), -1);
-
- gtk_tree_store_append (GTK_TREE_STORE (model), &other, NULL);
- gtk_tree_store_set
- (GTK_TREE_STORE (model), &other,
- ACCEL_COMBO_COLUMN_TEXT, _("Other"), -1);
-
- parent = &alphanum;
-
- for (i = 0; GladeKeys[i].name != NULL; i++)
- {
- gtk_tree_store_append (GTK_TREE_STORE (model), &iter, parent);
- gtk_tree_store_set
- (GTK_TREE_STORE (model), &iter,
- ACCEL_COMBO_COLUMN_TEXT, GladeKeys[i].name, -1);
-
- if (!strcmp (GladeKeys[i].name, GLADE_KEYS_LAST_ALPHANUM))
- parent = &extra;
- else if (!strcmp (GladeKeys[i].name, GLADE_KEYS_LAST_EXTRA))
- parent = &keypad;
- else if (!strcmp (GladeKeys[i].name, GLADE_KEYS_LAST_KP))
- parent = &fkey;
- else if (!strcmp (GladeKeys[i].name, GLADE_KEYS_LAST_FKEY))
- parent = &other;
- }
- return model;
-}
-
-static void
-glade_eprop_accel_finalize (GObject *object)
-{
- /* Chain up */
- G_OBJECT_CLASS (editor_property_class)->finalize (object);
-}
-
-static void
-glade_eprop_accel_load (GladeEditorProperty *eprop,
- GladeProperty *property)
-{
- GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
- gchar *accels;
-
- /* Chain up first */
- editor_property_class->load (eprop, property);
-
- if (property == NULL) return;
-
- if ((accels = glade_property_class_make_string_from_gvalue
- (eprop->klass, property->value)) != NULL)
- {
- gtk_entry_set_text (GTK_ENTRY (eprop_accel->entry), accels);
- g_free (accels);
- }
- else
- gtk_entry_set_text (GTK_ENTRY (eprop_accel->entry), "");
-
-}
-
-static gint
-eprop_find_iter (GladeEpropIterTab *iter_tab,
- gchar *name)
-{
- return strcmp (iter_tab->name, name);
-}
-
-static void
-iter_tab_free (GladeEpropIterTab *iter_tab)
-{
- gtk_tree_iter_free (iter_tab->iter);
- g_free (iter_tab);
-}
-
-static void
-glade_eprop_accel_populate_view (GladeEditorProperty *eprop,
- GtkTreeView *view)
-{
- GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
- GladeSignalClass *sclass;
- GladeWidgetAdaptor *adaptor = glade_widget_adaptor_from_pclass (eprop->klass);
- GtkTreeStore *model = (GtkTreeStore *)gtk_tree_view_get_model (view);
- GtkTreeIter iter;
- GladeEpropIterTab *parent_tab;
- GladeAccelInfo *info;
- GList *list, *l, *found, *accelerators;
- gchar *name;
-
- accelerators = g_value_get_boxed (eprop->property->value);
-
- /* First make parent iters...
- */
- for (list = adaptor->signals; list; list = list->next)
- {
- sclass = list->data;
-
- /* Only action signals have accelerators. */
- if ((sclass->query.signal_flags & G_SIGNAL_ACTION) == 0)
- continue;
-
- if (g_list_find_custom (eprop_accel->parent_iters,
- sclass->type,
- (GCompareFunc)eprop_find_iter) == NULL)
- {
- gtk_tree_store_append (model, &iter, NULL);
- gtk_tree_store_set (model, &iter,
- ACCEL_COLUMN_SIGNAL, sclass->type,
- ACCEL_COLUMN_IS_CLASS, TRUE,
- ACCEL_COLUMN_IS_SIGNAL, FALSE,
- -1);
-
- parent_tab = g_new0 (GladeEpropIterTab, 1);
- parent_tab->name = sclass->type;
- parent_tab->iter = gtk_tree_iter_copy (&iter);
-
- eprop_accel->parent_iters =
- g_list_prepend (eprop_accel->parent_iters,
- parent_tab);
- }
- }
-
- /* Now we populate...
- */
- for (list = adaptor->signals; list; list = list->next)
- {
- sclass = list->data;
-
- /* Only action signals have accelerators. */
- if ((sclass->query.signal_flags & G_SIGNAL_ACTION) == 0)
- continue;
-
- if ((found = g_list_find_custom (eprop_accel->parent_iters,
- sclass->type,
- (GCompareFunc)eprop_find_iter)) != NULL)
- {
- parent_tab = found->data;
- name = g_strdup_printf (" %s", sclass->name);
-
- /* Populate from accelerator list
- */
- for (l = accelerators; l; l = l->next)
- {
- info = l->data;
-
- if (strcmp (info->signal, sclass->name))
- continue;
-
- gtk_tree_store_append (model, &iter, parent_tab->iter);
- gtk_tree_store_set
- (model, &iter,
- ACCEL_COLUMN_SIGNAL, name,
- ACCEL_COLUMN_REAL_SIGNAL, sclass->name,
- ACCEL_COLUMN_IS_CLASS, FALSE,
- ACCEL_COLUMN_IS_SIGNAL, TRUE,
- ACCEL_COLUMN_MOD_SHIFT,
- (info->modifiers & GDK_SHIFT_MASK) != 0,
- ACCEL_COLUMN_MOD_CNTL,
- (info->modifiers & GDK_CONTROL_MASK) != 0,
- ACCEL_COLUMN_MOD_ALT,
- (info->modifiers & GDK_MOD1_MASK) != 0,
- ACCEL_COLUMN_KEY,
- glade_builtin_string_from_key (info->key),
- ACCEL_COLUMN_KEY_ENTERED, TRUE,
- ACCEL_COLUMN_KEY_SLOT, FALSE,
- -1);
- }
-
- /* Append a new empty slot at the end */
- gtk_tree_store_append (model, &iter, parent_tab->iter);
- gtk_tree_store_set
- (model, &iter,
- ACCEL_COLUMN_SIGNAL, name,
- ACCEL_COLUMN_REAL_SIGNAL, sclass->name,
- ACCEL_COLUMN_IS_CLASS, FALSE,
- ACCEL_COLUMN_IS_SIGNAL, TRUE,
- ACCEL_COLUMN_MOD_SHIFT, FALSE,
- ACCEL_COLUMN_MOD_CNTL, FALSE,
- ACCEL_COLUMN_MOD_ALT, FALSE,
- ACCEL_COLUMN_KEY, _("<choose a key>"),
- ACCEL_COLUMN_KEY_ENTERED, FALSE,
- ACCEL_COLUMN_KEY_SLOT, TRUE,
- -1);
-
- g_free (name);
- }
- }
-}
-
-static void
-key_edited (GtkCellRendererText *cell,
- const gchar *path_string,
- const gchar *new_text,
- GladeEditorProperty *eprop)
-{
- GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
- gboolean key_was_set;
- const gchar *text;
- GtkTreeIter iter, parent_iter, new_iter;
-
- if (!gtk_tree_model_get_iter_from_string (eprop_accel->model,
- &iter, path_string))
- return;
-
- gtk_tree_model_get (eprop_accel->model, &iter,
- ACCEL_COLUMN_KEY_ENTERED, &key_was_set,
- -1);
-
- /* If user selects "none"; remove old entry or ignore new one.
- */
- if (!new_text || new_text[0] == '\0' ||
- glade_builtin_string_from_key ((guint)new_text[0]) == NULL ||
- g_utf8_collate (new_text, _("None")) == 0 ||
- g_utf8_collate (new_text, _("<choose a key>")) == 0)
- {
- if (key_was_set)
- gtk_tree_store_remove
- (GTK_TREE_STORE (eprop_accel->model), &iter);
-
- return;
- }
-
- if (glade_builtin_key_from_string (new_text) != 0)
- text = new_text;
- else
- text = glade_builtin_string_from_key ((guint)new_text[0]);
-
- gtk_tree_store_set
- (GTK_TREE_STORE (eprop_accel->model), &iter,
- ACCEL_COLUMN_KEY, text,
- ACCEL_COLUMN_KEY_ENTERED, TRUE,
- ACCEL_COLUMN_KEY_SLOT, FALSE,
- -1);
-
- /* Append a new one if needed
- */
- if (key_was_set == FALSE &&
- gtk_tree_model_iter_parent (eprop_accel->model,
- &parent_iter, &iter))
- {
- gchar *signal, *real_signal;
-
- gtk_tree_model_get (eprop_accel->model, &iter,
- ACCEL_COLUMN_SIGNAL, &signal,
- ACCEL_COLUMN_REAL_SIGNAL, &real_signal,
- -1);
-
- /* Append a new empty slot at the end */
- gtk_tree_store_insert_after (GTK_TREE_STORE (eprop_accel->model),
- &new_iter, &parent_iter, &iter);
- gtk_tree_store_set (GTK_TREE_STORE (eprop_accel->model), &new_iter,
- ACCEL_COLUMN_SIGNAL, signal,
- ACCEL_COLUMN_REAL_SIGNAL, real_signal,
- ACCEL_COLUMN_IS_CLASS, FALSE,
- ACCEL_COLUMN_IS_SIGNAL, TRUE,
- ACCEL_COLUMN_MOD_SHIFT, FALSE,
- ACCEL_COLUMN_MOD_CNTL, FALSE,
- ACCEL_COLUMN_MOD_ALT, FALSE,
- ACCEL_COLUMN_KEY, _("<choose a key>"),
- ACCEL_COLUMN_KEY_ENTERED, FALSE,
- ACCEL_COLUMN_KEY_SLOT, TRUE,
- -1);
- g_free (signal);
- g_free (real_signal);
- }
-}
-
-static void
-modifier_toggled (GtkCellRendererToggle *cell,
- gchar *path_string,
- GladeEditorProperty *eprop)
-{
- GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
- GtkTreeIter iter;
- gint column;
- gboolean active, key_entered;
-
- if (!gtk_tree_model_get_iter_from_string (eprop_accel->model,
- &iter, path_string))
- return;
-
- column = GPOINTER_TO_INT (g_object_get_data
- (G_OBJECT (cell), "model-column"));
-
- gtk_tree_model_get
- (eprop_accel->model, &iter,
- ACCEL_COLUMN_KEY_ENTERED, &key_entered,
- column, &active, -1);
-
- if (key_entered)
- gtk_tree_store_set
- (GTK_TREE_STORE (eprop_accel->model), &iter,
- column, !active, -1);
-}
-
-
-static GtkWidget *
-glade_eprop_accel_view (GladeEditorProperty *eprop)
-{
- GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
- GtkWidget *view_widget;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
-
- eprop_accel->model = (GtkTreeModel *)gtk_tree_store_new
- (ACCEL_NUM_COLUMNS,
- G_TYPE_STRING, /* The GSignal name formatted for display */
- G_TYPE_STRING, /* The GSignal name */
- G_TYPE_STRING, /* The Gdk keycode */
- G_TYPE_BOOLEAN, /* The shift modifier */
- G_TYPE_BOOLEAN, /* The cntl modifier */
- G_TYPE_BOOLEAN, /* The alt modifier */
- G_TYPE_BOOLEAN, /* Whether this is a class entry */
- G_TYPE_BOOLEAN, /* Whether this is a signal entry (oposite of above) */
- G_TYPE_BOOLEAN, /* Whether the key has been entered for this row */
- G_TYPE_BOOLEAN); /* Oposite of above */
-
- view_widget = gtk_tree_view_new_with_model (eprop_accel->model);
- g_object_set (G_OBJECT (view_widget), "enable-search", FALSE, NULL);
-
- /********************* fake invisible column *********************/
- renderer = gtk_cell_renderer_text_new ();
- g_object_set (G_OBJECT (renderer), "editable", FALSE, "visible", FALSE, NULL);
-
- column = gtk_tree_view_column_new_with_attributes (NULL, renderer, NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
-
- gtk_tree_view_column_set_visible (column, FALSE);
- gtk_tree_view_set_expander_column (GTK_TREE_VIEW (view_widget), column);
-
- /********************* signal name column *********************/
- renderer = gtk_cell_renderer_text_new ();
- g_object_set (G_OBJECT (renderer),
- "editable", FALSE,
- "weight", PANGO_WEIGHT_BOLD,
- NULL);
-
- column = gtk_tree_view_column_new_with_attributes
- (_("Signal"), renderer,
- "text", ACCEL_COLUMN_SIGNAL,
- "weight-set", ACCEL_COLUMN_IS_CLASS,
- NULL);
-
- g_object_set (G_OBJECT (column), "expand", TRUE, NULL);
-
- gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
-
- /********************* key name column *********************/
- if (keysyms_model == NULL)
- keysyms_model = create_keysyms_model ();
-
- renderer = gtk_cell_renderer_combo_new ();
- g_object_set (G_OBJECT (renderer),
- "editable", TRUE,
- "model", keysyms_model,
- "text-column", ACCEL_COMBO_COLUMN_TEXT,
- "has-entry", TRUE,
- "style", PANGO_STYLE_ITALIC,
- "foreground", "Gray",
- NULL);
-
- g_signal_connect (renderer, "edited",
- G_CALLBACK (key_edited), eprop);
-
- column = gtk_tree_view_column_new_with_attributes
- (_("Key"), renderer,
- "text", ACCEL_COLUMN_KEY,
- "style-set", ACCEL_COLUMN_KEY_SLOT,
- "foreground-set", ACCEL_COLUMN_KEY_SLOT,
- "visible", ACCEL_COLUMN_IS_SIGNAL,
- NULL);
-
- g_object_set (G_OBJECT (column), "expand", TRUE, NULL);
-
- gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
-
- /********************* shift modifier column *********************/
- renderer = gtk_cell_renderer_toggle_new ();
- column = gtk_tree_view_column_new_with_attributes
- (_("Shift"), renderer,
- "visible", ACCEL_COLUMN_IS_SIGNAL,
- "sensitive", ACCEL_COLUMN_KEY_ENTERED,
- "active", ACCEL_COLUMN_MOD_SHIFT,
- NULL);
-
- g_object_set_data (G_OBJECT (renderer), "model-column",
- GINT_TO_POINTER (ACCEL_COLUMN_MOD_SHIFT));
- g_signal_connect (G_OBJECT (renderer), "toggled",
- G_CALLBACK (modifier_toggled), eprop);
-
- gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
-
- /********************* control modifier column *********************/
- renderer = gtk_cell_renderer_toggle_new ();
- column = gtk_tree_view_column_new_with_attributes
- (_("Control"), renderer,
- "visible", ACCEL_COLUMN_IS_SIGNAL,
- "sensitive", ACCEL_COLUMN_KEY_ENTERED,
- "active", ACCEL_COLUMN_MOD_CNTL,
- NULL);
-
- g_object_set_data (G_OBJECT (renderer), "model-column",
- GINT_TO_POINTER (ACCEL_COLUMN_MOD_CNTL));
- g_signal_connect (G_OBJECT (renderer), "toggled",
- G_CALLBACK (modifier_toggled), eprop);
-
- gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
-
- /********************* alt modifier column *********************/
- renderer = gtk_cell_renderer_toggle_new ();
- column = gtk_tree_view_column_new_with_attributes
- (_("Alt"), renderer,
- "visible", ACCEL_COLUMN_IS_SIGNAL,
- "sensitive", ACCEL_COLUMN_KEY_ENTERED,
- "active", ACCEL_COLUMN_MOD_ALT,
- NULL);
-
- g_object_set_data (G_OBJECT (renderer), "model-column",
- GINT_TO_POINTER (ACCEL_COLUMN_MOD_ALT));
- g_signal_connect (G_OBJECT (renderer), "toggled",
- G_CALLBACK (modifier_toggled), eprop);
-
- gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
-
- return view_widget;
-}
-
-static gboolean
-glade_eprop_accel_accum_accelerators (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- GList **ret)
-{
- GladeAccelInfo *info;
- gchar *signal, *key_str;
- gboolean shift, cntl, alt, entered;
-
- gtk_tree_model_get (model, iter, ACCEL_COLUMN_KEY_ENTERED, &entered, -1);
- if (entered == FALSE) return FALSE;
-
- gtk_tree_model_get (model, iter,
- ACCEL_COLUMN_REAL_SIGNAL, &signal,
- ACCEL_COLUMN_KEY, &key_str,
- ACCEL_COLUMN_MOD_SHIFT, &shift,
- ACCEL_COLUMN_MOD_CNTL, &cntl,
- ACCEL_COLUMN_MOD_ALT, &alt,
- -1);
-
- info = g_new0 (GladeAccelInfo, 1);
- info->signal = signal;
- info->key = glade_builtin_key_from_string (key_str);
- info->modifiers = (shift ? GDK_SHIFT_MASK : 0) |
- (cntl ? GDK_CONTROL_MASK : 0) |
- (alt ? GDK_MOD1_MASK : 0);
-
- *ret = g_list_prepend (*ret, info);
-
- g_free (key_str);
-
- return FALSE;
-}
-
-
-static void
-glade_eprop_accel_show_dialog (GtkWidget *dialog_button,
- GladeEditorProperty *eprop)
-{
- GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
- GtkWidget *dialog, *parent, *vbox, *sw, *tree_view;
- GladeProject *project;
- GValue *value;
- GList *accelerators = NULL;
- gint res;
-
- project = glade_widget_get_project (eprop->property->widget);
- parent = gtk_widget_get_toplevel (GTK_WIDGET (eprop));
-
- dialog = gtk_dialog_new_with_buttons (_("Choose accelerator keys..."),
- GTK_WINDOW (parent),
- GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_STOCK_CLEAR, GLADE_RESPONSE_CLEAR,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
-
- gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
-
- vbox = gtk_vbox_new (FALSE, 6);
- gtk_widget_show (vbox);
-
- gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
-
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, TRUE, TRUE, 0);
-
- sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_widget_show (sw);
- gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
- gtk_widget_set_size_request (sw, 400, 200);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
-
- tree_view = glade_eprop_accel_view (eprop);
- glade_eprop_accel_populate_view (eprop, GTK_TREE_VIEW (tree_view));
-
- gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
-
- gtk_widget_show (tree_view);
- gtk_container_add (GTK_CONTAINER (sw), tree_view);
-
- /* Run the dialog */
- res = gtk_dialog_run (GTK_DIALOG (dialog));
- if (res == GTK_RESPONSE_OK)
- {
- gtk_tree_model_foreach
- (gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view)),
- (GtkTreeModelForeachFunc)
- glade_eprop_accel_accum_accelerators, &accelerators);
-
- value = g_new0 (GValue, 1);
- g_value_init (value, GLADE_TYPE_ACCEL_GLIST);
- g_value_take_boxed (value, accelerators);
-
- glade_editor_property_commit (eprop, value);
-
- g_value_unset (value);
- g_free (value);
- }
- else if (res == GLADE_RESPONSE_CLEAR)
- {
- value = g_new0 (GValue, 1);
- g_value_init (value, GLADE_TYPE_ACCEL_GLIST);
- g_value_set_boxed (value, NULL);
-
- glade_editor_property_commit (eprop, value);
-
- g_value_unset (value);
- g_free (value);
- }
-
- /* Clean up ...
- */
- gtk_widget_destroy (dialog);
-
- g_object_unref (G_OBJECT (eprop_accel->model));
- eprop_accel->model = NULL;
-
- if (eprop_accel->parent_iters)
- {
- g_list_foreach (eprop_accel->parent_iters, (GFunc)iter_tab_free, NULL);
- g_list_free (eprop_accel->parent_iters);
- eprop_accel->parent_iters = NULL;
- }
-
-}
-
-static GtkWidget *
-glade_eprop_accel_create_input (GladeEditorProperty *eprop)
-{
- GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
- GtkWidget *hbox;
- GtkWidget *button;
-
- hbox = gtk_hbox_new (FALSE, 0);
- eprop_accel->entry = gtk_entry_new ();
- gtk_entry_set_editable (GTK_ENTRY (eprop_accel->entry), FALSE);
- gtk_widget_show (eprop_accel->entry);
- gtk_box_pack_start (GTK_BOX (hbox), eprop_accel->entry, TRUE, TRUE, 0);
-
- button = gtk_button_new_with_label ("...");
- gtk_widget_show (button);
- gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
-
- g_signal_connect (G_OBJECT (button), "clicked",
- G_CALLBACK (glade_eprop_accel_show_dialog),
- eprop);
-
- return hbox;
-}
-
-
-
-/*******************************************************************************
- Misc static stuff
- *******************************************************************************/
-static GType
-glade_editor_property_type (GParamSpec *pspec)
-{
- GType type = 0;
-
- if (pspec->value_type == GLADE_TYPE_STOCK ||
- G_IS_PARAM_SPEC_ENUM(pspec))
- type = GLADE_TYPE_EPROP_ENUM;
- else if (G_IS_PARAM_SPEC_FLAGS(pspec))
- type = GLADE_TYPE_EPROP_FLAGS;
- else if (G_IS_PARAM_SPEC_VALUE_ARRAY (pspec))
- {
- if (pspec->value_type == G_TYPE_VALUE_ARRAY)
- type = GLADE_TYPE_EPROP_TEXT;
- }
- else if (G_IS_PARAM_SPEC_BOXED(pspec))
- {
- if (pspec->value_type == GDK_TYPE_COLOR)
- type = GLADE_TYPE_EPROP_COLOR;
- else if (pspec->value_type == G_TYPE_STRV)
- type = GLADE_TYPE_EPROP_TEXT;
- }
- else if (G_IS_PARAM_SPEC_STRING(pspec))
- type = GLADE_TYPE_EPROP_TEXT;
- else if (G_IS_PARAM_SPEC_BOOLEAN(pspec))
- type = GLADE_TYPE_EPROP_BOOL;
- else if (G_IS_PARAM_SPEC_FLOAT(pspec) ||
- G_IS_PARAM_SPEC_DOUBLE(pspec) ||
- G_IS_PARAM_SPEC_INT(pspec) ||
- G_IS_PARAM_SPEC_UINT(pspec) ||
- G_IS_PARAM_SPEC_LONG(pspec) ||
- G_IS_PARAM_SPEC_ULONG(pspec) ||
- G_IS_PARAM_SPEC_INT64(pspec) ||
- G_IS_PARAM_SPEC_UINT64(pspec))
- type = GLADE_TYPE_EPROP_NUMERIC;
- else if (G_IS_PARAM_SPEC_UNICHAR(pspec))
- type = GLADE_TYPE_EPROP_UNICHAR;
- else if (G_IS_PARAM_SPEC_OBJECT(pspec))
- {
- if (pspec->value_type == GDK_TYPE_PIXBUF)
- type = GLADE_TYPE_EPROP_RESOURCE;
- else if (pspec->value_type == GTK_TYPE_ADJUSTMENT)
- type = GLADE_TYPE_EPROP_ADJUSTMENT;
- else
- type = GLADE_TYPE_EPROP_OBJECT;
- }
- else if (GLADE_IS_PARAM_SPEC_OBJECTS(pspec))
- type = GLADE_TYPE_EPROP_OBJECTS;
- else if (GLADE_IS_PARAM_SPEC_ACCEL(pspec))
- type = GLADE_TYPE_EPROP_ACCEL;
-
- return type;
-}
-
-/*******************************************************************************
API
*******************************************************************************/
/**
- * glade_editor_property_new:
- * @klass: A #GladePropertyClass
- * @use_command: Whether the undo/redo stack applies here.
- *
- * This is a factory function to create the correct type of
- * editor property that can edit the said type of #GladePropertyClass
- *
- * Returns: A newly created GladeEditorProperty of the correct type
- */
-GladeEditorProperty *
-glade_editor_property_new (GladePropertyClass *klass,
- gboolean use_command)
-{
- GladeEditorProperty *eprop;
- GType type = 0;
-
- /* Find the right type of GladeEditorProperty for this
- * GladePropertyClass.
- */
- if ((type = glade_editor_property_type (klass->pspec)) == 0)
- g_error ("%s : pspec '%s' type '%s' not implemented (%s)\n",
- G_GNUC_PRETTY_FUNCTION,
- klass->name,
- g_type_name (G_PARAM_SPEC_TYPE (klass->pspec)),
- g_type_name (klass->pspec->value_type));
-
- /* special case for resource specs which are hand specified in the catalog. */
- if (klass->resource)
- type = GLADE_TYPE_EPROP_RESOURCE;
-
- /* special case for string specs that denote themed application icons. */
- if (klass->themed_icon)
- type = GLADE_TYPE_EPROP_NAMED_ICON;
-
- /* Create and return the correct type of GladeEditorProperty */
- eprop = g_object_new (type,
- "property-class", klass,
- "use-command", use_command,
- NULL);
-
- return eprop;
-}
-
-/**
- * glade_editor_property_new_from_widget:
- * @widget: A #GladeWidget
- * @property: The widget's property
- * @packing: whether @property indicates a packing property or not.
- * @use_command: Whether the undo/redo stack applies here.
- *
- * This is a convenience function to create a GladeEditorProperty corresponding
- * to @property
- *
- * Returns: A newly created and connected GladeEditorProperty
- */
-GladeEditorProperty *
-glade_editor_property_new_from_widget (GladeWidget *widget,
- const gchar *property,
- gboolean packing,
- gboolean use_command)
-{
- GladeEditorProperty *eprop;
- GladeProperty *p;
-
- if (packing)
- p = glade_widget_get_pack_property (widget, property);
- else
- p = glade_widget_get_property (widget, property);
- g_return_val_if_fail (GLADE_IS_PROPERTY (p), NULL);
-
- eprop = glade_editor_property_new (p->klass, use_command);
- glade_editor_property_load (eprop, p);
-
- return eprop;
-}
-
-/**
- * glade_editor_property_supported:
- * @pspec: A #GParamSpec
- *
- * Returns: whether this pspec is supported by GladeEditorProperties.
- */
-gboolean
-glade_editor_property_supported (GParamSpec *pspec)
-{
- return glade_editor_property_type (pspec) != 0;
-}
-
-
-/**
* glade_editor_property_load:
* @eprop: A #GladeEditorProperty
* @property: A #GladeProperty
@@ -4009,10 +3150,12 @@ glade_editor_property_load_by_widget (GladeEditorProperty *eprop,
g_return_if_fail (widget == NULL || GLADE_IS_WIDGET (widget));
if (widget)
+ {
/* properties are allowed to be missing on some internal widgets */
property = glade_widget_get_property (widget, eprop->klass->id);
- glade_editor_property_load (eprop, property);
+ glade_editor_property_load (eprop, property);
+ }
}
/**
diff --git a/gladeui/glade-editor-property.h b/gladeui/glade-editor-property.h
index c9fce8b6..b8edfe6a 100644
--- a/gladeui/glade-editor-property.h
+++ b/gladeui/glade-editor-property.h
@@ -2,8 +2,69 @@
#ifndef __GLADE_EDITOR_PROPERTY_H__
#define __GLADE_EDITOR_PROPERTY_H__
+#include <gtk/gtk.h>
+
G_BEGIN_DECLS
+
+
+/*******************************************************************************
+ Boiler plate macros (inspired from glade-command.c)
+ *******************************************************************************/
+/* XXX document me ! */
+
+#define GLADE_MAKE_EPROP_TYPE(func, type, parent) \
+GType \
+func ## _get_type (void) \
+{ \
+ static GType cmd_type = 0; \
+ \
+ if (!cmd_type) \
+ { \
+ static const GTypeInfo info = \
+ { \
+ sizeof (type ## Class), \
+ (GBaseInitFunc) NULL, \
+ (GBaseFinalizeFunc) NULL, \
+ (GClassInitFunc) func ## _class_init, \
+ (GClassFinalizeFunc) NULL, \
+ NULL, \
+ sizeof (type), \
+ 0, \
+ (GInstanceInitFunc) NULL \
+ }; \
+ \
+ cmd_type = g_type_register_static (parent, #type, &info, 0); \
+ } \
+ \
+ return cmd_type; \
+} \
+
+
+#define GLADE_MAKE_EPROP(type, func) \
+static void \
+func ## _finalize (GObject *object); \
+static void \
+func ## _load (GladeEditorProperty *me, GladeProperty *property); \
+static GtkWidget * \
+func ## _create_input (GladeEditorProperty *me); \
+static void \
+func ## _class_init (gpointer parent_tmp, gpointer notused) \
+{ \
+ GladeEditorPropertyClass *parent = parent_tmp; \
+ GObjectClass* object_class; \
+ object_class = G_OBJECT_CLASS (parent); \
+ parent->load = func ## _load; \
+ parent->create_input = func ## _create_input; \
+ object_class->finalize = func ## _finalize; \
+} \
+typedef struct { \
+ GladeEditorPropertyClass cmd; \
+} type ## Class; \
+GLADE_MAKE_EPROP_TYPE(func, type, GLADE_TYPE_EDITOR_PROPERTY)
+
+
+
#define GLADE_TYPE_EDITOR_PROPERTY (glade_editor_property_get_type())
#define GLADE_EDITOR_PROPERTY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EDITOR_PROPERTY, GladeEditorProperty))
#define GLADE_EDITOR_PROPERTY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EDITOR_PROPERTY, GladeEditorPropertyClass))
@@ -59,7 +120,6 @@ struct _GladeEditorPropertyClass {
void (* load) (GladeEditorProperty *, GladeProperty *);
- /* private */
GtkWidget *(* create_input) (GladeEditorProperty *);
void (* gtk_doc_search)(GladeEditorProperty *,
@@ -71,15 +131,7 @@ struct _GladeEditorPropertyClass {
-GType glade_editor_property_get_type (void);
-
-GladeEditorProperty *glade_editor_property_new (GladePropertyClass *klass,
- gboolean use_command);
-
-GladeEditorProperty *glade_editor_property_new_from_widget (GladeWidget *widget,
- const gchar *property,
- gboolean packing,
- gboolean use_command);
+GType glade_editor_property_get_type (void) G_GNUC_CONST;
void glade_editor_property_load (GladeEditorProperty *eprop,
GladeProperty *property);
@@ -87,12 +139,40 @@ void glade_editor_property_load (GladeEditorProperty *
void glade_editor_property_load_by_widget (GladeEditorProperty *eprop,
GladeWidget *widget);
-gboolean glade_editor_property_supported (GParamSpec *pspec);
-
void glade_editor_property_show_info (GladeEditorProperty *eprop);
void glade_editor_property_hide_info (GladeEditorProperty *eprop);
+void glade_editor_property_commit (GladeEditorProperty *eprop,
+ GValue *value);
+
+
+/* Generic eprops */
+#define GLADE_TYPE_EPROP_NUMERIC (glade_eprop_numeric_get_type())
+#define GLADE_TYPE_EPROP_ENUM (glade_eprop_enum_get_type())
+#define GLADE_TYPE_EPROP_FLAGS (glade_eprop_flags_get_type())
+#define GLADE_TYPE_EPROP_COLOR (glade_eprop_color_get_type())
+#define GLADE_TYPE_EPROP_NAMED_ICON (glade_eprop_named_icon_get_type())
+#define GLADE_TYPE_EPROP_TEXT (glade_eprop_text_get_type())
+#define GLADE_TYPE_EPROP_BOOL (glade_eprop_bool_get_type())
+#define GLADE_TYPE_EPROP_UNICHAR (glade_eprop_unichar_get_type())
+#define GLADE_TYPE_EPROP_RESOURCE (glade_eprop_resource_get_type())
+#define GLADE_TYPE_EPROP_OBJECT (glade_eprop_object_get_type())
+#define GLADE_TYPE_EPROP_OBJECTS (glade_eprop_objects_get_type())
+#define GLADE_TYPE_EPROP_ADJUSTMENT (glade_eprop_adjustment_get_type())
+GType glade_eprop_numeric_get_type (void) G_GNUC_CONST;
+GType glade_eprop_enum_get_type (void) G_GNUC_CONST;
+GType glade_eprop_flags_get_type (void) G_GNUC_CONST;
+GType glade_eprop_color_get_type (void) G_GNUC_CONST;
+GType glade_eprop_named_icon_get_type (void) G_GNUC_CONST;
+GType glade_eprop_text_get_type (void) G_GNUC_CONST;
+GType glade_eprop_bool_get_type (void) G_GNUC_CONST;
+GType glade_eprop_unichar_get_type (void) G_GNUC_CONST;
+GType glade_eprop_resource_get_type (void) G_GNUC_CONST;
+GType glade_eprop_object_get_type (void) G_GNUC_CONST;
+GType glade_eprop_objects_get_type (void) G_GNUC_CONST;
+GType glade_eprop_adjustment_get_type (void) G_GNUC_CONST;
+
G_END_DECLS
diff --git a/gladeui/glade-editor.c b/gladeui/glade-editor.c
index 535f69a2..81c3a6af 100644
--- a/gladeui/glade-editor.c
+++ b/gladeui/glade-editor.c
@@ -434,7 +434,10 @@ glade_editor_table_append_item (GladeEditorTable *table,
{
GladeEditorProperty *property;
- property = glade_editor_property_new (klass, from_query_dialog == FALSE);
+ property = glade_widget_adaptor_create_eprop
+ (GLADE_WIDGET_ADAPTOR (klass->handle),
+ klass, from_query_dialog == FALSE);
+
gtk_widget_show (GTK_WIDGET (property));
gtk_widget_show_all (property->item_label);
diff --git a/gladeui/glade-project.c b/gladeui/glade-project.c
index b4f6525c..74c6606d 100644
--- a/gladeui/glade-project.c
+++ b/gladeui/glade-project.c
@@ -972,8 +972,9 @@ gp_sync_resources (GladeProject *project,
glade_property_get_value (property, &value);
- if ((resource = glade_property_class_make_string_from_gvalue
- (property->klass, &value)) != NULL)
+ if ((resource = glade_widget_adaptor_string_from_value
+ (GLADE_WIDGET_ADAPTOR (property->klass->handle),
+ property->klass, &value)) != NULL)
{
full_resource = glade_project_resource_fullpath
(prev_project ? prev_project : project, resource);
diff --git a/gladeui/glade-property-class.c b/gladeui/glade-property-class.c
index bc8e262a..706adc2e 100644
--- a/gladeui/glade-property-class.c
+++ b/gladeui/glade-property-class.c
@@ -474,41 +474,6 @@ glade_property_class_make_string_from_objects (GladePropertyClass *property_clas
return string;
}
-/* This is not used to save in the glade file... and its a one-way conversion.
- * its only usefull to show the values in the UI.
- */
-static gchar *
-glade_property_class_make_string_from_accels (GladePropertyClass *property_class,
- GList *accels)
-{
- GladeAccelInfo *info;
- GString *string;
- GList *list;
-
- string = g_string_new ("");
-
- for (list = accels; list; list = list->next)
- {
- info = list->data;
-
- if (info->modifiers & GDK_SHIFT_MASK)
- g_string_append (string, "SHIFT-");
-
- if (info->modifiers & GDK_CONTROL_MASK)
- g_string_append (string, "CNTL-");
-
- if (info->modifiers & GDK_MOD1_MASK)
- g_string_append (string, "ALT-");
-
- g_string_append (string, glade_builtin_string_from_key (info->key));
-
- if (list->next)
- g_string_append (string, ", ");
- }
-
- return g_string_free (string, FALSE);
-}
-
/**
* glade_property_class_make_string_from_gvalue:
* @property_class: A #GladePropertyClass
@@ -523,7 +488,7 @@ glade_property_class_make_string_from_gvalue (GladePropertyClass *property_class
gchar *string = NULL, **strv, str[G_ASCII_DTOSTR_BUF_SIZE];
GObject *object;
GdkColor *color;
- GList *objects, *accels;
+ GList *objects;
if (G_IS_PARAM_SPEC_ENUM(property_class->pspec))
{
@@ -629,14 +594,8 @@ glade_property_class_make_string_from_gvalue (GladePropertyClass *property_class
string = glade_property_class_make_string_from_objects
(property_class, objects);
}
- else if (GLADE_IS_PARAM_SPEC_ACCEL (property_class->pspec))
- {
- accels = g_value_get_boxed (value);
- string = glade_property_class_make_string_from_accels
- (property_class, accels);
- }
else
- g_critical ("Unsupported pspec type %s",
+ g_critical ("Unsupported pspec type %s (value -> string)",
g_type_name(G_PARAM_SPEC_TYPE (property_class->pspec)));
return string;
@@ -961,7 +920,7 @@ glade_property_class_make_gvalue_from_string (GladePropertyClass *property_class
g_value_set_boxed (value, objects);
}
else
- g_critical ("Unsupported pspec type %s",
+ g_critical ("Unsupported pspec type %s (string -> value)",
g_type_name(G_PARAM_SPEC_TYPE (property_class->pspec)));
return value;
@@ -1024,7 +983,7 @@ glade_property_class_make_gvalue_from_vl (GladePropertyClass *klass,
else if (GLADE_IS_PARAM_SPEC_OBJECTS(klass->pspec))
g_value_set_boxed (value, va_arg (vl, gpointer));
else
- g_critical ("Unsupported pspec type %s",
+ g_critical ("Unsupported pspec type %s (vl -> string)",
g_type_name(G_PARAM_SPEC_TYPE (klass->pspec)));
return value;
@@ -1113,7 +1072,7 @@ glade_property_class_set_vl_from_gvalue (GladePropertyClass *klass,
else if (GLADE_IS_PARAM_SPEC_OBJECTS(klass->pspec))
*(gpointer *)(va_arg (vl, gpointer *)) = g_value_get_boxed (value);
else
- g_critical ("Unsupported pspec type %s",
+ g_critical ("Unsupported pspec type %s (string -> vl)",
g_type_name(G_PARAM_SPEC_TYPE (klass->pspec)));
}
@@ -1192,57 +1151,6 @@ glade_property_class_list_atk_relations (gpointer handle,
}
/**
- * glade_property_class_accel_property:
- * @handle: A generic pointer (i.e. a #GladeWidgetClass)
- * @owner_type: The #GType of the owning widget class.
- *
- * Returns: a newly created #GladePropertyClass for accelerators
- * of the prescribed @owner_type.
- */
-GladePropertyClass *
-glade_property_class_accel_property (gpointer handle,
- GType owner_type)
-{
- GladePropertyClass *property_class;
- GValue *def_value;
-
- property_class = glade_property_class_new (handle);
- property_class->pspec =
- glade_param_spec_accel ("accelerators", _("Accelerators"),
- _("A list of accelerator keys"),
- owner_type,
- G_PARAM_READWRITE);
-
-
- property_class->pspec->owner_type = owner_type;
- property_class->id = g_strdup (g_param_spec_get_name
- (property_class->pspec));
- property_class->name = g_strdup (g_param_spec_get_nick
- (property_class->pspec));
- property_class->tooltip = g_strdup (g_param_spec_get_blurb
- (property_class->pspec));
-
- property_class->type = GPC_ACCEL_PROPERTY;
- property_class->ignore = TRUE;
- property_class->common = TRUE;
-
- /* Setup default */
- def_value = g_new0 (GValue, 1);
- g_value_init (def_value, GLADE_TYPE_ACCEL_GLIST);
- g_value_set_boxed (def_value, NULL);
- property_class->def = def_value;
-
- /* Setup original default */
- def_value = g_new0 (GValue, 1);
- g_value_init (def_value, GLADE_TYPE_ACCEL_GLIST);
- g_value_set_boxed (def_value, NULL);
- property_class->orig_def = def_value;
-
- return property_class;
-}
-
-
-/**
* glade_property_class_new_from_spec:
* @handle: A generic pointer (i.e. a #GladeWidgetClass)
* @spec: A #GParamSpec
@@ -1254,8 +1162,9 @@ GladePropertyClass *
glade_property_class_new_from_spec (gpointer handle,
GParamSpec *spec)
{
- GObjectClass *gtk_widget_class;
- GladePropertyClass *property_class;
+ GObjectClass *gtk_widget_class;
+ GladePropertyClass *property_class;
+ GladeEditorProperty *eprop;
g_return_val_if_fail (spec != NULL, NULL);
gtk_widget_class = g_type_class_ref (GTK_TYPE_WIDGET);
@@ -1271,13 +1180,17 @@ glade_property_class_new_from_spec (gpointer handle,
if ((spec->flags & G_PARAM_WRITABLE) == 0)
goto failed;
+ property_class->id = g_strdup (spec->name);
+ property_class->name = g_strdup (g_param_spec_get_nick (spec));
+
/* Register only editable properties.
*/
- if (!glade_editor_property_supported (property_class->pspec))
+ if (!(eprop = glade_widget_adaptor_create_eprop
+ (GLADE_WIDGET_ADAPTOR (handle), property_class, FALSE)))
goto failed;
-
- property_class->id = g_strdup (spec->name);
- property_class->name = g_strdup (g_param_spec_get_nick (spec));
+
+ /* Just created it to see if it was supported.... destroy now... */
+ gtk_widget_destroy (GTK_WIDGET (eprop));
/* If its on the GtkWidgetClass, it goes in "common"
* (unless stipulated otherwise in the xml file)
@@ -1747,11 +1660,6 @@ glade_property_class_update_from_node (GladeXmlNode *node,
klass->type = GPC_ATK_PROPERTY;
}
- /* Special case accelerators here.
- */
- if (GLADE_IS_PARAM_SPEC_ACCEL (klass->pspec))
- klass->type = GPC_ACCEL_PROPERTY;
-
/* Special case pixbuf here.
*/
if (klass->pspec->value_type == GDK_TYPE_PIXBUF)
diff --git a/gladeui/glade-property.c b/gladeui/glade-property.c
index 6ebe9222..21b93fa5 100644
--- a/gladeui/glade-property.c
+++ b/gladeui/glade-property.c
@@ -220,8 +220,9 @@ glade_property_set_value_impl (GladeProperty *property, const GValue *value)
#if 0
{
- gchar *str = glade_property_class_make_string_from_gvalue
- (property->klass, value);
+ gchar *str = glade_widget_adaptor_string_from_value
+ (GLADE_WIDGET_ADAPTOR (property->klass->handle),
+ property->klass, value);
g_print ("Setting property %s on %s to %s\n",
property->klass->id,
property->widget ? property->widget->name : "unknown", str);
@@ -394,8 +395,9 @@ glade_property_write_impl (GladeProperty *property,
/* convert the value of this property to a string */
if (property->klass->type == GPC_ACCEL_PROPERTY ||
- (value = glade_property_class_make_string_from_gvalue
- (property->klass, property->value)) == NULL)
+ (value = glade_widget_adaptor_string_from_value
+ (GLADE_WIDGET_ADAPTOR (property->klass->handle),
+ property->klass, property->value)) == NULL)
/* make sure we keep the empty string, also... upcomming
* funcs that may not like NULL.
*/
@@ -695,15 +697,6 @@ glade_property_get_type (void)
GladeInterface Parsing code
*******************************************************************************/
-static GValue *
-glade_property_real_read (GladeProperty *property,
- GladePropertyClass *pclass,
- GladeProject *project,
- GladeXmlNode *node,
- gboolean free_value)
-{
-}
-
#if LOADING_WAS_IMPLEMENTED
static GValue *
diff --git a/gladeui/glade-widget-adaptor.c b/gladeui/glade-widget-adaptor.c
index bc201588..85a30b5e 100644
--- a/gladeui/glade-widget-adaptor.c
+++ b/gladeui/glade-widget-adaptor.c
@@ -786,6 +786,97 @@ glade_widget_adaptor_object_read_widget (GladeWidgetAdaptor *adaptor,
}
+static GType
+glade_widget_adaptor_get_eprop_type (GParamSpec *pspec)
+{
+ GType type = 0;
+
+ if (pspec->value_type == GLADE_TYPE_STOCK ||
+ G_IS_PARAM_SPEC_ENUM(pspec))
+ type = GLADE_TYPE_EPROP_ENUM;
+ else if (G_IS_PARAM_SPEC_FLAGS(pspec))
+ type = GLADE_TYPE_EPROP_FLAGS;
+ else if (G_IS_PARAM_SPEC_VALUE_ARRAY (pspec))
+ {
+ if (pspec->value_type == G_TYPE_VALUE_ARRAY)
+ type = GLADE_TYPE_EPROP_TEXT;
+ }
+ else if (G_IS_PARAM_SPEC_BOXED(pspec))
+ {
+ if (pspec->value_type == GDK_TYPE_COLOR)
+ type = GLADE_TYPE_EPROP_COLOR;
+ else if (pspec->value_type == G_TYPE_STRV)
+ type = GLADE_TYPE_EPROP_TEXT;
+ }
+ else if (G_IS_PARAM_SPEC_STRING(pspec))
+ type = GLADE_TYPE_EPROP_TEXT;
+ else if (G_IS_PARAM_SPEC_BOOLEAN(pspec))
+ type = GLADE_TYPE_EPROP_BOOL;
+ else if (G_IS_PARAM_SPEC_FLOAT(pspec) ||
+ G_IS_PARAM_SPEC_DOUBLE(pspec) ||
+ G_IS_PARAM_SPEC_INT(pspec) ||
+ G_IS_PARAM_SPEC_UINT(pspec) ||
+ G_IS_PARAM_SPEC_LONG(pspec) ||
+ G_IS_PARAM_SPEC_ULONG(pspec) ||
+ G_IS_PARAM_SPEC_INT64(pspec) ||
+ G_IS_PARAM_SPEC_UINT64(pspec))
+ type = GLADE_TYPE_EPROP_NUMERIC;
+ else if (G_IS_PARAM_SPEC_UNICHAR(pspec))
+ type = GLADE_TYPE_EPROP_UNICHAR;
+ else if (G_IS_PARAM_SPEC_OBJECT(pspec))
+ {
+ if (pspec->value_type == GDK_TYPE_PIXBUF)
+ type = GLADE_TYPE_EPROP_RESOURCE;
+ else if (pspec->value_type == GTK_TYPE_ADJUSTMENT)
+ type = GLADE_TYPE_EPROP_ADJUSTMENT;
+ else
+ type = GLADE_TYPE_EPROP_OBJECT;
+ }
+ else if (GLADE_IS_PARAM_SPEC_OBJECTS(pspec))
+ type = GLADE_TYPE_EPROP_OBJECTS;
+
+ return type;
+}
+
+static GladeEditorProperty *
+glade_widget_adaptor_object_create_eprop (GladeWidgetAdaptor *adaptor,
+ GladePropertyClass *klass,
+ gboolean use_command)
+{
+ GladeEditorProperty *eprop;
+ GType type = 0;
+
+ /* Find the right type of GladeEditorProperty for this
+ * GladePropertyClass.
+ */
+ if ((type = glade_widget_adaptor_get_eprop_type (klass->pspec)) == 0)
+ return NULL;
+
+ /* special case for resource specs which are hand specified in the catalog. */
+ if (klass->resource)
+ type = GLADE_TYPE_EPROP_RESOURCE;
+
+ /* special case for string specs that denote themed application icons. */
+ if (klass->themed_icon)
+ type = GLADE_TYPE_EPROP_NAMED_ICON;
+
+ /* Create and return the correct type of GladeEditorProperty */
+ eprop = g_object_new (type,
+ "property-class", klass,
+ "use-command", use_command,
+ NULL);
+
+ return eprop;
+}
+
+static gchar *
+glade_widget_adaptor_object_string_from_value (GladeWidgetAdaptor *adaptor,
+ GladePropertyClass *klass,
+ const GValue *value)
+{
+ return glade_property_class_make_string_from_gvalue (klass, value);
+}
+
/*******************************************************************************
GladeWidgetAdaptor type registration and class initializer
*******************************************************************************/
@@ -826,6 +917,10 @@ glade_widget_adaptor_class_init (GladeWidgetAdaptorClass *adaptor_class)
adaptor_class->action_activate = glade_widget_adaptor_object_action_activate;
adaptor_class->child_action_activate= glade_widget_adaptor_object_child_action_activate;
adaptor_class->read_widget = glade_widget_adaptor_object_read_widget;
+ adaptor_class->create_eprop = glade_widget_adaptor_object_create_eprop;
+ adaptor_class->string_from_value = glade_widget_adaptor_object_string_from_value;
+
+
/* Base defaults here */
adaptor_class->fixed = FALSE;
@@ -1071,6 +1166,17 @@ gwa_extend_with_node_load_sym (GladeWidgetAdaptorClass *klass,
GLADE_TAG_READ_WIDGET_FUNCTION,
&symbol))
klass->read_widget = symbol;
+
+ if (glade_xml_load_sym_from_node (node, module,
+ GLADE_TAG_CREATE_EPROP_FUNCTION,
+ &symbol))
+ klass->create_eprop = symbol;
+
+ if (glade_xml_load_sym_from_node (node, module,
+ GLADE_TAG_STRING_FROM_VALUE_FUNCTION,
+ &symbol))
+ klass->string_from_value = symbol;
+
}
static void
@@ -2842,3 +2948,60 @@ glade_widget_adaptor_read_widget (GladeWidgetAdaptor *adaptor,
GLADE_WIDGET_ADAPTOR_GET_CLASS (adaptor)->read_widget (adaptor, widget, node);
}
+
+
+/**
+ * glade_widget_adaptor_create_eprop:
+ * @adaptor: A #GladeWidgetAdaptor
+ * @klass: The #GladePropertyClass to be edited
+ * @use_command: whether to use the GladeCommand interface
+ * to commit property changes
+ *
+ * Creates a GladeEditorProperty to edit @klass
+ *
+ * Returns: A newly created #GladeEditorProperty
+ */
+GladeEditorProperty *
+glade_widget_adaptor_create_eprop (GladeWidgetAdaptor *adaptor,
+ GladePropertyClass *klass,
+ gboolean use_command)
+{
+ GladeEditorProperty *eprop;
+ g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
+ g_return_val_if_fail (GLADE_IS_PROPERTY_CLASS (klass), NULL);
+
+ eprop = GLADE_WIDGET_ADAPTOR_GET_CLASS
+ (adaptor)->create_eprop (adaptor, klass, use_command);
+
+ /* XXX we really need to print a g_error() here, exept we are
+ * now using this func to test for unsupported properties
+ * at init time from glade-property-class */
+
+ return eprop;
+}
+
+
+/**
+ * glade_widget_adaptor_string_from_value:
+ * @adaptor: A #GladeWidgetAdaptor
+ * @klass: The #GladePropertyClass
+ * @value: The #GValue to convert to a string
+ *
+ * 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.
+ *
+ * Returns: A newly allocated string representation of @value
+ */
+gchar *
+glade_widget_adaptor_string_from_value (GladeWidgetAdaptor *adaptor,
+ GladePropertyClass *klass,
+ const GValue *value)
+{
+ g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
+ g_return_val_if_fail (GLADE_IS_PROPERTY_CLASS (klass), NULL);
+ g_return_val_if_fail (value != NULL, NULL);
+
+ return GLADE_WIDGET_ADAPTOR_GET_CLASS
+ (adaptor)->string_from_value (adaptor, klass, value);
+}
diff --git a/gladeui/glade-widget-adaptor.h b/gladeui/glade-widget-adaptor.h
index 773a615a..8e630246 100644
--- a/gladeui/glade-widget-adaptor.h
+++ b/gladeui/glade-widget-adaptor.h
@@ -4,6 +4,7 @@
#include <gladeui/glade-xml-utils.h>
#include <gladeui/glade-property-class.h>
+#include <gladeui/glade-editor-property.h>
#include <glib-object.h>
#include <gmodule.h>
#include <gtk/gtk.h>
@@ -237,9 +238,10 @@ typedef gboolean (* GladeChildVerifyPropertyFunc) (GladeWidgetAdaptor *adaptor,
/**
* GladeGetChildrenFunc:
* @container: A #GObject container
- * @Returns: A #GList of #GObject children.
*
* A function called to get @containers children.
+ *
+ * Returns: A #GList of #GObject children.
*/
typedef GList *(* GladeGetChildrenFunc) (GladeWidgetAdaptor *adaptor,
GObject *container);
@@ -297,6 +299,8 @@ typedef void (* GladePostCreateFunc) (GladeWidgetAdaptor *adaptor,
* @name: A string identifier
*
* Called to lookup @child in composite object @parent by @name.
+ *
+ * Returns: The specified internal widget.
*/
typedef GObject *(* GladeGetInternalFunc) (GladeWidgetAdaptor *adaptor,
GObject *parent,
@@ -330,10 +334,6 @@ typedef void (* GladeChildActionActivateFunc) (GladeWidgetAdaptor *adaptor,
GObject *object,
const gchar *action_path);
-
-
-
-
/**
* GladeReadWidgetFunc:
* @adaptor: A #GladeWidgetAdaptor
@@ -347,6 +347,36 @@ typedef void (* GladeReadWidgetFunc) (GladeWidgetAdaptor *adaptor,
GladeWidget *widget,
GladeXmlNode *node);
+/**
+ * GladeCreateEPropFunc:
+ * @adaptor: A #GladeWidgetAdaptor
+ * @klass: The #GladePropertyClass to be edited
+ * @use_command: whether to use the GladeCommand interface
+ * to commit property changes
+ *
+ * Creates a GladeEditorProperty to edit @klass
+ *
+ * Returns: A newly created #GladeEditorProperty
+ */
+typedef GladeEditorProperty *(* GladeCreateEPropFunc) (GladeWidgetAdaptor *adaptor,
+ GladePropertyClass *klass,
+ gboolean use_command);
+
+/**
+ * GladeStringFromValueFunc:
+ * @adaptor: A #GladeWidgetAdaptor
+ * @klass: The #GladePropertyClass
+ * @value: The #GValue to convert to a string
+ *
+ * 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.
+ *
+ * Returns: A newly allocated string representation of @value
+ */
+typedef gchar *(* GladeStringFromValueFunc) (GladeWidgetAdaptor *adaptor,
+ GladePropertyClass *klass,
+ const GValue *value);
/* GladeSignalClass contains all the info we need for a given signal, such as
@@ -494,6 +524,11 @@ struct _GladeWidgetAdaptorClass
GladeReadWidgetFunc read_widget; /* Reads widget attributes from xml */
+
+
+ GladeCreateEPropFunc create_eprop; /* Creates a GladeEditorProperty */
+
+ GladeStringFromValueFunc string_from_value; /* Creates a string for a value */
};
#define glade_widget_adaptor_create_widget(adaptor, query, ...) \
@@ -649,6 +684,14 @@ void glade_widget_adaptor_read_widget (GladeWidgetAdaptor
GladeWidget *widget,
GladeXmlNode *node);
+GladeEditorProperty *glade_widget_adaptor_create_eprop (GladeWidgetAdaptor *adaptor,
+ GladePropertyClass *klass,
+ gboolean use_command);
+
+gchar *glade_widget_adaptor_string_from_value (GladeWidgetAdaptor *adaptor,
+ GladePropertyClass *klass,
+ const GValue *value);
+
G_END_DECLS
#endif /* __GLADE_WIDGET_ADAPTOR_H__ */
diff --git a/gladeui/glade-widget.c b/gladeui/glade-widget.c
index f8721f44..adbcd88b 100644
--- a/gladeui/glade-widget.c
+++ b/gladeui/glade-widget.c
@@ -3104,9 +3104,9 @@ glade_widget_property_string (GladeWidget *widget,
g_return_val_if_fail (id_property != NULL, NULL);
if ((property = glade_widget_get_property (widget, id_property)) != NULL)
- ret_string =
- glade_property_class_make_string_from_gvalue (property->klass,
- value ? value : property->value);
+ ret_string = glade_widget_adaptor_string_from_value
+ (GLADE_WIDGET_ADAPTOR (property->klass->handle),
+ property->klass, value ? value : property->value);
return ret_string;
}
@@ -3134,9 +3134,9 @@ glade_widget_pack_property_string (GladeWidget *widget,
g_return_val_if_fail (id_property != NULL, NULL);
if ((property = glade_widget_get_pack_property (widget, id_property)) != NULL)
- ret_string =
- glade_property_class_make_string_from_gvalue (property->klass,
- value ? value : property->value);
+ ret_string = glade_widget_adaptor_string_from_value
+ (GLADE_WIDGET_ADAPTOR (property->klass->handle),
+ property->klass, value ? value : property->value);
return ret_string;
}
@@ -4423,3 +4423,40 @@ glade_widget_embed (GladeWidget *gwidget)
return TRUE;
}
+
+
+/**
+ * glade_widget_create_editor_property:
+ * @widget: A #GladeWidget
+ * @property: The widget's property
+ * @packing: whether @property indicates a packing property or not.
+ * @use_command: Whether the undo/redo stack applies here.
+ *
+ * This is a convenience function to create a GladeEditorProperty corresponding
+ * to @property
+ *
+ * Returns: A newly created and connected GladeEditorProperty
+ */
+GladeEditorProperty *
+glade_widget_create_editor_property (GladeWidget *widget,
+ const gchar *property,
+ gboolean packing,
+ gboolean use_command)
+{
+ GladeEditorProperty *eprop;
+ GladeProperty *p;
+
+ if (packing)
+ p = glade_widget_get_pack_property (widget, property);
+ else
+ p = glade_widget_get_property (widget, property);
+
+ g_return_val_if_fail (GLADE_IS_PROPERTY (p), NULL);
+
+ eprop = glade_widget_adaptor_create_eprop (widget->adaptor,
+ p->klass,
+ use_command);
+ glade_editor_property_load (eprop, p);
+
+ return eprop;
+}
diff --git a/gladeui/glade-widget.h b/gladeui/glade-widget.h
index 5f81cb36..53ef806a 100644
--- a/gladeui/glade-widget.h
+++ b/gladeui/glade-widget.h
@@ -135,14 +135,6 @@ void glade_widget_add_child (GladeWidget *p
void glade_widget_remove_child (GladeWidget *parent,
GladeWidget *child);
-
-/* XXX GladeWidgetInfo *glade_widget_write (GladeWidget *widget, */
-/* GladeInterface *interface); */
-
-GladeWidget *glade_widget_read (GladeProject *project,
- GladeWidget *parent,
- GladeXmlNode *node,
- const gchar *internal);
void glade_widget_replace (GladeWidget *parent,
GObject *old_object,
@@ -221,6 +213,19 @@ void glade_widget_remove_pack_action (GladeWidget *widget
GtkWidget * glade_widget_create_action_menu (GladeWidget *widget,
const gchar *action_path);
+/* XXX GladeWidgetInfo *glade_widget_write (GladeWidget *widget, */
+/* GladeInterface *interface); */
+
+GladeWidget *glade_widget_read (GladeProject *project,
+ GladeWidget *parent,
+ GladeXmlNode *node,
+ const gchar *internal);
+
+GladeEditorProperty *glade_widget_create_editor_property (GladeWidget *widget,
+ const gchar *property,
+ gboolean packing,
+ gboolean use_command);
+
/*******************************************************************************
Project, object property references
*******************************************************************************/
diff --git a/gladeui/glade-xml-utils.h b/gladeui/glade-xml-utils.h
index b61d6cd9..a79dde12 100644
--- a/gladeui/glade-xml-utils.h
+++ b/gladeui/glade-xml-utils.h
@@ -64,6 +64,8 @@ typedef struct _GladeXmlDoc GladeXmlDoc;
#define GLADE_TAG_ACTION_ACTIVATE_FUNCTION "action-activate-function"
#define GLADE_TAG_CHILD_ACTION_ACTIVATE_FUNCTION "child-action-activate-function"
#define GLADE_TAG_READ_WIDGET_FUNCTION "read-widget-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_PROPERTIES "properties"
#define GLADE_TAG_PACKING_PROPERTIES "packing-properties"
#define GLADE_TAG_PROPERTY "property"
diff --git a/plugins/gtk+/Makefile.am b/plugins/gtk+/Makefile.am
index 023b7ac9..90caae5f 100644
--- a/plugins/gtk+/Makefile.am
+++ b/plugins/gtk+/Makefile.am
@@ -23,7 +23,7 @@ libgladegtk_la_CFLAGS = \
$(PLUGINS_WARN_CFLAGS) \
$(AM_CFLAGS)
-libgladegtk_la_SOURCES = glade-gtk.c fixed-bg.xpm
+libgladegtk_la_SOURCES = glade-gtk.c glade-accels.c glade-keysyms.c fixed-bg.xpm
libgladegtk_la_LDFLAGS = -module -avoid-version $(AM_LDFLAGS)
libgladegtk_la_LIBADD = $(libgladeui) $(GTK_LIBS)
diff --git a/plugins/gtk+/glade-accels.c b/plugins/gtk+/glade-accels.c
new file mode 100644
index 00000000..e641ed9c
--- /dev/null
+++ b/plugins/gtk+/glade-accels.c
@@ -0,0 +1,943 @@
+/* -*- 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 <gtk/gtk.h>
+#include <glib/gi18n-lib.h>
+#include <string.h>
+
+#include "glade-accels.h"
+
+#define GLADE_RESPONSE_CLEAR 42
+
+/**************************************************************
+ * GParamSpec stuff here
+ **************************************************************/
+struct _GladeParamSpecAccel {
+ GParamSpec parent_instance;
+
+ GType type; /* The type this accel key is for; this allows
+ * us to verify the validity of any signals for
+ * this type.
+ */
+};
+
+GList *
+glade_accel_list_copy (GList *accels)
+{
+ GList *ret = NULL, *list;
+ GladeAccelInfo *info, *dup_info;
+
+ for (list = accels; list; list = list->next)
+ {
+ info = list->data;
+
+ dup_info = g_new0 (GladeAccelInfo, 1);
+ dup_info->signal = g_strdup (info->signal);
+ dup_info->key = info->key;
+ dup_info->modifiers = info->modifiers;
+
+ ret = g_list_prepend (ret, dup_info);
+ }
+
+ return g_list_reverse (ret);
+}
+
+void
+glade_accel_list_free (GList *accels)
+{
+ GList *list;
+ GladeAccelInfo *info;
+
+ for (list = accels; list; list = list->next)
+ {
+ info = list->data;
+
+ g_free (info->signal);
+ g_free (info);
+ }
+ g_list_free (accels);
+}
+
+GType
+glade_accel_glist_get_type (void)
+{
+ static GType type_id = 0;
+
+ if (!type_id)
+ type_id = g_boxed_type_register_static
+ ("GladeAccelGList",
+ (GBoxedCopyFunc) glade_accel_list_copy,
+ (GBoxedFreeFunc) glade_accel_list_free);
+ return type_id;
+}
+
+gboolean
+glade_keyval_valid (guint val)
+{
+ gint i;
+
+ for (i = 0; GladeKeys[i].name != NULL; i++)
+ {
+ if (GladeKeys[i].value == val)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+static void
+param_accel_init (GParamSpec *pspec)
+{
+ GladeParamSpecAccel *ospec = GLADE_PARAM_SPEC_ACCEL (pspec);
+ ospec->type = G_TYPE_OBJECT;
+}
+
+static void
+param_accel_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ if (value->data[0].v_pointer != NULL)
+ {
+ g_free (value->data[0].v_pointer);
+ }
+ value->data[0].v_pointer = NULL;
+}
+
+static gboolean
+param_accel_validate (GParamSpec *pspec,
+ GValue *value)
+{
+ /* GladeParamSpecAccel *aspec = GLADE_PARAM_SPEC_ACCEL (pspec); */
+ GList *accels, *list, *toremove = NULL;
+ GladeAccelInfo *info;
+
+ accels = value->data[0].v_pointer;
+
+ for (list = accels; list; list = list->next)
+ {
+ info = list->data;
+
+ /* Is it an invalid key ? */
+ if (glade_keyval_valid (info->key) == FALSE ||
+ /* Does the modifier contain any unwanted bits ? */
+ info->modifiers & GDK_MODIFIER_MASK ||
+ /* Do we have a signal ? */
+ /* FIXME: Check if the signal is valid for 'type' */
+ info->signal == NULL)
+ toremove = g_list_prepend (toremove, info);
+ }
+
+ for (list = toremove; list; list = list->next)
+ accels = g_list_remove (accels, list->data);
+
+ if (toremove) g_list_free (toremove);
+
+ value->data[0].v_pointer = accels;
+
+ return toremove != NULL;
+}
+
+static gint
+param_accel_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ guint8 *p1 = value1->data[0].v_pointer;
+ guint8 *p2 = value2->data[0].v_pointer;
+
+ /* not much to compare here, try to at least provide stable lesser/greater result */
+
+ return p1 < p2 ? -1 : p1 > p2;
+}
+
+GType
+glade_param_accel_get_type (void)
+{
+ static GType accel_type = 0;
+
+ if (accel_type == 0)
+ {
+ static /* const */ GParamSpecTypeInfo pspec_info = {
+ sizeof (GladeParamSpecAccel), /* instance_size */
+ 16, /* n_preallocs */
+ param_accel_init, /* instance_init */
+ 0xdeadbeef, /* value_type, assigned further down */
+ NULL, /* finalize */
+ param_accel_set_default, /* value_set_default */
+ param_accel_validate, /* value_validate */
+ param_accel_values_cmp, /* values_cmp */
+ };
+ pspec_info.value_type = GLADE_TYPE_ACCEL_GLIST;
+
+ accel_type = g_param_type_register_static
+ ("GladeParamAccel", &pspec_info);
+ }
+ return accel_type;
+}
+
+GParamSpec *
+glade_param_spec_accel (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GType widget_type,
+ GParamFlags flags)
+{
+ GladeParamSpecAccel *pspec;
+
+ pspec = g_param_spec_internal (GLADE_TYPE_PARAM_ACCEL,
+ name, nick, blurb, flags);
+
+ pspec->type = widget_type;
+ return G_PARAM_SPEC (pspec);
+}
+
+/* Accelerator spec */
+GParamSpec *
+glade_standard_accel_spec (void)
+{
+ return glade_param_spec_accel ("accelerators", _("Accelerators"),
+ _("A list of accelerator keys"),
+ GTK_TYPE_WIDGET,
+ G_PARAM_READWRITE);
+}
+
+guint
+glade_key_from_string (const gchar *string)
+{
+ gint i;
+
+ g_return_val_if_fail (string != NULL, 0);
+
+ for (i = 0; GladeKeys[i].name != NULL; i++)
+ if (!strcmp (string, GladeKeys[i].name))
+ return GladeKeys[i].value;
+
+ return 0;
+}
+
+const gchar *
+glade_string_from_key (guint key)
+{
+ gint i;
+
+ for (i = 0; GladeKeys[i].name != NULL; i++)
+ if (GladeKeys[i].value == key)
+ return GladeKeys[i].name;
+ return NULL;
+}
+
+
+/* This is not used to save in the glade file... and its a one-way conversion.
+ * its only usefull to show the values in the UI.
+ */
+gchar *
+glade_accels_make_string (GList *accels)
+{
+ GladeAccelInfo *info;
+ GString *string;
+ GList *list;
+
+ string = g_string_new ("");
+
+ for (list = accels; list; list = list->next)
+ {
+ info = list->data;
+
+ if (info->modifiers & GDK_SHIFT_MASK)
+ g_string_append (string, "SHIFT-");
+
+ if (info->modifiers & GDK_CONTROL_MASK)
+ g_string_append (string, "CNTL-");
+
+ if (info->modifiers & GDK_MOD1_MASK)
+ g_string_append (string, "ALT-");
+
+ g_string_append (string, glade_string_from_key (info->key));
+
+ if (list->next)
+ g_string_append (string, ", ");
+ }
+
+ return g_string_free (string, FALSE);
+}
+
+
+/**************************************************************
+ * GladeEditorProperty stuff here
+ **************************************************************/
+
+enum {
+ ACCEL_COLUMN_SIGNAL = 0,
+ ACCEL_COLUMN_REAL_SIGNAL,
+ ACCEL_COLUMN_KEY,
+ ACCEL_COLUMN_MOD_SHIFT,
+ ACCEL_COLUMN_MOD_CNTL,
+ ACCEL_COLUMN_MOD_ALT,
+ ACCEL_COLUMN_IS_CLASS,
+ ACCEL_COLUMN_IS_SIGNAL,
+ ACCEL_COLUMN_KEY_ENTERED,
+ ACCEL_COLUMN_KEY_SLOT,
+ ACCEL_NUM_COLUMNS
+};
+
+enum {
+ ACCEL_COMBO_COLUMN_TEXT = 0,
+ ACCEL_COMBO_NUM_COLUMNS,
+};
+
+typedef struct {
+ GladeEditorProperty parent_instance;
+
+ GtkWidget *entry;
+ GList *parent_iters;
+ GtkTreeModel *model;
+} GladeEPropAccel;
+
+typedef struct {
+ GtkTreeIter *iter;
+ gchar *name; /* <-- dont free */
+} GladeEpropIterTab;
+
+
+static GtkTreeModel *keysyms_model = NULL;
+
+GLADE_MAKE_EPROP (GladeEPropAccel, glade_eprop_accel)
+#define GLADE_EPROP_ACCEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_ACCEL, GladeEPropAccel))
+#define GLADE_EPROP_ACCEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_ACCEL, GladeEPropAccelClass))
+#define GLADE_IS_EPROP_ACCEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_ACCEL))
+#define GLADE_IS_EPROP_ACCEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EPROP_ACCEL))
+#define GLADE_EPROP_ACCEL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GLADE_EPROP_ACCEL, GladeEPropAccelClass))
+
+
+static GtkTreeModel *
+create_keysyms_model (void)
+{
+ GtkTreeModel *model;
+ GtkTreeIter iter, alphanum, fkey, keypad, other, extra;
+ GtkTreeIter *parent;
+ gint i;
+
+ model = (GtkTreeModel *)gtk_tree_store_new
+ (ACCEL_COMBO_NUM_COLUMNS,
+ G_TYPE_STRING); /* The Key charachter name */
+
+ gtk_tree_store_append (GTK_TREE_STORE (model), &alphanum, NULL);
+ gtk_tree_store_set
+ (GTK_TREE_STORE (model), &alphanum,
+ ACCEL_COMBO_COLUMN_TEXT, _("Alphanumerical"), -1);
+
+ gtk_tree_store_append (GTK_TREE_STORE (model), &extra, NULL);
+ gtk_tree_store_set
+ (GTK_TREE_STORE (model), &extra,
+ ACCEL_COMBO_COLUMN_TEXT, _("Extra"), -1);
+
+ gtk_tree_store_append (GTK_TREE_STORE (model), &keypad, NULL);
+ gtk_tree_store_set
+ (GTK_TREE_STORE (model), &keypad,
+ ACCEL_COMBO_COLUMN_TEXT, _("Keypad"), -1);
+
+ gtk_tree_store_append (GTK_TREE_STORE (model), &fkey, NULL);
+ gtk_tree_store_set
+ (GTK_TREE_STORE (model), &fkey,
+ ACCEL_COMBO_COLUMN_TEXT, _("Functions"), -1);
+
+ gtk_tree_store_append (GTK_TREE_STORE (model), &other, NULL);
+ gtk_tree_store_set
+ (GTK_TREE_STORE (model), &other,
+ ACCEL_COMBO_COLUMN_TEXT, _("Other"), -1);
+
+ parent = &alphanum;
+
+ for (i = 0; GladeKeys[i].name != NULL; i++)
+ {
+ gtk_tree_store_append (GTK_TREE_STORE (model), &iter, parent);
+ gtk_tree_store_set
+ (GTK_TREE_STORE (model), &iter,
+ ACCEL_COMBO_COLUMN_TEXT, GladeKeys[i].name, -1);
+
+ if (!strcmp (GladeKeys[i].name, GLADE_KEYS_LAST_ALPHANUM))
+ parent = &extra;
+ else if (!strcmp (GladeKeys[i].name, GLADE_KEYS_LAST_EXTRA))
+ parent = &keypad;
+ else if (!strcmp (GladeKeys[i].name, GLADE_KEYS_LAST_KP))
+ parent = &fkey;
+ else if (!strcmp (GladeKeys[i].name, GLADE_KEYS_LAST_FKEY))
+ parent = &other;
+ }
+ return model;
+}
+
+static void
+glade_eprop_accel_finalize (GObject *object)
+{
+ /* Chain up */
+ GObjectClass *parent_class = g_type_class_peek_parent (G_OBJECT_GET_CLASS (object));
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+glade_eprop_accel_load (GladeEditorProperty *eprop,
+ GladeProperty *property)
+{
+ GladeEditorPropertyClass *parent_class =
+ g_type_class_peek_parent (GLADE_EDITOR_PROPERTY_GET_CLASS (eprop));
+ GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
+ gchar *accels;
+
+ /* Chain up first */
+ parent_class->load (eprop, property);
+
+ if (property == NULL) return;
+
+ if ((accels =
+ glade_accels_make_string (g_value_get_boxed (property->value))) != NULL)
+ {
+ gtk_entry_set_text (GTK_ENTRY (eprop_accel->entry), accels);
+ g_free (accels);
+ }
+ else
+ gtk_entry_set_text (GTK_ENTRY (eprop_accel->entry), "");
+
+}
+
+static gint
+eprop_find_iter (GladeEpropIterTab *iter_tab,
+ gchar *name)
+{
+ return strcmp (iter_tab->name, name);
+}
+
+static void
+iter_tab_free (GladeEpropIterTab *iter_tab)
+{
+ gtk_tree_iter_free (iter_tab->iter);
+ g_free (iter_tab);
+}
+
+static void
+glade_eprop_accel_populate_view (GladeEditorProperty *eprop,
+ GtkTreeView *view)
+{
+ GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
+ GladeSignalClass *sclass;
+ GladeWidgetAdaptor *adaptor = glade_widget_adaptor_from_pclass (eprop->klass);
+ GtkTreeStore *model = (GtkTreeStore *)gtk_tree_view_get_model (view);
+ GtkTreeIter iter;
+ GladeEpropIterTab *parent_tab;
+ GladeAccelInfo *info;
+ GList *list, *l, *found, *accelerators;
+ gchar *name;
+
+ accelerators = g_value_get_boxed (eprop->property->value);
+
+ /* First make parent iters...
+ */
+ for (list = adaptor->signals; list; list = list->next)
+ {
+ sclass = list->data;
+
+ /* Only action signals have accelerators. */
+ if ((sclass->query.signal_flags & G_SIGNAL_ACTION) == 0)
+ continue;
+
+ if (g_list_find_custom (eprop_accel->parent_iters,
+ sclass->type,
+ (GCompareFunc)eprop_find_iter) == NULL)
+ {
+ gtk_tree_store_append (model, &iter, NULL);
+ gtk_tree_store_set (model, &iter,
+ ACCEL_COLUMN_SIGNAL, sclass->type,
+ ACCEL_COLUMN_IS_CLASS, TRUE,
+ ACCEL_COLUMN_IS_SIGNAL, FALSE,
+ -1);
+
+ parent_tab = g_new0 (GladeEpropIterTab, 1);
+ parent_tab->name = sclass->type;
+ parent_tab->iter = gtk_tree_iter_copy (&iter);
+
+ eprop_accel->parent_iters =
+ g_list_prepend (eprop_accel->parent_iters,
+ parent_tab);
+ }
+ }
+
+ /* Now we populate...
+ */
+ for (list = adaptor->signals; list; list = list->next)
+ {
+ sclass = list->data;
+
+ /* Only action signals have accelerators. */
+ if ((sclass->query.signal_flags & G_SIGNAL_ACTION) == 0)
+ continue;
+
+ if ((found = g_list_find_custom (eprop_accel->parent_iters,
+ sclass->type,
+ (GCompareFunc)eprop_find_iter)) != NULL)
+ {
+ parent_tab = found->data;
+ name = g_strdup_printf (" %s", sclass->name);
+
+ /* Populate from accelerator list
+ */
+ for (l = accelerators; l; l = l->next)
+ {
+ info = l->data;
+
+ if (strcmp (info->signal, sclass->name))
+ continue;
+
+ gtk_tree_store_append (model, &iter, parent_tab->iter);
+ gtk_tree_store_set
+ (model, &iter,
+ ACCEL_COLUMN_SIGNAL, name,
+ ACCEL_COLUMN_REAL_SIGNAL, sclass->name,
+ ACCEL_COLUMN_IS_CLASS, FALSE,
+ ACCEL_COLUMN_IS_SIGNAL, TRUE,
+ ACCEL_COLUMN_MOD_SHIFT,
+ (info->modifiers & GDK_SHIFT_MASK) != 0,
+ ACCEL_COLUMN_MOD_CNTL,
+ (info->modifiers & GDK_CONTROL_MASK) != 0,
+ ACCEL_COLUMN_MOD_ALT,
+ (info->modifiers & GDK_MOD1_MASK) != 0,
+ ACCEL_COLUMN_KEY,
+ glade_string_from_key (info->key),
+ ACCEL_COLUMN_KEY_ENTERED, TRUE,
+ ACCEL_COLUMN_KEY_SLOT, FALSE,
+ -1);
+ }
+
+ /* Append a new empty slot at the end */
+ gtk_tree_store_append (model, &iter, parent_tab->iter);
+ gtk_tree_store_set
+ (model, &iter,
+ ACCEL_COLUMN_SIGNAL, name,
+ ACCEL_COLUMN_REAL_SIGNAL, sclass->name,
+ ACCEL_COLUMN_IS_CLASS, FALSE,
+ ACCEL_COLUMN_IS_SIGNAL, TRUE,
+ ACCEL_COLUMN_MOD_SHIFT, FALSE,
+ ACCEL_COLUMN_MOD_CNTL, FALSE,
+ ACCEL_COLUMN_MOD_ALT, FALSE,
+ ACCEL_COLUMN_KEY, _("<choose a key>"),
+ ACCEL_COLUMN_KEY_ENTERED, FALSE,
+ ACCEL_COLUMN_KEY_SLOT, TRUE,
+ -1);
+
+ g_free (name);
+ }
+ }
+}
+
+static void
+key_edited (GtkCellRendererText *cell,
+ const gchar *path_string,
+ const gchar *new_text,
+ GladeEditorProperty *eprop)
+{
+ GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
+ gboolean key_was_set;
+ const gchar *text;
+ GtkTreeIter iter, parent_iter, new_iter;
+
+ if (!gtk_tree_model_get_iter_from_string (eprop_accel->model,
+ &iter, path_string))
+ return;
+
+ gtk_tree_model_get (eprop_accel->model, &iter,
+ ACCEL_COLUMN_KEY_ENTERED, &key_was_set,
+ -1);
+
+ /* If user selects "none"; remove old entry or ignore new one.
+ */
+ if (!new_text || new_text[0] == '\0' ||
+ glade_string_from_key ((guint)new_text[0]) == NULL ||
+ g_utf8_collate (new_text, _("None")) == 0 ||
+ g_utf8_collate (new_text, _("<choose a key>")) == 0)
+ {
+ if (key_was_set)
+ gtk_tree_store_remove
+ (GTK_TREE_STORE (eprop_accel->model), &iter);
+
+ return;
+ }
+
+ if (glade_key_from_string (new_text) != 0)
+ text = new_text;
+ else
+ text = glade_string_from_key ((guint)new_text[0]);
+
+ gtk_tree_store_set
+ (GTK_TREE_STORE (eprop_accel->model), &iter,
+ ACCEL_COLUMN_KEY, text,
+ ACCEL_COLUMN_KEY_ENTERED, TRUE,
+ ACCEL_COLUMN_KEY_SLOT, FALSE,
+ -1);
+
+ /* Append a new one if needed
+ */
+ if (key_was_set == FALSE &&
+ gtk_tree_model_iter_parent (eprop_accel->model,
+ &parent_iter, &iter))
+ {
+ gchar *signal, *real_signal;
+
+ gtk_tree_model_get (eprop_accel->model, &iter,
+ ACCEL_COLUMN_SIGNAL, &signal,
+ ACCEL_COLUMN_REAL_SIGNAL, &real_signal,
+ -1);
+
+ /* Append a new empty slot at the end */
+ gtk_tree_store_insert_after (GTK_TREE_STORE (eprop_accel->model),
+ &new_iter, &parent_iter, &iter);
+ gtk_tree_store_set (GTK_TREE_STORE (eprop_accel->model), &new_iter,
+ ACCEL_COLUMN_SIGNAL, signal,
+ ACCEL_COLUMN_REAL_SIGNAL, real_signal,
+ ACCEL_COLUMN_IS_CLASS, FALSE,
+ ACCEL_COLUMN_IS_SIGNAL, TRUE,
+ ACCEL_COLUMN_MOD_SHIFT, FALSE,
+ ACCEL_COLUMN_MOD_CNTL, FALSE,
+ ACCEL_COLUMN_MOD_ALT, FALSE,
+ ACCEL_COLUMN_KEY, _("<choose a key>"),
+ ACCEL_COLUMN_KEY_ENTERED, FALSE,
+ ACCEL_COLUMN_KEY_SLOT, TRUE,
+ -1);
+ g_free (signal);
+ g_free (real_signal);
+ }
+}
+
+static void
+modifier_toggled (GtkCellRendererToggle *cell,
+ gchar *path_string,
+ GladeEditorProperty *eprop)
+{
+ GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
+ GtkTreeIter iter;
+ gint column;
+ gboolean active, key_entered;
+
+ if (!gtk_tree_model_get_iter_from_string (eprop_accel->model,
+ &iter, path_string))
+ return;
+
+ column = GPOINTER_TO_INT (g_object_get_data
+ (G_OBJECT (cell), "model-column"));
+
+ gtk_tree_model_get
+ (eprop_accel->model, &iter,
+ ACCEL_COLUMN_KEY_ENTERED, &key_entered,
+ column, &active, -1);
+
+ if (key_entered)
+ gtk_tree_store_set
+ (GTK_TREE_STORE (eprop_accel->model), &iter,
+ column, !active, -1);
+}
+
+
+static GtkWidget *
+glade_eprop_accel_view (GladeEditorProperty *eprop)
+{
+ GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
+ GtkWidget *view_widget;
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+
+ eprop_accel->model = (GtkTreeModel *)gtk_tree_store_new
+ (ACCEL_NUM_COLUMNS,
+ G_TYPE_STRING, /* The GSignal name formatted for display */
+ G_TYPE_STRING, /* The GSignal name */
+ G_TYPE_STRING, /* The Gdk keycode */
+ G_TYPE_BOOLEAN, /* The shift modifier */
+ G_TYPE_BOOLEAN, /* The cntl modifier */
+ G_TYPE_BOOLEAN, /* The alt modifier */
+ G_TYPE_BOOLEAN, /* Whether this is a class entry */
+ G_TYPE_BOOLEAN, /* Whether this is a signal entry (oposite of above) */
+ G_TYPE_BOOLEAN, /* Whether the key has been entered for this row */
+ G_TYPE_BOOLEAN); /* Oposite of above */
+
+ view_widget = gtk_tree_view_new_with_model (eprop_accel->model);
+ g_object_set (G_OBJECT (view_widget), "enable-search", FALSE, NULL);
+
+ /********************* fake invisible column *********************/
+ renderer = gtk_cell_renderer_text_new ();
+ g_object_set (G_OBJECT (renderer), "editable", FALSE, "visible", FALSE, NULL);
+
+ column = gtk_tree_view_column_new_with_attributes (NULL, renderer, NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
+
+ gtk_tree_view_column_set_visible (column, FALSE);
+ gtk_tree_view_set_expander_column (GTK_TREE_VIEW (view_widget), column);
+
+ /********************* signal name column *********************/
+ renderer = gtk_cell_renderer_text_new ();
+ g_object_set (G_OBJECT (renderer),
+ "editable", FALSE,
+ "weight", PANGO_WEIGHT_BOLD,
+ NULL);
+
+ column = gtk_tree_view_column_new_with_attributes
+ (_("Signal"), renderer,
+ "text", ACCEL_COLUMN_SIGNAL,
+ "weight-set", ACCEL_COLUMN_IS_CLASS,
+ NULL);
+
+ g_object_set (G_OBJECT (column), "expand", TRUE, NULL);
+
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
+
+ /********************* key name column *********************/
+ if (keysyms_model == NULL)
+ keysyms_model = create_keysyms_model ();
+
+ renderer = gtk_cell_renderer_combo_new ();
+ g_object_set (G_OBJECT (renderer),
+ "editable", TRUE,
+ "model", keysyms_model,
+ "text-column", ACCEL_COMBO_COLUMN_TEXT,
+ "has-entry", TRUE,
+ "style", PANGO_STYLE_ITALIC,
+ "foreground", "Gray",
+ NULL);
+
+ g_signal_connect (renderer, "edited",
+ G_CALLBACK (key_edited), eprop);
+
+ column = gtk_tree_view_column_new_with_attributes
+ (_("Key"), renderer,
+ "text", ACCEL_COLUMN_KEY,
+ "style-set", ACCEL_COLUMN_KEY_SLOT,
+ "foreground-set", ACCEL_COLUMN_KEY_SLOT,
+ "visible", ACCEL_COLUMN_IS_SIGNAL,
+ NULL);
+
+ g_object_set (G_OBJECT (column), "expand", TRUE, NULL);
+
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
+
+ /********************* shift modifier column *********************/
+ renderer = gtk_cell_renderer_toggle_new ();
+ column = gtk_tree_view_column_new_with_attributes
+ (_("Shift"), renderer,
+ "visible", ACCEL_COLUMN_IS_SIGNAL,
+ "sensitive", ACCEL_COLUMN_KEY_ENTERED,
+ "active", ACCEL_COLUMN_MOD_SHIFT,
+ NULL);
+
+ g_object_set_data (G_OBJECT (renderer), "model-column",
+ GINT_TO_POINTER (ACCEL_COLUMN_MOD_SHIFT));
+ g_signal_connect (G_OBJECT (renderer), "toggled",
+ G_CALLBACK (modifier_toggled), eprop);
+
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
+
+ /********************* control modifier column *********************/
+ renderer = gtk_cell_renderer_toggle_new ();
+ column = gtk_tree_view_column_new_with_attributes
+ (_("Control"), renderer,
+ "visible", ACCEL_COLUMN_IS_SIGNAL,
+ "sensitive", ACCEL_COLUMN_KEY_ENTERED,
+ "active", ACCEL_COLUMN_MOD_CNTL,
+ NULL);
+
+ g_object_set_data (G_OBJECT (renderer), "model-column",
+ GINT_TO_POINTER (ACCEL_COLUMN_MOD_CNTL));
+ g_signal_connect (G_OBJECT (renderer), "toggled",
+ G_CALLBACK (modifier_toggled), eprop);
+
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
+
+ /********************* alt modifier column *********************/
+ renderer = gtk_cell_renderer_toggle_new ();
+ column = gtk_tree_view_column_new_with_attributes
+ (_("Alt"), renderer,
+ "visible", ACCEL_COLUMN_IS_SIGNAL,
+ "sensitive", ACCEL_COLUMN_KEY_ENTERED,
+ "active", ACCEL_COLUMN_MOD_ALT,
+ NULL);
+
+ g_object_set_data (G_OBJECT (renderer), "model-column",
+ GINT_TO_POINTER (ACCEL_COLUMN_MOD_ALT));
+ g_signal_connect (G_OBJECT (renderer), "toggled",
+ G_CALLBACK (modifier_toggled), eprop);
+
+ gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
+
+ return view_widget;
+}
+
+static gboolean
+glade_eprop_accel_accum_accelerators (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ GList **ret)
+{
+ GladeAccelInfo *info;
+ gchar *signal, *key_str;
+ gboolean shift, cntl, alt, entered;
+
+ gtk_tree_model_get (model, iter, ACCEL_COLUMN_KEY_ENTERED, &entered, -1);
+ if (entered == FALSE) return FALSE;
+
+ gtk_tree_model_get (model, iter,
+ ACCEL_COLUMN_REAL_SIGNAL, &signal,
+ ACCEL_COLUMN_KEY, &key_str,
+ ACCEL_COLUMN_MOD_SHIFT, &shift,
+ ACCEL_COLUMN_MOD_CNTL, &cntl,
+ ACCEL_COLUMN_MOD_ALT, &alt,
+ -1);
+
+ info = g_new0 (GladeAccelInfo, 1);
+ info->signal = signal;
+ info->key = glade_key_from_string (key_str);
+ info->modifiers = (shift ? GDK_SHIFT_MASK : 0) |
+ (cntl ? GDK_CONTROL_MASK : 0) |
+ (alt ? GDK_MOD1_MASK : 0);
+
+ *ret = g_list_prepend (*ret, info);
+
+ g_free (key_str);
+
+ return FALSE;
+}
+
+
+static void
+glade_eprop_accel_show_dialog (GtkWidget *dialog_button,
+ GladeEditorProperty *eprop)
+{
+ GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
+ GtkWidget *dialog, *parent, *vbox, *sw, *tree_view;
+ GladeProject *project;
+ GValue *value;
+ GList *accelerators = NULL;
+ gint res;
+
+ project = glade_widget_get_project (eprop->property->widget);
+ parent = gtk_widget_get_toplevel (GTK_WIDGET (eprop));
+
+ dialog = gtk_dialog_new_with_buttons (_("Choose accelerator keys..."),
+ GTK_WINDOW (parent),
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_STOCK_CLEAR, GLADE_RESPONSE_CLEAR,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OK, GTK_RESPONSE_OK,
+ NULL);
+
+ gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
+
+ vbox = gtk_vbox_new (FALSE, 6);
+ gtk_widget_show (vbox);
+
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
+
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox, TRUE, TRUE, 0);
+
+ sw = gtk_scrolled_window_new (NULL, NULL);
+ gtk_widget_show (sw);
+ gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
+ gtk_widget_set_size_request (sw, 400, 200);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
+
+ tree_view = glade_eprop_accel_view (eprop);
+ glade_eprop_accel_populate_view (eprop, GTK_TREE_VIEW (tree_view));
+
+ gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
+
+ gtk_widget_show (tree_view);
+ gtk_container_add (GTK_CONTAINER (sw), tree_view);
+
+ /* Run the dialog */
+ res = gtk_dialog_run (GTK_DIALOG (dialog));
+ if (res == GTK_RESPONSE_OK)
+ {
+ gtk_tree_model_foreach
+ (gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view)),
+ (GtkTreeModelForeachFunc)
+ glade_eprop_accel_accum_accelerators, &accelerators);
+
+ value = g_new0 (GValue, 1);
+ g_value_init (value, GLADE_TYPE_ACCEL_GLIST);
+ g_value_take_boxed (value, accelerators);
+
+ glade_editor_property_commit (eprop, value);
+
+ g_value_unset (value);
+ g_free (value);
+ }
+ else if (res == GLADE_RESPONSE_CLEAR)
+ {
+ value = g_new0 (GValue, 1);
+ g_value_init (value, GLADE_TYPE_ACCEL_GLIST);
+ g_value_set_boxed (value, NULL);
+
+ glade_editor_property_commit (eprop, value);
+
+ g_value_unset (value);
+ g_free (value);
+ }
+
+ /* Clean up ...
+ */
+ gtk_widget_destroy (dialog);
+
+ g_object_unref (G_OBJECT (eprop_accel->model));
+ eprop_accel->model = NULL;
+
+ if (eprop_accel->parent_iters)
+ {
+ g_list_foreach (eprop_accel->parent_iters, (GFunc)iter_tab_free, NULL);
+ g_list_free (eprop_accel->parent_iters);
+ eprop_accel->parent_iters = NULL;
+ }
+
+}
+
+static GtkWidget *
+glade_eprop_accel_create_input (GladeEditorProperty *eprop)
+{
+ GladeEPropAccel *eprop_accel = GLADE_EPROP_ACCEL (eprop);
+ GtkWidget *hbox;
+ GtkWidget *button;
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ eprop_accel->entry = gtk_entry_new ();
+ gtk_entry_set_editable (GTK_ENTRY (eprop_accel->entry), FALSE);
+ gtk_widget_show (eprop_accel->entry);
+ gtk_box_pack_start (GTK_BOX (hbox), eprop_accel->entry, TRUE, TRUE, 0);
+
+ button = gtk_button_new_with_label ("...");
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+
+ g_signal_connect (G_OBJECT (button), "clicked",
+ G_CALLBACK (glade_eprop_accel_show_dialog),
+ eprop);
+
+ return hbox;
+}
diff --git a/plugins/gtk+/glade-accels.h b/plugins/gtk+/glade-accels.h
new file mode 100644
index 00000000..91d31359
--- /dev/null
+++ b/plugins/gtk+/glade-accels.h
@@ -0,0 +1,50 @@
+#include <gladeui/glade.h>
+#include <gtk/gtk.h>
+
+
+#define GLADE_TYPE_PARAM_ACCEL (glade_param_accel_get_type())
+#define GLADE_TYPE_ACCEL_GLIST (glade_accel_glist_get_type())
+#define GLADE_TYPE_EPROP_ACCEL (glade_eprop_accel_get_type())
+
+#define GLADE_IS_PARAM_SPEC_ACCEL(pspec) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), \
+ GLADE_TYPE_PARAM_ACCEL))
+#define GLADE_PARAM_SPEC_ACCEL(pspec) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((pspec), \
+ GLADE_TYPE_PARAM_ACCEL, GladeParamSpecAccel))
+
+typedef struct _GladeKey GladeKey;
+typedef struct _GladeParamSpecAccel GladeParamSpecAccel;
+
+
+struct _GladeKey {
+ guint value;
+ gchar *name;
+};
+
+extern const GladeKey GladeKeys[];
+
+#define GLADE_KEYS_LAST_ALPHANUM "9"
+#define GLADE_KEYS_LAST_EXTRA "questiondown"
+#define GLADE_KEYS_LAST_KP "KP_9"
+#define GLADE_KEYS_LAST_FKEY "F35"
+
+GType glade_param_accel_get_type (void) G_GNUC_CONST;
+GType glade_accel_glist_get_type (void) G_GNUC_CONST;
+GType glade_eprop_accel_get_type (void) G_GNUC_CONST;
+
+GList *glade_accel_list_copy (GList *accels);
+void glade_accel_list_free (GList *accels);
+
+
+GParamSpec *glade_param_spec_accel (const gchar *name,
+ const gchar *nick,
+ const gchar *blurb,
+ GType widget_type,
+ GParamFlags flags);
+
+GParamSpec *glade_standard_accel_spec (void);
+
+gboolean glade_keyval_valid (guint val);
+
+gchar *glade_accels_make_string (GList *accels);
diff --git a/plugins/gtk+/glade-gtk.c b/plugins/gtk+/glade-gtk.c
index 9e2de6fc..fe02b451 100644
--- a/plugins/gtk+/glade-gtk.c
+++ b/plugins/gtk+/glade-gtk.c
@@ -26,6 +26,7 @@
#include "glade-gtk.h"
#include "fixed-bg.xpm"
+#include "glade-accels.h"
#include <gladeui/glade-editor-property.h>
#include <gladeui/glade-base-editor.h>
@@ -242,6 +243,58 @@ glade_gtk_stop_emission_POINTER (gpointer instance, gpointer dummy, gpointer dat
}
/* ----------------------------- GtkWidget ------------------------------ */
+void
+glade_gtk_widget_read_widget (GladeWidgetAdaptor *adaptor,
+ GladeWidget *widget,
+ GladeXmlNode *node)
+{
+ /* This code should work the same for <packing> and <widget> */
+ if (!glade_xml_node_verify_silent (node, GLADE_XML_TAG_WIDGET))
+ return;
+
+ /* First chain up.. */
+ GWA_GET_CLASS (G_TYPE_OBJECT)->read_widget (adaptor, widget, node);
+
+
+ /* Read in atk properties and accelerators */
+
+}
+
+GladeEditorProperty *
+glade_gtk_widget_create_eprop (GladeWidgetAdaptor *adaptor,
+ GladePropertyClass *klass,
+ gboolean use_command)
+{
+ GladeEditorProperty *eprop;
+
+ /* chain up.. */
+ if (GLADE_IS_PARAM_SPEC_ACCEL (klass->pspec))
+ eprop = g_object_new (GLADE_TYPE_EPROP_ACCEL,
+ "property-class", klass,
+ "use-command", use_command,
+ NULL);
+ else
+ eprop = GWA_GET_CLASS
+ (G_TYPE_OBJECT)->create_eprop (adaptor,
+ klass,
+ use_command);
+ return eprop;
+}
+
+gchar *
+glade_gtk_widget_string_from_value (GladeWidgetAdaptor *adaptor,
+ GladePropertyClass *klass,
+ const GValue *value)
+{
+ if (GLADE_IS_PARAM_SPEC_ACCEL (klass->pspec))
+ return glade_accels_make_string (g_value_get_boxed (value));
+ else
+ return GWA_GET_CLASS
+ (G_TYPE_OBJECT)->string_from_value (adaptor,
+ klass,
+ value);
+}
+
static void
widget_parent_changed (GtkWidget *widget,
GParamSpec *pspec,
diff --git a/gladeui/glade-keysyms.c b/plugins/gtk+/glade-keysyms.c
index 2b028981..0a1d6a27 100644
--- a/gladeui/glade-keysyms.c
+++ b/plugins/gtk+/glade-keysyms.c
@@ -1,6 +1,6 @@
#include <gdk/gdkkeysyms.h>
-#include "glade-builtins.h"
+#include "glade-accels.h"
/*
* This is automatically generated by ${glade-2 cvs}/tools/getkeys.pl
diff --git a/plugins/gtk+/gtk+.xml.in b/plugins/gtk+/gtk+.xml.in
index b946c194..13e00937 100644
--- a/plugins/gtk+/gtk+.xml.in
+++ b/plugins/gtk+/gtk+.xml.in
@@ -11,6 +11,9 @@
<set-property-function>glade_gtk_widget_set_property</set-property-function>
<get-property-function>glade_gtk_widget_get_property</get-property-function>
<action-activate-function>glade_gtk_widget_action_activate</action-activate-function>
+ <read-widget-function>glade_gtk_widget_read_widget</read-widget-function>
+ <create-editor-property-function>glade_gtk_widget_create_eprop</create-editor-property-function>
+ <string-from-value-function>glade_gtk_widget_string_from_value</string-from-value-function>
<actions>
<action id="remove_parent" _name="Remove Parent" stock="gtk-remove"/>