--- /dev/null
+/* UndoManager.c generated by valac, the Vala compiler
+ * generated from UndoManager.vala, do not modify */
+
+/* Copyright 2009 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later). See the COPYING file in this distribution.
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gee.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gobject/gvaluecollector.h>
+
+
+#define MODEL_TYPE_UNDO_MANAGER (model_undo_manager_get_type ())
+#define MODEL_UNDO_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_UNDO_MANAGER, ModelUndoManager))
+#define MODEL_UNDO_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_UNDO_MANAGER, ModelUndoManagerClass))
+#define MODEL_IS_UNDO_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_UNDO_MANAGER))
+#define MODEL_IS_UNDO_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_UNDO_MANAGER))
+#define MODEL_UNDO_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_UNDO_MANAGER, ModelUndoManagerClass))
+
+typedef struct _ModelUndoManager ModelUndoManager;
+typedef struct _ModelUndoManagerClass ModelUndoManagerClass;
+typedef struct _ModelUndoManagerPrivate ModelUndoManagerPrivate;
+
+#define MODEL_TYPE_COMMAND (model_command_get_type ())
+#define MODEL_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_COMMAND, ModelCommand))
+#define MODEL_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_COMMAND, ModelCommandClass))
+#define MODEL_IS_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_COMMAND))
+#define MODEL_IS_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_COMMAND))
+#define MODEL_COMMAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_COMMAND, ModelCommandClass))
+
+typedef struct _ModelCommand ModelCommand;
+typedef struct _ModelCommandClass ModelCommandClass;
+#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
+
+#define MODEL_TYPE_TRANSACTION_COMMAND (model_transaction_command_get_type ())
+#define MODEL_TRANSACTION_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_TRANSACTION_COMMAND, ModelTransactionCommand))
+#define MODEL_TRANSACTION_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_TRANSACTION_COMMAND, ModelTransactionCommandClass))
+#define MODEL_IS_TRANSACTION_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_TRANSACTION_COMMAND))
+#define MODEL_IS_TRANSACTION_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_TRANSACTION_COMMAND))
+#define MODEL_TRANSACTION_COMMAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_TRANSACTION_COMMAND, ModelTransactionCommandClass))
+
+typedef struct _ModelTransactionCommand ModelTransactionCommand;
+typedef struct _ModelTransactionCommandClass ModelTransactionCommandClass;
+#define _model_command_unref0(var) ((var == NULL) ? NULL : (var = (model_command_unref (var), NULL)))
+typedef struct _ModelParamSpecUndoManager ModelParamSpecUndoManager;
+
+struct _ModelUndoManager {
+ GTypeInstance parent_instance;
+ volatile int ref_count;
+ ModelUndoManagerPrivate * priv;
+};
+
+struct _ModelUndoManagerClass {
+ GTypeClass parent_class;
+ void (*finalize) (ModelUndoManager *self);
+};
+
+struct _ModelUndoManagerPrivate {
+ gint saved_index;
+ gboolean _in_undo;
+ GeeArrayList* command_list;
+};
+
+struct _ModelParamSpecUndoManager {
+ GParamSpec parent_instance;
+};
+
+
+static gpointer model_undo_manager_parent_class = NULL;
+
+gpointer model_undo_manager_ref (gpointer instance);
+void model_undo_manager_unref (gpointer instance);
+GParamSpec* model_param_spec_undo_manager (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
+void model_value_set_undo_manager (GValue* value, gpointer v_object);
+void model_value_take_undo_manager (GValue* value, gpointer v_object);
+gpointer model_value_get_undo_manager (const GValue* value);
+GType model_undo_manager_get_type (void);
+gpointer model_command_ref (gpointer instance);
+void model_command_unref (gpointer instance);
+GParamSpec* model_param_spec_command (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
+void model_value_set_command (GValue* value, gpointer v_object);
+void model_value_take_command (GValue* value, gpointer v_object);
+gpointer model_value_get_command (const GValue* value);
+GType model_command_get_type (void);
+#define MODEL_UNDO_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEL_TYPE_UNDO_MANAGER, ModelUndoManagerPrivate))
+enum {
+ MODEL_UNDO_MANAGER_DUMMY_PROPERTY
+};
+ModelUndoManager* model_undo_manager_new (void);
+ModelUndoManager* model_undo_manager_construct (GType object_type);
+void model_undo_manager_reset (ModelUndoManager* self);
+void model_undo_manager_mark_clean (ModelUndoManager* self);
+ModelTransactionCommand* model_transaction_command_new (gboolean open, const char* transaction_description);
+ModelTransactionCommand* model_transaction_command_construct (GType object_type, gboolean open, const char* transaction_description);
+GType model_transaction_command_get_type (void);
+void model_undo_manager_start_transaction (ModelUndoManager* self, const char* description);
+void model_undo_manager_end_transaction (ModelUndoManager* self, const char* description);
+gboolean model_undo_manager_get_in_undo (ModelUndoManager* self);
+void model_command_apply (ModelCommand* self);
+static ModelCommand* model_undo_manager_get_current_command (ModelUndoManager* self);
+gboolean model_command_merge (ModelCommand* self, ModelCommand* command);
+gboolean model_undo_manager_get_can_undo (ModelUndoManager* self);
+void model_undo_manager_do_command (ModelUndoManager* self, ModelCommand* the_command);
+static void model_undo_manager_set_in_undo (ModelUndoManager* self, gboolean value);
+gboolean model_transaction_command_in_transaction (ModelTransactionCommand* self);
+void model_command_undo (ModelCommand* self);
+gboolean model_undo_manager_get_is_dirty (ModelUndoManager* self);
+void model_undo_manager_undo (ModelUndoManager* self);
+char* model_command_description (ModelCommand* self);
+char* model_undo_manager_get_undo_title (ModelUndoManager* self);
+static void model_undo_manager_finalize (ModelUndoManager* obj);
+
+
+
+#line 19 "UndoManager.vala"
+ModelUndoManager* model_undo_manager_construct (GType object_type) {
+#line 123 "UndoManager.c"
+ ModelUndoManager* self;
+ self = (ModelUndoManager*) g_type_create_instance (object_type);
+ return self;
+}
+
+
+#line 19 "UndoManager.vala"
+ModelUndoManager* model_undo_manager_new (void) {
+#line 19 "UndoManager.vala"
+ return model_undo_manager_construct (MODEL_TYPE_UNDO_MANAGER);
+#line 134 "UndoManager.c"
+}
+
+
+#line 22 "UndoManager.vala"
+void model_undo_manager_reset (ModelUndoManager* self) {
+#line 22 "UndoManager.vala"
+ g_return_if_fail (MODEL_IS_UNDO_MANAGER (self));
+#line 23 "UndoManager.vala"
+ gee_abstract_collection_clear (GEE_ABSTRACT_COLLECTION (self->priv->command_list));
+#line 24 "UndoManager.vala"
+ self->priv->saved_index = 0;
+#line 25 "UndoManager.vala"
+ g_signal_emit_by_name (self, "undo-changed", FALSE);
+#line 148 "UndoManager.c"
+}
+
+
+#line 28 "UndoManager.vala"
+void model_undo_manager_mark_clean (ModelUndoManager* self) {
+#line 28 "UndoManager.vala"
+ g_return_if_fail (MODEL_IS_UNDO_MANAGER (self));
+#line 29 "UndoManager.vala"
+ self->priv->saved_index = gee_collection_get_size (GEE_COLLECTION (self->priv->command_list));
+#line 30 "UndoManager.vala"
+ g_signal_emit_by_name (self, "dirty-changed", FALSE);
+#line 160 "UndoManager.c"
+}
+
+
+#line 33 "UndoManager.vala"
+void model_undo_manager_start_transaction (ModelUndoManager* self, const char* description) {
+#line 166 "UndoManager.c"
+ ModelTransactionCommand* command;
+#line 33 "UndoManager.vala"
+ g_return_if_fail (MODEL_IS_UNDO_MANAGER (self));
+#line 33 "UndoManager.vala"
+ g_return_if_fail (description != NULL);
+#line 34 "UndoManager.vala"
+ command = model_transaction_command_new (FALSE, description);
+#line 35 "UndoManager.vala"
+ gee_abstract_collection_add (GEE_ABSTRACT_COLLECTION (self->priv->command_list), MODEL_COMMAND (command));
+#line 36 "UndoManager.vala"
+ g_signal_emit_by_name (self, "undo-changed", TRUE);
+#line 178 "UndoManager.c"
+ _model_command_unref0 (command);
+}
+
+
+#line 39 "UndoManager.vala"
+void model_undo_manager_end_transaction (ModelUndoManager* self, const char* description) {
+#line 185 "UndoManager.c"
+ ModelTransactionCommand* command;
+#line 39 "UndoManager.vala"
+ g_return_if_fail (MODEL_IS_UNDO_MANAGER (self));
+#line 39 "UndoManager.vala"
+ g_return_if_fail (description != NULL);
+#line 40 "UndoManager.vala"
+ command = model_transaction_command_new (TRUE, description);
+#line 41 "UndoManager.vala"
+ gee_abstract_collection_add (GEE_ABSTRACT_COLLECTION (self->priv->command_list), MODEL_COMMAND (command));
+#line 42 "UndoManager.vala"
+ g_signal_emit_by_name (self, "undo-changed", TRUE);
+#line 197 "UndoManager.c"
+ _model_command_unref0 (command);
+}
+
+
+#line 45 "UndoManager.vala"
+void model_undo_manager_do_command (ModelUndoManager* self, ModelCommand* the_command) {
+#line 45 "UndoManager.vala"
+ g_return_if_fail (MODEL_IS_UNDO_MANAGER (self));
+#line 45 "UndoManager.vala"
+ g_return_if_fail (MODEL_IS_COMMAND (the_command));
+#line 46 "UndoManager.vala"
+ if (!model_undo_manager_get_in_undo (self)) {
+#line 210 "UndoManager.c"
+ ModelCommand* current_command;
+ gboolean _tmp0_ = FALSE;
+#line 47 "UndoManager.vala"
+ model_command_apply (the_command);
+#line 48 "UndoManager.vala"
+ current_command = model_undo_manager_get_current_command (self);
+#line 49 "UndoManager.vala"
+ if (current_command == NULL) {
+#line 49 "UndoManager.vala"
+ _tmp0_ = TRUE;
+#line 221 "UndoManager.c"
+ } else {
+#line 49 "UndoManager.vala"
+ _tmp0_ = !model_command_merge (current_command, the_command);
+#line 225 "UndoManager.c"
+ }
+#line 49 "UndoManager.vala"
+ if (_tmp0_) {
+#line 50 "UndoManager.vala"
+ gee_abstract_collection_add (GEE_ABSTRACT_COLLECTION (self->priv->command_list), the_command);
+#line 231 "UndoManager.c"
+ }
+#line 52 "UndoManager.vala"
+ g_signal_emit_by_name (self, "dirty-changed", TRUE);
+#line 53 "UndoManager.vala"
+ g_signal_emit_by_name (self, "undo-changed", model_undo_manager_get_can_undo (self));
+#line 237 "UndoManager.c"
+ _model_command_unref0 (current_command);
+ }
+}
+
+
+#line 57 "UndoManager.vala"
+static ModelCommand* model_undo_manager_get_current_command (ModelUndoManager* self) {
+#line 245 "UndoManager.c"
+ ModelCommand* result = NULL;
+ gint index;
+#line 57 "UndoManager.vala"
+ g_return_val_if_fail (MODEL_IS_UNDO_MANAGER (self), NULL);
+#line 58 "UndoManager.vala"
+ index = gee_collection_get_size (GEE_COLLECTION (self->priv->command_list)) - 1;
+#line 59 "UndoManager.vala"
+ if (index >= 0) {
+#line 254 "UndoManager.c"
+ result = (ModelCommand*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->priv->command_list), index);
+#line 60 "UndoManager.vala"
+ return result;
+#line 258 "UndoManager.c"
+ } else {
+ result = NULL;
+#line 62 "UndoManager.vala"
+ return result;
+#line 263 "UndoManager.c"
+ }
+}
+
+
+static gpointer _model_command_ref0 (gpointer self) {
+ return self ? model_command_ref (self) : NULL;
+}
+
+
+#line 66 "UndoManager.vala"
+void model_undo_manager_undo (ModelUndoManager* self) {
+#line 275 "UndoManager.c"
+ gint in_transaction;
+#line 66 "UndoManager.vala"
+ g_return_if_fail (MODEL_IS_UNDO_MANAGER (self));
+#line 67 "UndoManager.vala"
+ g_assert (model_undo_manager_get_in_undo (self) == FALSE);
+#line 68 "UndoManager.vala"
+ model_undo_manager_set_in_undo (self, TRUE);
+#line 69 "UndoManager.vala"
+ in_transaction = 0;
+#line 285 "UndoManager.c"
+ {
+ gboolean _tmp0_;
+#line 70 "UndoManager.vala"
+ _tmp0_ = TRUE;
+#line 70 "UndoManager.vala"
+ while (TRUE) {
+#line 292 "UndoManager.c"
+ ModelCommand* the_command;
+#line 70 "UndoManager.vala"
+ if (!_tmp0_) {
+#line 87 "UndoManager.vala"
+ if (!(in_transaction > 0)) {
+#line 87 "UndoManager.vala"
+ break;
+#line 300 "UndoManager.c"
+ }
+ }
+#line 70 "UndoManager.vala"
+ _tmp0_ = FALSE;
+#line 71 "UndoManager.vala"
+ the_command = model_undo_manager_get_current_command (self);
+#line 72 "UndoManager.vala"
+ if (the_command != NULL) {
+#line 309 "UndoManager.c"
+ ModelCommand* _tmp1_;
+ ModelTransactionCommand* transaction_command;
+#line 73 "UndoManager.vala"
+ gee_abstract_collection_remove (GEE_ABSTRACT_COLLECTION (self->priv->command_list), the_command);
+#line 74 "UndoManager.vala"
+ transaction_command = _model_command_ref0 ((_tmp1_ = the_command, MODEL_IS_TRANSACTION_COMMAND (_tmp1_) ? ((ModelTransactionCommand*) _tmp1_) : NULL));
+#line 75 "UndoManager.vala"
+ if (transaction_command != NULL) {
+#line 76 "UndoManager.vala"
+ if (model_transaction_command_in_transaction (transaction_command)) {
+#line 77 "UndoManager.vala"
+ in_transaction++;
+#line 322 "UndoManager.c"
+ } else {
+#line 79 "UndoManager.vala"
+ in_transaction--;
+#line 326 "UndoManager.c"
+ }
+ } else {
+#line 82 "UndoManager.vala"
+ model_command_undo (the_command);
+#line 331 "UndoManager.c"
+ }
+ _model_command_unref0 (transaction_command);
+ } else {
+ _model_command_unref0 (the_command);
+#line 85 "UndoManager.vala"
+ break;
+#line 338 "UndoManager.c"
+ }
+ _model_command_unref0 (the_command);
+ }
+ }
+#line 88 "UndoManager.vala"
+ g_signal_emit_by_name (self, "dirty-changed", model_undo_manager_get_is_dirty (self));
+#line 89 "UndoManager.vala"
+ g_signal_emit_by_name (self, "undo-changed", model_undo_manager_get_can_undo (self));
+#line 90 "UndoManager.vala"
+ model_undo_manager_set_in_undo (self, FALSE);
+#line 349 "UndoManager.c"
+}
+
+
+#line 93 "UndoManager.vala"
+char* model_undo_manager_get_undo_title (ModelUndoManager* self) {
+#line 355 "UndoManager.c"
+ char* result = NULL;
+ ModelCommand* the_command;
+#line 93 "UndoManager.vala"
+ g_return_val_if_fail (MODEL_IS_UNDO_MANAGER (self), NULL);
+#line 94 "UndoManager.vala"
+ the_command = model_undo_manager_get_current_command (self);
+#line 95 "UndoManager.vala"
+ if (the_command != NULL) {
+#line 364 "UndoManager.c"
+ result = model_command_description (the_command);
+ _model_command_unref0 (the_command);
+#line 96 "UndoManager.vala"
+ return result;
+#line 369 "UndoManager.c"
+ } else {
+ result = g_strdup ("");
+ _model_command_unref0 (the_command);
+#line 98 "UndoManager.vala"
+ return result;
+#line 375 "UndoManager.c"
+ }
+ _model_command_unref0 (the_command);
+}
+
+
+gboolean model_undo_manager_get_is_dirty (ModelUndoManager* self) {
+ gboolean result;
+ g_return_val_if_fail (MODEL_IS_UNDO_MANAGER (self), FALSE);
+ result = self->priv->saved_index != gee_collection_get_size (GEE_COLLECTION (self->priv->command_list));
+#line 12 "UndoManager.vala"
+ return result;
+#line 387 "UndoManager.c"
+}
+
+
+gboolean model_undo_manager_get_can_undo (ModelUndoManager* self) {
+ gboolean result;
+ g_return_val_if_fail (MODEL_IS_UNDO_MANAGER (self), FALSE);
+ result = gee_collection_get_size (GEE_COLLECTION (self->priv->command_list)) > 0;
+#line 13 "UndoManager.vala"
+ return result;
+#line 397 "UndoManager.c"
+}
+
+
+gboolean model_undo_manager_get_in_undo (ModelUndoManager* self) {
+ gboolean result;
+ g_return_val_if_fail (MODEL_IS_UNDO_MANAGER (self), FALSE);
+ result = self->priv->_in_undo;
+#line 14 "UndoManager.vala"
+ return result;
+#line 407 "UndoManager.c"
+}
+
+
+static void model_undo_manager_set_in_undo (ModelUndoManager* self, gboolean value) {
+ g_return_if_fail (MODEL_IS_UNDO_MANAGER (self));
+#line 14 "UndoManager.vala"
+ self->priv->_in_undo = value;
+#line 415 "UndoManager.c"
+}
+
+
+static void model_value_undo_manager_init (GValue* value) {
+ value->data[0].v_pointer = NULL;
+}
+
+
+static void model_value_undo_manager_free_value (GValue* value) {
+ if (value->data[0].v_pointer) {
+ model_undo_manager_unref (value->data[0].v_pointer);
+ }
+}
+
+
+static void model_value_undo_manager_copy_value (const GValue* src_value, GValue* dest_value) {
+ if (src_value->data[0].v_pointer) {
+ dest_value->data[0].v_pointer = model_undo_manager_ref (src_value->data[0].v_pointer);
+ } else {
+ dest_value->data[0].v_pointer = NULL;
+ }
+}
+
+
+static gpointer model_value_undo_manager_peek_pointer (const GValue* value) {
+ return value->data[0].v_pointer;
+}
+
+
+static gchar* model_value_undo_manager_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
+ if (collect_values[0].v_pointer) {
+ ModelUndoManager* object;
+ object = collect_values[0].v_pointer;
+ if (object->parent_instance.g_class == NULL) {
+ return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
+ } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
+ return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
+ }
+ value->data[0].v_pointer = model_undo_manager_ref (object);
+ } else {
+ value->data[0].v_pointer = NULL;
+ }
+ return NULL;
+}
+
+
+static gchar* model_value_undo_manager_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
+ ModelUndoManager** object_p;
+ object_p = collect_values[0].v_pointer;
+ if (!object_p) {
+ return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+ }
+ if (!value->data[0].v_pointer) {
+ *object_p = NULL;
+ } else if (collect_flags && G_VALUE_NOCOPY_CONTENTS) {
+ *object_p = value->data[0].v_pointer;
+ } else {
+ *object_p = model_undo_manager_ref (value->data[0].v_pointer);
+ }
+ return NULL;
+}
+
+
+GParamSpec* model_param_spec_undo_manager (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
+ ModelParamSpecUndoManager* spec;
+ g_return_val_if_fail (g_type_is_a (object_type, MODEL_TYPE_UNDO_MANAGER), NULL);
+ spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
+ G_PARAM_SPEC (spec)->value_type = object_type;
+ return G_PARAM_SPEC (spec);
+}
+
+
+gpointer model_value_get_undo_manager (const GValue* value) {
+ g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, MODEL_TYPE_UNDO_MANAGER), NULL);
+ return value->data[0].v_pointer;
+}
+
+
+void model_value_set_undo_manager (GValue* value, gpointer v_object) {
+ ModelUndoManager* old;
+ g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, MODEL_TYPE_UNDO_MANAGER));
+ old = value->data[0].v_pointer;
+ if (v_object) {
+ g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, MODEL_TYPE_UNDO_MANAGER));
+ g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
+ value->data[0].v_pointer = v_object;
+ model_undo_manager_ref (value->data[0].v_pointer);
+ } else {
+ value->data[0].v_pointer = NULL;
+ }
+ if (old) {
+ model_undo_manager_unref (old);
+ }
+}
+
+
+void model_value_take_undo_manager (GValue* value, gpointer v_object) {
+ ModelUndoManager* old;
+ g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, MODEL_TYPE_UNDO_MANAGER));
+ old = value->data[0].v_pointer;
+ if (v_object) {
+ g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, MODEL_TYPE_UNDO_MANAGER));
+ g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
+ value->data[0].v_pointer = v_object;
+ } else {
+ value->data[0].v_pointer = NULL;
+ }
+ if (old) {
+ model_undo_manager_unref (old);
+ }
+}
+
+
+static void model_undo_manager_class_init (ModelUndoManagerClass * klass) {
+ model_undo_manager_parent_class = g_type_class_peek_parent (klass);
+ MODEL_UNDO_MANAGER_CLASS (klass)->finalize = model_undo_manager_finalize;
+ g_type_class_add_private (klass, sizeof (ModelUndoManagerPrivate));
+ g_signal_new ("undo_changed", MODEL_TYPE_UNDO_MANAGER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+ g_signal_new ("dirty_changed", MODEL_TYPE_UNDO_MANAGER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+}
+
+
+static void model_undo_manager_instance_init (ModelUndoManager * self) {
+ self->priv = MODEL_UNDO_MANAGER_GET_PRIVATE (self);
+ self->priv->saved_index = 0;
+ self->priv->_in_undo = FALSE;
+ self->priv->command_list = gee_array_list_new (MODEL_TYPE_COMMAND, (GBoxedCopyFunc) model_command_ref, model_command_unref, NULL);
+ self->ref_count = 1;
+}
+
+
+static void model_undo_manager_finalize (ModelUndoManager* obj) {
+ ModelUndoManager * self;
+ self = MODEL_UNDO_MANAGER (obj);
+ _g_object_unref0 (self->priv->command_list);
+}
+
+
+GType model_undo_manager_get_type (void) {
+ static volatile gsize model_undo_manager_type_id__volatile = 0;
+ if (g_once_init_enter (&model_undo_manager_type_id__volatile)) {
+ static const GTypeValueTable g_define_type_value_table = { model_value_undo_manager_init, model_value_undo_manager_free_value, model_value_undo_manager_copy_value, model_value_undo_manager_peek_pointer, "p", model_value_undo_manager_collect_value, "p", model_value_undo_manager_lcopy_value };
+ static const GTypeInfo g_define_type_info = { sizeof (ModelUndoManagerClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) model_undo_manager_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ModelUndoManager), 0, (GInstanceInitFunc) model_undo_manager_instance_init, &g_define_type_value_table };
+ static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
+ GType model_undo_manager_type_id;
+ model_undo_manager_type_id = g_type_register_fundamental (g_type_fundamental_next (), "ModelUndoManager", &g_define_type_info, &g_define_type_fundamental_info, 0);
+ g_once_init_leave (&model_undo_manager_type_id__volatile, model_undo_manager_type_id);
+ }
+ return model_undo_manager_type_id__volatile;
+}
+
+
+gpointer model_undo_manager_ref (gpointer instance) {
+ ModelUndoManager* self;
+ self = instance;
+ g_atomic_int_inc (&self->ref_count);
+ return instance;
+}
+
+
+void model_undo_manager_unref (gpointer instance) {
+ ModelUndoManager* self;
+ self = instance;
+ if (g_atomic_int_dec_and_test (&self->ref_count)) {
+ MODEL_UNDO_MANAGER_GET_CLASS (self)->finalize (self);
+ g_type_free_instance ((GTypeInstance *) self);
+ }
+}
+
+
+
+