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;
}
}
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);
{
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 )
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;
+}