Undo in a multiline edit control
I wish to create a simple Notepad like text editor
based on a multiline edit control.
So I create a new (say MDI) project in VC++
(if it matters, VC++ 6.0) using a CEditView
derived class. All goes well, the only thing
I don't like is the poor undo feature. If the
undo action returns the text to it's original
state, I would like to mark it as clean.
I know, in a multiline edit control there is
no undo over several steps, but only for one
step. Opening some file, typing some letters
(say "abc") and then typing Ctrl+Z several times
just toggles the "abc". But that is just OK.
However when I start typing, in CEditView::OnEditChange
the document is marked as modified. When typing
the first Ctrl+Z the documents text is in it's original
state, but of course the document keeps marked
modified. I would like to improve this.
My first attempt was to hold an additional flag
m_bModifiedPrev, which is set in the overridden
SetModifiedFlag function
void CMyEditDoc::SetModifiedFlag(BOOL bModified)
{
if (bModified)
m_bModifiedPrev = IsModified();
else
m_bModifiedPrev = FALSE;
CDocument::SetModifiedFlag(bModified)
}
BOOL CMyEditDoc::IsModifiedPrev()
{
return m_bModifiedPrev;
}
void CMyEditView::OnEditUndo()
{
BOOL bIsModifiedPrev = GetDocument()->IsModifiedPrev();
CEditView::OnEditUndo();
if (!bIsModifiedPrev)
{
GetDocument()->SetModifiedFlag(FALSE);
EmptyUndoBuffer();
}
}
This works fine, if I only type one letter ("a") and then
Ctrl+Z. In OnEditUndo() bIsModifiedPrev ist set to FALSE
and the document is marked as clean.
But if I type three letters "abc" and then Ctrl+Z, then
SetModifiedFlag() is called three times (in the EN_CHANGE
handler) and therefore in OnEditUndo() bIsModifiedPrev is
set to TRUE. On the other hand after typing Ctrl+Z the
letters "abc" are all gone, not just the "c". So my approach
seems to be wrong.
Now if I open some file in this text editor, type "abc",
move the cursor to another line and type "def", then the
Ctrl+Z just toggles the "def". Is there an easy way to get
the information, what the undo action will do? I only find
CEdit::CanUndo, CEdit::EmptyUndoBuffer, but nothing like
CEdit::GetUndoBuffer or the like.
I know that I can implement some real history feature
by other means, but that's not what I'm asking for here.