]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/cmdproc.cpp
Applied #15375 to stop event-sending in generic wxSpinCtrl ctor (eco)
[wxWidgets.git] / src / common / cmdproc.cpp
index 3d3d024abf2026c5e8c9b878ea5b1483747f11a0..54f14ea028446f14ba9b36f0f47426e389b55466 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Julian Smart (extracted from docview.h by VZ)
 // Modified by:
 // Created:     05.11.00
-// RCS-ID:      $Id$
 // Copyright:   (c) wxWidgets team
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
@@ -122,13 +121,14 @@ void wxCommandProcessor::Store(wxCommand *command)
         while (node)
         {
             wxList::compatibility_iterator next = node->GetNext();
-            delete (wxCommand *)node->GetData();
-            m_commands.Erase(node);
 
             // Make sure m_lastSavedCommand won't point to freed memory
-            if ( m_lastSavedCommand == node )
+            if ( m_lastSavedCommand && m_lastSavedCommand == node )
                 m_lastSavedCommand = wxList::compatibility_iterator();
 
+            delete (wxCommand *)node->GetData();
+            m_commands.Erase(node);
+
             node = next;
         }
     }
@@ -136,13 +136,14 @@ void wxCommandProcessor::Store(wxCommand *command)
     if ( (int)m_commands.GetCount() == m_maxNoCommands )
     {
         wxList::compatibility_iterator firstNode = m_commands.GetFirst();
-        wxCommand *firstCommand = (wxCommand *)firstNode->GetData();
-        delete firstCommand;
-        m_commands.Erase(firstNode);
 
         // Make sure m_lastSavedCommand won't point to freed memory
-        if ( m_lastSavedCommand == firstNode )
+        if ( m_lastSavedCommand && m_lastSavedCommand == firstNode )
             m_lastSavedCommand = wxList::compatibility_iterator();
+
+        wxCommand *firstCommand = (wxCommand *)firstNode->GetData();
+        delete firstCommand;
+        m_commands.Erase(firstNode);
     }
 
     m_commands.Append(command);
@@ -170,9 +171,9 @@ bool wxCommandProcessor::Redo()
 {
     wxCommand *redoCommand = NULL;
     wxList::compatibility_iterator redoNode
-#if !wxUSE_STL
+#if !wxUSE_STD_CONTAINERS
         = NULL          // just to avoid warnings
-#endif // !wxUSE_STL
+#endif // !wxUSE_STD_CONTAINERS
         ;
 
     if ( m_currentCommand )
@@ -326,4 +327,28 @@ void wxCommandProcessor::ClearCommands()
     m_lastSavedCommand = wxList::compatibility_iterator();
 }
 
+bool wxCommandProcessor::IsDirty() const
+{
+    if ( m_commands.empty() )
+    {
+        // If we have never been modified, we can't be dirty.
+        return false;
+    }
+
+    if ( !m_lastSavedCommand )
+    {
+        // If we have been modified but have never been saved, we're dirty.
+        return true;
+    }
+
+    if ( !m_currentCommand )
+    {
+        // This only happens if all commands were undone after saving the
+        // document: we're dirty then.
+        return true;
+    }
+
+    // Finally if both iterators are valid, we may just compare them.
+    return m_currentCommand != m_lastSavedCommand;
+}