/******************************************************************************* GladeProperty class methods *******************************************************************************/ static GladeProperty * glade_property_dup_impl (GladeProperty * template_prop, GladeWidget * widget) { GladeProperty *property; property = g_object_new (GLADE_TYPE_PROPERTY, "class", template_prop->priv->klass, "i18n-translatable", template_prop->priv->i18n_translatable, "i18n-context", template_prop->priv->i18n_context, "i18n-comment", template_prop->priv->i18n_comment, NULL); property->priv->widget = widget; property->priv->value = g_new0 (GValue, 1); g_value_init (property->priv->value, template_prop->priv->value->g_type); /* Cannot duplicate parentless_widget property */ if (glade_property_class_parentless_widget (template_prop->priv->klass)) { if (!G_IS_PARAM_SPEC_OBJECT (glade_property_class_get_pspec (template_prop->priv->klass))) g_warning ("Parentless widget property should be of object type"); g_value_set_object (property->priv->value, NULL); } else g_value_copy (template_prop->priv->value, property->priv->value); property->priv->enabled = template_prop->priv->enabled; property->priv->state = template_prop->priv->state; glade_property_set_sensitive (property, template_prop->priv->sensitive, template_prop->priv->insensitive_tooltip); return property; }
/** * glade_property_add_object: * @property: a #GladeProperty * @object: The #GObject to add * * Adds @object to the object list in @property. * * Note: This function expects @property to be a #GladeParamSpecObjects * or #GParamSpecObject type property. */ void glade_property_add_object (GladeProperty * property, GObject * object) { GList *list = NULL, *new_list = NULL; GParamSpec *pspec; g_return_if_fail (GLADE_IS_PROPERTY (property)); g_return_if_fail (G_IS_OBJECT (object)); pspec = glade_property_class_get_pspec (property->priv->klass); g_return_if_fail (GLADE_IS_PARAM_SPEC_OBJECTS (pspec) || G_IS_PARAM_SPEC_OBJECT (pspec)); if (GLADE_IS_PARAM_SPEC_OBJECTS (pspec)) { glade_property_get (property, &list); new_list = g_list_copy (list); new_list = g_list_append (new_list, object); glade_property_set (property, new_list); /* ownership of the list is not passed * through glade_property_set() */ g_list_free (new_list); } else { glade_property_set (property, object); } }
/** * glade_property_remove_object: * @property: a #GladeProperty * @object: The #GObject to add * * Removes @object from the object list in @property. * * Note: This function expects @property to be a #GladeParamSpecObjects * or #GParamSpecObject type property. */ void glade_property_remove_object (GladeProperty * property, GObject * object) { GList *list = NULL, *new_list = NULL; GParamSpec *pspec; g_return_if_fail (GLADE_IS_PROPERTY (property)); g_return_if_fail (G_IS_OBJECT (object)); pspec = glade_property_class_get_pspec (property->priv->klass); g_return_if_fail (GLADE_IS_PARAM_SPEC_OBJECTS (pspec) || G_IS_PARAM_SPEC_OBJECT (pspec)); if (GLADE_IS_PARAM_SPEC_OBJECTS (pspec)) { /* If object isnt in list; list should stay in tact. * not bothering to check for now. */ glade_property_get (property, &list); new_list = g_list_copy (list); new_list = g_list_remove (new_list, object); glade_property_set (property, new_list); /* ownership of the list is not passed * through glade_property_set() */ g_list_free (new_list); } else { glade_property_set (property, NULL); } }
gchar * glade_gtk_icon_factory_string_from_value (GladeWidgetAdaptor *adaptor, GladePropertyClass *klass, const GValue *value) { GString *string; GParamSpec *pspec; pspec = glade_property_class_get_pspec (klass); if (pspec->value_type == GLADE_TYPE_ICON_SOURCES) { GladeIconSources *sources = g_value_get_boxed (value); if (!sources) return g_strdup (""); string = g_string_new (""); g_hash_table_foreach (sources->sources, (GHFunc) serialize_icon_sources, string); return g_string_free (string, FALSE); } else return GWA_GET_CLASS (G_TYPE_OBJECT)->string_from_value (adaptor, klass, value); }
static void glade_property_update_prop_refs (GladeProperty * property, const GValue * old_value, const GValue * new_value) { GladeWidget *gold, *gnew; GObject *old_object, *new_object; GList *old_list, *new_list, *list, *removed, *added; if (GLADE_IS_PARAM_SPEC_OBJECTS (glade_property_class_get_pspec (property->priv->klass))) { /* Make our own copies incase we're walking an * unstable list */ old_list = g_value_dup_boxed (old_value); new_list = g_value_dup_boxed (new_value); /* Diff up the GList */ removed = glade_util_removed_from_list (old_list, new_list); added = glade_util_added_in_list (old_list, new_list); /* Adjust the appropriate prop refs */ for (list = removed; list; list = list->next) { old_object = list->data; gold = glade_widget_get_from_gobject (old_object); if (gold != NULL) glade_widget_remove_prop_ref (gold, property); } for (list = added; list; list = list->next) { new_object = list->data; gnew = glade_widget_get_from_gobject (new_object); if (gnew != NULL) glade_widget_add_prop_ref (gnew, property); } g_list_free (removed); g_list_free (added); g_list_free (old_list); g_list_free (new_list); } else { if ((old_object = g_value_get_object (old_value)) != NULL) { gold = glade_widget_get_from_gobject (old_object); g_return_if_fail (gold != NULL); glade_widget_remove_prop_ref (gold, property); } if ((new_object = g_value_get_object (new_value)) != NULL) { gnew = glade_widget_get_from_gobject (new_object); g_return_if_fail (gnew != NULL); glade_widget_add_prop_ref (gnew, property); } } }
static void glade_property_get_value_impl (GladeProperty * property, GValue * value) { GParamSpec *pspec; pspec = glade_property_class_get_pspec (property->priv->klass); g_value_init (value, pspec->value_type); g_value_copy (property->priv->value, value); }
/** * glade_property_get_default: * @property: a #GladeProperty * @value: a #GValue * * Retrieve the default property value */ void glade_property_get_default (GladeProperty * property, GValue * value) { GParamSpec *pspec; g_return_if_fail (GLADE_IS_PROPERTY (property)); g_return_if_fail (value != NULL); pspec = glade_property_class_get_pspec (property->priv->klass); g_value_init (value, pspec->value_type); g_value_copy (glade_property_class_get_default (property->priv->klass), value); }
static gint property_class_comp (gconstpointer a, gconstpointer b) { GladePropertyClass *ca = (GladePropertyClass *)a, *cb = (GladePropertyClass *)b; GParamSpec *pa, *pb; const gchar *name_a, *name_b; pa = glade_property_class_get_pspec (ca); pb = glade_property_class_get_pspec (cb); name_a = glade_property_class_id (ca); name_b = glade_property_class_id (cb); /* Special case for the 'name' property, it *always* comes first. */ if (strcmp (name_a, "name") == 0) return -1; else if (strcmp (name_b, "name") == 0) return 1; /* Properties of the same class are sorted in the same level */ else if (pa->owner_type == pb->owner_type) { gdouble result = glade_property_class_weight (ca) - glade_property_class_weight (cb); /* Avoid cast to int */ if (result < 0.0) return -1; else if (result > 0.0) return 1; else return 0; } /* Group properties by thier class hierarchy */ else { if (g_type_is_a (pa->owner_type, pb->owner_type)) return (glade_property_class_common (ca) || glade_property_class_get_is_packing (ca)) ? 1 : -1; else return (glade_property_class_common (ca) || glade_property_class_get_is_packing (ca)) ? -1 : 1; } }
void glade_popup_property_pop (GladeProperty *property, GdkEventButton *event) { GladeWidgetAdaptor *adaptor, *prop_adaptor; GladePropertyClass *pclass; GParamSpec *pspec; GtkWidget *popup_menu; gint button; gint event_time; pclass = glade_property_get_class (property); pspec = glade_property_class_get_pspec (pclass); prop_adaptor = glade_property_class_get_adaptor (pclass); adaptor = glade_widget_adaptor_from_pspec (prop_adaptor, pspec); g_return_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor)); popup_menu = gtk_menu_new (); glade_popup_append_item (popup_menu, _("Set default value"), TRUE, glade_popup_clear_property_cb, property); if (!glade_property_class_get_virtual (pclass) && glade_widget_adaptor_get_book (adaptor) && glade_util_have_devhelp ()) { glade_popup_append_item (popup_menu, _("Read _documentation"), TRUE, glade_popup_property_docs_cb, property); } if (event) { button = event->button; event_time = event->time; } else { button = 0; event_time = gtk_get_current_event_time (); } gtk_menu_popup (GTK_MENU (popup_menu), NULL, NULL, NULL, NULL, button, event_time); }
gchar * glade_gtk_recent_file_filter_string_from_value (GladeWidgetAdaptor * adaptor, GladePropertyClass * klass, const GValue * value) { GParamSpec *pspec; pspec = glade_property_class_get_pspec (klass); if (pspec->value_type == GLADE_TYPE_STRING_LIST) { GList *list = g_value_get_boxed (value); return glade_string_list_to_string (list); } else return GWA_GET_CLASS (G_TYPE_OBJECT)->string_from_value (adaptor, klass, value); }
GladeEditorProperty * glade_gtk_icon_factory_create_eprop (GladeWidgetAdaptor *adaptor, GladePropertyClass *klass, gboolean use_command) { GladeEditorProperty *eprop; GParamSpec *pspec; pspec = glade_property_class_get_pspec (klass); if (pspec->value_type == GLADE_TYPE_ICON_SOURCES) eprop = g_object_new (GLADE_TYPE_EPROP_ICON_SOURCES, "property-class", klass, "use-command", use_command, NULL); else eprop = GWA_GET_CLASS (G_TYPE_OBJECT)->create_eprop (adaptor, klass, use_command); return eprop; }
static void glade_popup_property_docs_cb (GtkMenuItem *item, GladeProperty *property) { GladeWidgetAdaptor *adaptor, *prop_adaptor; GladePropertyClass *pclass; GParamSpec *pspec; gchar *search; pclass = glade_property_get_class (property); pspec = glade_property_class_get_pspec (pclass); prop_adaptor = glade_property_class_get_adaptor (pclass); adaptor = glade_widget_adaptor_from_pspec (prop_adaptor, pspec); search = g_strdup_printf ("The \"%s\" property", glade_property_class_id (pclass)); glade_app_search_docs (glade_widget_adaptor_get_book (adaptor), g_type_name (pspec->owner_type), search); g_free (search); }
GladeEditorProperty * glade_gtk_recent_file_filter_create_eprop (GladeWidgetAdaptor * adaptor, GladePropertyClass * klass, gboolean use_command) { GladeEditorProperty *eprop; GParamSpec *pspec; pspec = glade_property_class_get_pspec (klass); if (pspec->value_type == GLADE_TYPE_STRING_LIST) { eprop = glade_eprop_string_list_new (klass, use_command, FALSE, FALSE); } else eprop = GWA_GET_CLASS (G_TYPE_OBJECT)->create_eprop (adaptor, klass, use_command); return eprop; }
GladeEditorProperty * glade_gtk_combo_box_text_create_eprop (GladeWidgetAdaptor *adaptor, GladePropertyClass *klass, gboolean use_command) { GladeEditorProperty *eprop; GParamSpec *pspec; pspec = glade_property_class_get_pspec (klass); if (pspec->value_type == GLADE_TYPE_STRING_LIST) { eprop = glade_eprop_string_list_new (klass, use_command, TRUE, TRUE); } else eprop = GWA_GET_CLASS (GTK_TYPE_WIDGET)->create_eprop (adaptor, klass, use_command); return eprop; }
GladeEditorProperty * glade_gtk_widget_create_eprop (GladeWidgetAdaptor * adaptor, GladePropertyClass * klass, gboolean use_command) { GladeEditorProperty *eprop; GParamSpec *pspec; pspec = glade_property_class_get_pspec (klass); /* chain up.. */ if (pspec->value_type == GLADE_TYPE_ACCEL_GLIST) eprop = g_object_new (GLADE_TYPE_EPROP_ACCEL, "property-class", klass, "use-command", use_command, NULL); else if (pspec->value_type == GLADE_TYPE_STRING_LIST) eprop = glade_eprop_string_list_new (klass, use_command, FALSE, FALSE); else eprop = GWA_GET_CLASS (G_TYPE_OBJECT)->create_eprop (adaptor, klass, use_command); return eprop; }
static void glade_property_load_impl (GladeProperty * property) { GObject *object; GObjectClass *oclass; GParamSpec *pspec; pspec = glade_property_class_get_pspec (property->priv->klass); if (property->priv->widget == NULL || glade_property_class_get_virtual (property->priv->klass) || glade_property_class_get_is_packing (property->priv->klass) || glade_property_class_get_ignore (property->priv->klass) || !(pspec->flags & G_PARAM_READABLE) || G_IS_PARAM_SPEC_OBJECT (pspec)) return; object = glade_widget_get_object (property->priv->widget); oclass = G_OBJECT_GET_CLASS (object); if (g_object_class_find_property (oclass, glade_property_class_id (property->priv->klass))) glade_widget_object_get_property (property->priv->widget, glade_property_class_id (property->priv->klass), property->priv->value); }