Code

Merge and cleanup of GSoC C++-ification project.
[inkscape.git] / src / document-undo.cpp
index 2acd740f2022b5e45216d38b1443fc71bf349818..1559dc5ba6cb10945fcb6ddc8aa37d00c37441c3 100644 (file)
@@ -1,11 +1,10 @@
-#define __SP_DOCUMENT_UNDO_C__
-
 /** \file
  * Undo/Redo stack implementation
  *
  * Authors:
  *   Lauris Kaplinski <lauris@kaplinski.com>
  *   MenTaLguY <mental@rydia.net>
+ *   Abhishek Sharma
  *
  * Copyright (C) 2007  MenTaLguY <mental@rydia.net>
  * Copyright (C) 1999-2003 authors
@@ -23,8 +22,8 @@
  * stack. Two methods exist to indicate that the given action is completed:
  *
  * \verbatim
-   void sp_document_done (SPDocument *document);
-   void sp_document_maybe_done (SPDocument *document, const unsigned char *key) \endverbatim
+   void sp_document_done( SPDocument *document );
+   void sp_document_maybe_done( SPDocument *document, const unsigned char *key ) \endverbatim
  *
  * Both move the recent action list into the undo stack and clear the
  * list afterwards.  While the first method does an unconditional push,
 #if HAVE_STDLIB_H
 #endif
 
+#include <string>
+#include <cstring>
 #include "xml/repr.h"
 #include "document-private.h"
 #include "inkscape.h"
+#include "document-undo.h"
 #include "debug/event-tracker.h"
 #include "debug/simple-event.h"
 #include "debug/timestamp.h"
 #include "event.h"
 
-bool SPDocument::isModified() const {
-    return rroot ? rroot->attribute("sodipodi:modified") != NULL : false;
-}
-void SPDocument::setModified(bool modified) {
-    if (rroot) {
-        rroot->setAttribute("sodipodi:modified", "true");
-    }
-}
-
 
 /*
  * Undo & redo
  */
