#ifndef __GLADE_PROPERTY_H__
#define __GLADE_PROPERTY_H__

#include <glib-object.h>

G_BEGIN_DECLS

#define GLADE_TYPE_PROPERTY            (glade_property_get_type())
#define GLADE_PROPERTY(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_PROPERTY, GladeProperty))
#define GLADE_PROPERTY_KLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_PROPERTY, GladePropertyKlass))
#define GLADE_IS_PROPERTY(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_PROPERTY))
#define GLADE_IS_PROPERTY_KLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_PROPERTY))
#define GLADE_PROPERTY_GET_KLASS(o)    (G_TYPE_INSTANCE_GET_CLASS ((o), GLADE_PROPERTY, GladePropertyKlass))

typedef struct _GladePropertyKlass   GladePropertyKlass;
typedef struct _GladePropertyPrivate GladePropertyPrivate;

typedef enum {
  GLADE_STATE_NORMAL              = 0,
  GLADE_STATE_CHANGED             = (1 << 0),
  GLADE_STATE_UNSUPPORTED         = (1 << 1),
  GLADE_STATE_SUPPORT_DISABLED    = (1 << 2)
} GladePropertyState;

/* A GladeProperty is an instance of a GladePropertyClass.
 * There will be one GladePropertyClass for "GtkLabel->label" but one
 * GladeProperty for each GtkLabel in the GladeProject.
 */
struct _GladeProperty
{
  GObject             parent_instance;

  GladePropertyPrivate *priv;
};


struct _GladePropertyKlass
{
  GObjectClass  parent_class;

  /* Class methods */
  GladeProperty *         (* dup)                   (GladeProperty *, GladeWidget *);
  gboolean                (* equals_value)          (GladeProperty *, const GValue *);
  gboolean                (* set_value)             (GladeProperty *, const GValue *);
  void                    (* get_value)             (GladeProperty *, GValue *);
  void                    (* sync)                  (GladeProperty *);
  void                    (* load)                  (GladeProperty *);

  /* Signals */
  void             (* value_changed)         (GladeProperty *, GValue *, GValue *);
  void             (* tooltip_changed)       (GladeProperty *, const gchar *, 
					      const gchar   *, const gchar *);
  void   (* glade_reserved1)   (void);
  void   (* glade_reserved2)   (void);
  void   (* glade_reserved3)   (void);
  void   (* glade_reserved4)   (void);
  void   (* glade_reserved5)   (void);
  void   (* glade_reserved6)   (void);
};


GType                   glade_property_get_type              (void) G_GNUC_CONST;

GladeProperty          *glade_property_new                   (GladePropertyClass *klass,
							      GladeWidget        *widget,
							      GValue             *value);

GladeProperty          *glade_property_dup                   (GladeProperty      *template_prop,
							      GladeWidget        *widget);

void                    glade_property_reset                 (GladeProperty      *property);

void                    glade_property_original_reset        (GladeProperty      *property);

gboolean                glade_property_default               (GladeProperty      *property);

gboolean                glade_property_original_default      (GladeProperty      *property);

gboolean                glade_property_equals_value          (GladeProperty      *property, 
							      const GValue       *value);

gboolean                glade_property_equals                (GladeProperty      *property, 
							      ...);

gboolean                glade_property_set_value             (GladeProperty      *property, 
							      const GValue       *value);

gboolean                glade_property_set_va_list           (GladeProperty      *property,
							      va_list             vl);

gboolean                glade_property_set                   (GladeProperty      *property,
							      ...);

void                    glade_property_get_value             (GladeProperty      *property, 
							      GValue             *value);

void                    glade_property_get_default           (GladeProperty      *property, 
							      GValue             *value);

void                    glade_property_get_va_list           (GladeProperty      *property,
							      va_list             vl);

void                    glade_property_get                   (GladeProperty      *property, 
							      ...);

void                    glade_property_add_object            (GladeProperty      *property,
							      GObject            *object);

void                    glade_property_remove_object         (GladeProperty      *property,
							      GObject            *object);

void                    glade_property_sync                  (GladeProperty      *property);

void                    glade_property_load                  (GladeProperty      *property);

void                    glade_property_read                  (GladeProperty      *property,
							      GladeProject       *project,
							      GladeXmlNode       *node);

void                    glade_property_write                 (GladeProperty      *property,	
							      GladeXmlContext    *context,
							      GladeXmlNode       *node);

GladePropertyClass     *glade_property_get_class             (GladeProperty      *property);

void                    glade_property_set_sensitive         (GladeProperty      *property,
							      gboolean            sensitive,
							      const gchar        *reason);
G_CONST_RETURN gchar   *glade_propert_get_insensitive_tooltip(GladeProperty      *property);

void                    glade_property_set_support_warning   (GladeProperty      *property,
							      gboolean            disable,
							      const gchar        *reason);
G_CONST_RETURN gchar   *glade_property_get_support_warning   (GladeProperty      *property);

gboolean                glade_property_get_sensitive         (GladeProperty      *property);


void                    glade_property_set_save_always       (GladeProperty      *property,
							      gboolean            setting);

gboolean                glade_property_get_save_always       (GladeProperty      *property);


void                    glade_property_set_enabled           (GladeProperty      *property,
							      gboolean            enabled);

gboolean                glade_property_get_enabled           (GladeProperty      *property);


gchar                  *glade_property_make_string           (GladeProperty      *property);

GladeWidget            *glade_property_get_widget            (GladeProperty      *property);
void                    glade_property_set_widget            (GladeProperty      *property,
							      GladeWidget        *widget);

GValue                 *glade_property_inline_value          (GladeProperty      *property);

GladePropertyState      glade_property_get_state             (GladeProperty      *property);

void                    glade_property_i18n_set_comment      (GladeProperty      *property, 
							      const gchar        *str);

G_CONST_RETURN gchar   *glade_property_i18n_get_comment      (GladeProperty      *property);

void                    glade_property_i18n_set_context      (GladeProperty      *property, 
							      const gchar        *str);

G_CONST_RETURN gchar   *glade_property_i18n_get_context      (GladeProperty      *property);

void                    glade_property_i18n_set_translatable (GladeProperty      *property,
							      gboolean            translatable);

gboolean                glade_property_i18n_get_translatable (GladeProperty      *property);

void                    glade_property_push_superuser        (void);

void                    glade_property_pop_superuser         (void);

gboolean                glade_property_superuser             (void);

G_END_DECLS

#endif /* __GLADE_PROPERTY_H__ */
