]> git.saurik.com Git - wxWidgets.git/commitdiff
wxCommandProcessor::MarkAsSaved() and IsDirty() added (modified patch 1062556)
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 19 Feb 2005 16:52:08 +0000 (16:52 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 19 Feb 2005 16:52:08 +0000 (16:52 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32192 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
docs/latex/wx/cmdproc.tex
include/wx/cmdproc.h
src/common/cmdproc.cpp

index 6f30ee88300b1839893b5655359b2b2056e262eb..2d49150533520e6936a36f2f30360feb1304eb34 100644 (file)
@@ -52,6 +52,7 @@ All:
   mouse clicks and left mouse click for starting a drag operation.
 - "Alt" key (VK_MENU) now results in WXK_ALT keyboard event, not WXK_MENU
 - wxFFile::ReadAll() now takes an optional wxMBConv parameter
+- wxCommandProcessor::MarkAsSaved() and IsDirty() added (Angela Wrobel)
 
 
 All (GUI):
index 41dd71b4cd6b26ac084aa9e245d70f73f7ff405b..515dd432786041024bb6fff62b9dd983c55a0bd3 100644 (file)
@@ -18,6 +18,7 @@ if you want different behaviour.
 
 \latexignore{\rtfignore{\wxheading{Members}}}
 
+
 \membersection{wxCommandProcessor::wxCommandProcessor}\label{wxcommandprocessorctor}
 
 \func{}{wxCommandProcessor}{\param{int}{ maxCommands = $-1$}}
@@ -28,72 +29,84 @@ Constructor.
 commands stored to it, otherwise (and by default) the list of commands can grow
 arbitrarily.
 
+
 \membersection{wxCommandProcessor::\destruct{wxCommandProcessor}}\label{wxcommandprocessordtor}
 
 \func{}{\destruct{wxCommandProcessor}}{\void}
 
 Destructor.
 
+
 \membersection{wxCommandProcessor::CanUndo}\label{wxcommandprocessorcanundo}
 
 \func{virtual bool}{CanUndo}{\void}
 
 Returns true if the currently-active command can be undone, false otherwise.
 
+
 \membersection{wxCommandProcessor::ClearCommands}\label{wxcommandprocessorclearcommands}
 
 \func{virtual void}{ClearCommands}{\void}
 
 Deletes all the commands in the list and sets the current command pointer to NULL.
 
+
 \membersection{wxCommandProcessor::Redo}\label{wxcommandprocessorredo}
 
 \func{virtual bool}{Redo}{\void}
 
 Executes (redoes) the current command (the command that has just been undone if any).
 
+
 \membersection{wxCommandProcessor::GetCommands}\label{wxcommandprocessorgetcommands}
 
 \constfunc{wxList\&}{GetCommands}{\void}
 
 Returns the list of commands.
 
+
 \membersection{wxCommandProcessor::GetMaxCommands}\label{wxcommandprocessorgetmaxcommands}
 
 \constfunc{int}{GetMaxCommands}{\void}
 
 Returns the maximum number of commands that the command processor stores.
 
+
 \membersection{wxCommandProcessor::GetEditMenu}\label{wxcommandprocessorgeteditmenu}
 
 \constfunc{wxMenu*}{GetEditMenu}{\void}
 
 Returns the edit menu associated with the command processor.
 
+
 \membersection{wxCommandProcessor::GetRedoAccelerator}\label{wxcommandprocessorgetredoaccelerator}
 
 \constfunc{const wxString\&}{GetRedoAccelerator}{\void}
 
 Returns the string that will be appended to the Redo menu item.
 
+
 \membersection{wxCommandProcessor::GetRedoMenuLabel}\label{wxcommandprocessorgetredomenulabel}
 
 \constfunc{wxString}{GetRedoMenuLabel}{\void}
 
 Returns the string that will be shown for the redo menu item.
 
+
 \membersection{wxCommandProcessor::GetUndoAccelerator}\label{wxcommandprocessorgetundoaccelerator}
 
 \constfunc{const wxString\&}{GetUndoAccelerator}{\void}
 
 Returns the string that will be appended to the Undo menu item.
 
+
 \membersection{wxCommandProcessor::GetUndoMenuLabel}\label{wxcommandprocessorgetundomenulabel}
 
 \constfunc{wxString}{GetUndoMenuLabel}{\void}
 
 Returns the string that will be shown for the undo menu item.
 
+
 \membersection{wxCommandProcessor::Initialize}\label{wxcommandprocessorinitialize}
 
 \func{virtual void}{Initialize}{\void}
@@ -102,6 +115,25 @@ Initializes the command processor, setting the current command to the
 last in the list (if any), and updating the edit menu (if one has been
 specified).
 
+
+\membersection{wxCommandProcessor::IsDirty}\label{wxcommandprocessorisdirty}
+
+\func{virtual bool}{IsDirty}{\void}
+
+Returns a boolean value that indicates if changes have been made since
+the last save operation. This only works if 
+\helpref{wxCommandProcessor::MarkAsSaved}{wxcommandprocessormarkassaved}
+is called whenever the project is saved.
+
+
+\membersection{wxCommandProcessor::MarkAsSaved}\label{wxcommandprocessormarkassaved}
+
+\func{virtual void}{MarkAsSaved}{\void}
+
+You must call this method whenever the project is saved if you plan to use 
+\helpref{wxCommandProcessor::IsDirty}{wxcommandprocessorisdirty}.
+
+
 \membersection{wxCommandProcessor::SetEditMenu}\label{wxcommandprocessorseteditmenu}
 
 \func{void}{SetEditMenu}{\param{wxMenu* }{menu}}
@@ -111,6 +143,7 @@ menu as appropriate. Set this to NULL if the menu is about to be
 destroyed and command operations may still be performed, or the command
 processor may try to access an invalid pointer.
 
+
 \membersection{wxCommandProcessor::SetMenuStrings}\label{wxcommandprocessorsetmenustrings}
 
 \func{void}{SetMenuStrings}{\void}
@@ -118,18 +151,21 @@ processor may try to access an invalid pointer.
 Sets the menu labels according to the currently set menu and the current
 command state.
 
+
 \membersection{wxCommandProcessor::SetRedoAccelerator}\label{wxcommandprocessorsetredoaccelerator}
 
 \func{void}{SetRedoAccelerator}{\param{const wxString\&}{accel}}
 
 Sets the string that will be appended to the Redo menu item.
 
+
 \membersection{wxCommandProcessor::SetUndoAccelerator}\label{wxcommandprocessorsetundoaccelerator}
 
 \func{void}{SetUndoAccelerator}{\param{const wxString\&}{accel}}
 
 Sets the string that will be appended to the Undo menu item.
 
+
 \membersection{wxCommandProcessor::Submit}\label{wxcommandprocessorsubmit}
 
 \func{virtual bool}{Submit}{\param{wxCommand *}{command}, \param{bool}{ storeIt = true}}
@@ -144,6 +180,7 @@ be deleted directly by the application.
 {\it storeIt} indicates whether the successful command should be stored
 in the history list.
 
+
 \membersection{wxCommandProcessor::Undo}\label{wxcommandprocessorundo}
 
 \func{virtual bool}{Undo}{\void}
index 4ea73af904449493b962eb4f0dcc254170fa08c3..ace9465d26bcda9cf13e747492fa9a83f63e67fb 100644 (file)
@@ -99,6 +99,19 @@ public:
     int GetMaxCommands() const { return m_maxNoCommands; }
     virtual void ClearCommands();
 
+    // Has the current project been changed?
+    virtual bool IsDirty() const
+    {
+        return m_currentCommand && (m_lastSavedCommand != m_currentCommand);
+    }
+
+    // Mark the current command as the one where the last save took place
+    void MarkAsSaved()
+    {
+        m_lastSavedCommand = m_currentCommand;
+    }
+
+
     // By default, the accelerators are "\tCtrl+Z" and "\tCtrl+Y"
     const wxString& GetUndoAccelerator() const { return m_undoAccelerator; }
     const wxString& GetRedoAccelerator() const { return m_redoAccelerator; }
@@ -115,7 +128,8 @@ protected:
 
     int           m_maxNoCommands;
     wxList        m_commands;
-    wxList::compatibility_iterator m_currentCommand;
+    wxList::compatibility_iterator m_currentCommand,
+                                   m_lastSavedCommand;
 
 #if wxUSE_MENUS
     wxMenu*       m_commandEditMenu;
@@ -130,3 +144,4 @@ private:
 };
 
 #endif // _WX_CMDPROC_H_
+
index df71ab8148c954b101825b7cbbb632e88f32f86d..b5029c54bc120e2ae59f81a8c27b2cd4700780bf 100644 (file)
@@ -65,9 +65,9 @@ wxCommandProcessor::wxCommandProcessor(int maxCommands)
 #endif // wxUSE_MENUS
     m_undoAccelerator = wxT("\tCtrl+Z");
     m_redoAccelerator = wxT("\tCtrl+Y");
-#if !wxUSE_STL
-    m_currentCommand = NULL;
-#endif
+
+    m_lastSavedCommand =
+    m_currentCommand = wxList::compatibility_iterator();
 }
 
 wxCommandProcessor::~wxCommandProcessor()
@@ -118,6 +118,10 @@ void wxCommandProcessor::Store(wxCommand *command)
         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 )
+            m_lastSavedCommand = wxList::compatibility_iterator();
     }
 
     // Correct a bug: we must chop off the current 'branch'
@@ -132,6 +136,11 @@ void wxCommandProcessor::Store(wxCommand *command)
             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 )
+                m_lastSavedCommand = wxList::compatibility_iterator();
+
             node = next;
         }
     }
@@ -312,7 +321,9 @@ void wxCommandProcessor::ClearCommands()
         m_commands.Erase(node);
         node = m_commands.GetFirst();
     }
+
     m_currentCommand = wxList::compatibility_iterator();
+    m_lastSavedCommand = wxList::compatibility_iterator();
 }