-/**
- * Set undo sensitivity.
- *
- * \note
- *   Since undo sensitivity needs to be nested, setting undo sensitivity
- *   should be done like this:
- *\verbatim
-        bool saved = sp_document_get_undo_sensitive(document);
-        sp_document_set_undo_sensitive(document, false);
-        ... do stuff ...
-        sp_document_set_undo_sensitive(document, saved);  \endverbatim
- */
-void
-sp_document_set_undo_sensitive (SPDocument *doc, bool sensitive)
+
+void Inkscape::DocumentUndo::setUndoSensitive(SPDocument *doc, bool sensitive)
 {
        g_assert (doc != NULL);
        g_assert (doc->priv != NULL);
@@ -119,24 +100,22 @@ sp_document_set_undo_sensitive (SPDocument *doc, bool sensitive)
  * the saved bools in a stack.  Perhaps this is why the above solution is better.
  */
 
-bool sp_document_get_undo_sensitive(SPDocument const *document) {
+bool Inkscape::DocumentUndo::getUndoSensitive(SPDocument const *document) {
        g_assert(document != NULL);
        g_assert(document->priv != NULL);
 
        return document->priv->sensitive;
 }
 
-void
-sp_document_done (SPDocument *doc, const unsigned int event_type, Glib::ustring event_description)
+void Inkscape::DocumentUndo::done(SPDocument *doc, const unsigned int event_type, Glib::ustring const &event_description)
 {
-        sp_document_maybe_done (doc, NULL, event_type, event_description);
+    maybeDone(doc, NULL, event_type, event_description);
 }
 
-void
-sp_document_reset_key (Inkscape::Application */*inkscape*/, SPDesktop */*desktop*/, GtkObject *base)
+void Inkscape::DocumentUndo::resetKey( Inkscape::Application * /*inkscape*/, SPDesktop * /*desktop*/, GtkObject *base )
 {
-    SPDocument *doc = (SPDocument *) base;
-    doc->actionkey = NULL;
+    SPDocument *doc = reinterpret_cast<SPDocument *>(base);
+    doc->actionkey.clear();
 }
 
 namespace {
@@ -171,21 +150,23 @@ public:
 
 }
 
-void
-sp_document_maybe_done (SPDocument *doc, const gchar *key, const unsigned int event_type,
-                        Glib::ustring event_description)
+void Inkscape::DocumentUndo::maybeDone(SPDocument *doc, const gchar *key, const unsigned int event_type,
+                                       Glib::ustring const &event_description)
 {
        g_assert (doc != NULL);
        g_assert (doc->priv != NULL);
        g_assert (doc->priv->sensitive);
+        if ( key && !*key ) {
+            g_warning("Blank undo key specified.");
+        }
 
         Inkscape::Debug::EventTracker<CommitEvent> tracker(doc, key, event_type);
 
        doc->collectOrphans();
 
-       sp_document_ensure_up_to_date (doc);
+       doc->ensureUpToDate();
 
-       sp_document_clear_redo (doc);
+       DocumentUndo::clearRedo(doc);
 
        Inkscape::XML::Event *log = sp_repr_coalesce_log (doc->priv->partial, sp_repr_commit_undoable (doc->rdoc));
        doc->priv->partial = NULL;
@@ -195,7 +176,7 @@ sp_document_maybe_done (SPDocument *doc, const gchar *key, const unsigned int ev
                return;
        }
 
-       if (key && doc->actionkey && !strcmp (key, doc->actionkey) && doc->priv->undo) {
+       if (key && !doc->actionkey.empty() && (doc->actionkey == key) && doc->priv->undo) {
                 ((Inkscape::Event *)doc->priv->undo->data)->event =
                     sp_repr_coalesce_log (((Inkscape::Event *)doc->priv->undo->data)->event, log);
        } else {
@@ -205,18 +186,21 @@ sp_document_maybe_done (SPDocument *doc, const gchar *key, const unsigned int ev
                doc->priv->undoStackObservers.notifyUndoCommitEvent(event);
        }
 
-       doc->actionkey = key;
+        if ( key ) {
+            doc->actionkey = key;
+        } else {
+            doc->actionkey.clear();
+        }
 
        doc->virgin = FALSE;
-        doc->setModified();
+        doc->setModifiedSinceSave();
 
        sp_repr_begin_transaction (doc->rdoc);
 
   doc->priv->commit_signal.emit();
 }
 
-void
-sp_document_cancel (SPDocument *doc)
+void Inkscape::DocumentUndo::cancel(SPDocument *doc)
 {
        g_assert (doc != NULL);
        g_assert (doc->priv != NULL);
@@ -247,8 +231,7 @@ static void finish_incomplete_transaction(SPDocument &doc) {
        }
 }
 
-gboolean
-sp_document_undo (SPDocument *doc)
+gboolean Inkscape::DocumentUndo::undo(SPDocument *doc)
 {
        using Inkscape::Debug::EventTracker;
        using Inkscape::Debug::SimpleEvent;
@@ -264,7 +247,7 @@ sp_document_undo (SPDocument *doc)
        doc->priv->sensitive = FALSE;
         doc->priv->seeking = true;
 
-       doc->actionkey = NULL;
+       doc->actionkey.clear();
 
        finish_incomplete_transaction(*doc);
 
@@ -274,7 +257,7 @@ sp_document_undo (SPDocument *doc)
                sp_repr_undo_log (log->event);
                doc->priv->redo = g_slist_prepend (doc->priv->redo, log);
 
-                doc->setModified();
+                doc->setModifiedSinceSave();
                 doc->priv->undoStackObservers.notifyUndoEvent(log);
 
                ret = TRUE;
@@ -293,8 +276,7 @@ sp_document_undo (SPDocument *doc)
        return ret;
 }
 
-gboolean
-sp_document_redo (SPDocument *doc)
+gboolean Inkscape::DocumentUndo::redo(SPDocument *doc)
 {
        using Inkscape::Debug::EventTracker;
        using Inkscape::Debug::SimpleEvent;
@@ -310,7 +292,7 @@ sp_document_redo (SPDocument *doc)
        doc->priv->sensitive = FALSE;
         doc->priv->seeking = true;
 
-       doc->actionkey = NULL;
+       doc->actionkey.clear();
 
        finish_incomplete_transaction(*doc);
 
@@ -320,7 +302,7 @@ sp_document_redo (SPDocument *doc)
                sp_repr_replay_log (log->event);
                doc->priv->undo = g_slist_prepend (doc->priv->undo, log);
 
-                doc->setModified();
+                doc->setModifiedSinceSave();
                doc->priv->undoStackObservers.notifyRedoEvent(log);
 
                ret = TRUE;
@@ -339,8 +321,7 @@ sp_document_redo (SPDocument *doc)
        return ret;
 }
 
-void
-sp_document_clear_undo (SPDocument *doc)
+void Inkscape::DocumentUndo::clearUndo(SPDocument *doc)
 {
         if (doc->priv->undo)
                 doc->priv->undoStackObservers.notifyClearUndoEvent();
@@ -357,8 +338,7 @@ sp_document_clear_undo (SPDocument *doc)
        }
 }
 
-void
-sp_document_clear_redo (SPDocument *doc)
+void Inkscape::DocumentUndo::clearRedo(SPDocument *doc)
 {
         if (doc->priv->redo)
                 doc->priv->undoStackObservers.notifyClearRedoEvent();