OSDN Git Service

Add Redo feature
authorDennis Lim <dlkj@users.sourceforge.net>
Tue, 19 Jun 2001 14:57:08 +0000 (14:57 +0000)
committerDennis Lim <dlkj@users.sourceforge.net>
Tue, 19 Jun 2001 14:57:08 +0000 (14:57 +0000)
Fix Undo feature bug with grouping

Src/MergeDoc.cpp
Src/MergeDoc.h
Src/MergeEditView.cpp
Src/MergeEditView.h

index 696d831..85d35bb 100644 (file)
@@ -67,6 +67,7 @@ CMergeDoc::CMergeDoc() : m_ltBuf(this,TRUE), m_rtBuf(this,FALSE)
        m_nCurDiff=-1;
        m_strTempLeftFile=_T("");
        m_strTempRightFile=_T("");
+       curUndo = undoTgt.begin();
 }
 #pragma warning(default:4355)
 
@@ -1056,3 +1057,8 @@ void CMergeDoc::OnUpdateStatusNum(CCmdUI* pCmdUI)
        }
        pCmdUI->SetText(s);
 }
+
+bool CMergeDoc::CDiffTextBuffer::lastUndoGroup()
+{
+       return m_aUndoBuf[m_aUndoBuf.GetSize()-1].m_dwFlags & UNDO_BEGINGROUP;
+}
index 2e302ef..823bba8 100644 (file)
@@ -30,7 +30,7 @@
 
 #include "afxtempl.h"
 #include "CCrystalTextBuffer.h"
-#include <stack>
+#include <vector>
 
 #define OP_NONE                        0
 #define OP_LEFTONLY            1
@@ -69,6 +69,7 @@ private :
         CMergeDoc * m_pOwnerDoc;
                BOOL m_bIsLeft;
 public :
+             bool lastUndoGroup();
              void DeleteLine(int nLine);
              void ReplaceLine(int nLine, const CString& strText);
                BOOL SaveToFile (LPCTSTR pszFileName, 
@@ -151,7 +152,8 @@ public:
 
 // Implementation
 public:
-       std::stack<CMergeEditView*> undoTgt;
+       std::vector<CMergeEditView*> undoTgt;
+       std::vector<CMergeEditView*>::iterator curUndo;
        void FlushAndRescan();
        BOOL TempFilesExist();
        void CleanupTempFiles();
index 5ac3bc3..833e383 100644 (file)
@@ -60,6 +60,8 @@ BEGIN_MESSAGE_MAP(CMergeEditView, CCrystalEditViewEx)
        ON_COMMAND(ID_R2L, OnR2l)
        ON_UPDATE_COMMAND_UI(ID_R2L, OnUpdateR2l)
        ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
+       ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
+       ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
        //}}AFX_MSG_MAP
 END_MESSAGE_MAP()
 
@@ -564,11 +566,11 @@ void CMergeEditView::OnUpdateEditPaste(CCmdUI* pCmdUI)
 void CMergeEditView::OnEditUndo() 
 {
        CMergeDoc* pDoc = GetDocument();
-       CMergeEditView *tgt = pDoc->undoTgt.top();
+       CMergeEditView *tgt = *(pDoc->curUndo-1);
        if(tgt==this)
        {
                CCrystalEditViewEx::OnEditUndo();
-               pDoc->undoTgt.pop();
+               --pDoc->curUndo;
                pDoc->FlushAndRescan();
        }
        else
@@ -580,7 +582,8 @@ void CMergeEditView::OnEditUndo()
 
 void CMergeEditView::OnUpdateEditUndo(CCmdUI* pCmdUI) 
 {
-       pCmdUI->Enable(GetDocument()->undoTgt.empty()==false);
+       CMergeDoc* pDoc = GetDocument();
+       pCmdUI->Enable(pDoc->curUndo!=pDoc->undoTgt.begin());
 }
 
 void CMergeEditView::OnFirstdiff() 
@@ -810,6 +813,16 @@ void CMergeEditView::OnUpdateAllRight(CCmdUI* pCmdUI)
 
 void CMergeEditView::OnEditOperation(int nAction, LPCTSTR pszText)
 {
+       CMergeDoc* pDoc = GetDocument();
+
+       // simple hook for multiplex undo operations
+       if(dynamic_cast<CMergeDoc::CDiffTextBuffer*>(m_pTextBuffer)->lastUndoGroup())
+       {
+               pDoc->undoTgt.erase(pDoc->curUndo, pDoc->undoTgt.end());
+               pDoc->undoTgt.push_back(this);
+               pDoc->curUndo = pDoc->undoTgt.end();
+       }
+       
        // perform original function
        CCrystalEditViewEx::OnEditOperation(nAction, pszText);
 
@@ -821,7 +834,28 @@ void CMergeEditView::OnEditOperation(int nAction, LPCTSTR pszText)
        m_pTextBuffer->SetLineFlag(ptCursorPos.y, LF_WINMERGE_FLAGS, FALSE, FALSE, FALSE);
 
        // keep document up to date
-       GetDocument()->FlushAndRescan();
-       GetDocument()->undoTgt.push(this);
+       pDoc->FlushAndRescan();
+}
+
+
+void CMergeEditView::OnEditRedo() 
+{
+       CMergeDoc* pDoc = GetDocument();
+       CMergeEditView *tgt = *(pDoc->curUndo);
+       if(tgt==this)
+       {
+               CCrystalEditViewEx::OnEditRedo();
+               ++pDoc->curUndo;
+               pDoc->FlushAndRescan();
+       }
+       else
+       {
+               tgt->SendMessage(WM_COMMAND, ID_EDIT_REDO);
+       }
 }
 
+void CMergeEditView::OnUpdateEditRedo(CCmdUI* pCmdUI) 
+{
+       CMergeDoc* pDoc = GetDocument();
+       pCmdUI->Enable(pDoc->curUndo!=pDoc->undoTgt.end());
+}
index 0e6039c..2d94e05 100644 (file)
@@ -103,6 +103,8 @@ protected:
        afx_msg void OnR2l();
        afx_msg void OnUpdateR2l(CCmdUI* pCmdUI);
        afx_msg void OnUpdateEditUndo(CCmdUI* pCmdUI);
+       afx_msg void OnEditRedo();
+       afx_msg void OnUpdateEditRedo(CCmdUI* pCmdUI);
        //}}AFX_MSG
        DECLARE_MESSAGE_MAP()
 };