Initial commit
[fillmore] / src / marina / marina / UndoManager.c
diff --git a/src/marina/marina/UndoManager.c b/src/marina/marina/UndoManager.c
new file mode 100644 (file)
index 0000000..e692b6f
--- /dev/null
@@ -0,0 +1,586 @@
+/* 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);
+       }
+}
+
+
+
+