Code

Merge and cleanup of GSoC C++-ification project.
[inkscape.git] / src / document-undo.cpp
index 280eea24317f6d2802bbbbd5a07fd6adaa2cf79a..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,
@@ -63,7 +62,7 @@
 #include "xml/repr.h"
 #include "document-private.h"
 #include "inkscape.h"
-//#include "document-undo.h"
+#include "document-undo.h"
 #include "debug/event-tracker.h"
 #include "debug/simple-event.h"
 #include "debug/timestamp.h"
 /*
  * 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
-SPDocumentUndo::set_undo_sensitive (SPDocument *doc, bool sensitive)
+
+void Inkscape::DocumentUndo::setUndoSensitive(SPDocument *doc, bool sensitive)
 {
        g_assert (doc != NULL);
        g_assert (doc->priv != NULL);
@@ -113,24 +100,22 @@ SPDocumentUndo::set_undo_sensitive (SPDocument *doc, bool sensitive)
  * the saved bools in a stack.  Perhaps this is why the above solution is better.
  */
 
-bool SPDocumentUndo::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
-SPDocumentUndo::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)
 {
-        maybe_done (doc, NULL, event_type, event_description);
+    maybeDone(doc, NULL, event_type, event_description);
 }
 
-void
-SPDocumentUndo::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 {
@@ -165,21 +150,23 @@ public:
 
 }
 
-void
-SPDocumentUndo::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();
 
-       doc->ensure_up_to_date ();
+       doc->ensureUpToDate();
 
-       SPDocumentUndo::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;
@@ -189,7 +176,7 @@ SPDocumentUndo::maybe_done (SPDocument *doc, const gchar *key, const unsigned in
                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 {
@@ -199,7 +186,11 @@ SPDocumentUndo::maybe_done (SPDocument *doc, const gchar *key, const unsigned in
                doc->priv->undoStackObservers.notifyUndoCommitEvent(event);
        }
 
-       doc->actionkey = key;
+        if ( key ) {
+            doc->actionkey = key;
+        } else {
+            doc->actionkey.clear();
+        }
 
        doc->virgin = FALSE;
         doc->setModifiedSinceSave();
@@ -209,8 +200,7 @@ SPDocumentUndo::maybe_done (SPDocument *doc, const gchar *key, const unsigned in
   doc->priv->commit_signal.emit();
 }
 
-void
-SPDocumentUndo::cancel (SPDocument *doc)
+void Inkscape::DocumentUndo::cancel(SPDocument *doc)
 {
        g_assert (doc != NULL);
        g_assert (doc->priv != NULL);
@@ -241,8 +231,7 @@ static void finish_incomplete_transaction(SPDocument &doc) {
        }
 }
 
-gboolean
-SPDocumentUndo::undo (SPDocument *doc)
+gboolean Inkscape::DocumentUndo::undo(SPDocument *doc)
 {
        using Inkscape::Debug::EventTracker;
        using Inkscape::Debug::SimpleEvent;
@@ -258,7 +247,7 @@ SPDocumentUndo::undo (SPDocument *doc)
        doc->priv->sensitive = FALSE;
         doc->priv->seeking = true;
 
-       doc->actionkey = NULL;
+       doc->actionkey.clear();
 
        finish_incomplete_transaction(*doc);
 
@@ -287,8 +276,7 @@ SPDocumentUndo::undo (SPDocument *doc)
        return ret;
 }
 
-gboolean
-SPDocumentUndo::redo (SPDocument *doc)
+gboolean Inkscape::DocumentUndo::redo(SPDocument *doc)
 {
        using Inkscape::Debug::EventTracker;
        using Inkscape::Debug::SimpleEvent;
@@ -304,7 +292,7 @@ SPDocumentUndo::redo (SPDocument *doc)
        doc->priv->sensitive = FALSE;
         doc->priv->seeking = true;
 
-       doc->actionkey = NULL;
+       doc->actionkey.clear();
 
        finish_incomplete_transaction(*doc);
 
@@ -333,8 +321,7 @@ SPDocumentUndo::redo (SPDocument *doc)
        return ret;
 }
 
-void
-SPDocumentUndo::clear_undo (SPDocument *doc)
+void Inkscape::DocumentUndo::clearUndo(SPDocument *doc)
 {
         if (doc->priv->undo)
                 doc->priv->undoStackObservers.notifyClearUndoEvent();
@@ -351,8 +338,7 @@ SPDocumentUndo::clear_undo (SPDocument *doc)
        }
 }
 
-void
-SPDocumentUndo::clear_redo (SPDocument *doc)
+void Inkscape::DocumentUndo::clearRedo(SPDocument *doc)
 {
         if (doc->priv->redo)
                 doc->priv->undoStackObservers.notifyClearRedoEvent();