#include "AutoPtr.h"\r
#include "Region.h"\r
#include "VarBuffer.h"\r
-#include "YAEditDoc.h"\r
#include "LineWrapper.h"\r
#include "LineWrapperImpl.h"\r
#include "YAEdit.h"\r
#include "LineManager.h"\r
#include "PhysicalLineManager.h"\r
#include "StringSplitter.h"\r
+#include "TString.h"\r
+#include "YAEditDoc.h"\r
\r
/////////////////////////////////////////////////////////////////////////////\r
// undo info\r
/////////////////////////////////////////////////////////////////////////////\r
\r
-UndoInfo::UndoInfo() : pPrevStr(NULL), pNewStr(NULL), bUndoApplied(FALSE)\r
+UndoInfo::UndoInfo() : bUndoApplied(FALSE), bOpenRegion(TRUE)\r
{\r
}\r
\r
\r
UndoInfo::~UndoInfo()\r
{\r
- delete[] pPrevStr;\r
-}\r
-\r
-BOOL UndoInfo::SetPrev(const Region *pRegion, LPTSTR p) {\r
- rPrevRegion = *pRegion;\r
- pPrevStr = p;\r
- return TRUE;\r
-}\r
-\r
-BOOL UndoInfo::SetNew(const Region *pRegion, LPTSTR p) {\r
- rNewRegion = *pRegion;\r
- pNewStr = p;\r
- return TRUE;\r
}\r
\r
BOOL UndoInfo::CmdUndo(YAEditDoc *pDoc) {\r
if (bUndoApplied) {\r
bUndoApplied = FALSE;\r
- return pDoc->ReplaceString(&rPrevRegion, pNewStr, TRUE);\r
+ return pDoc->ReplaceString(&rPrevRegion, sNewStr.Get(), TRUE);\r
} else {\r
bUndoApplied = TRUE;\r
- return pDoc->ReplaceString(&rNewRegion, pPrevStr, TRUE);\r
+ return pDoc->ReplaceString(&rNewRegion, sPrevStr.Get(), TRUE);\r
}\r
}\r
\r
+BOOL UndoInfo::UpdateUndoRegion(const Region *pPrevRegion, LPCTSTR pPrev, const Region *pNewRegion, LPCTSTR pNew) {\r
+ rPrevRegion = *pPrevRegion;\r
+ if (!sPrevStr.Set(pPrev)) return FALSE;\r
+// pPrevStr = pPrev;\r
+\r
+ rNewRegion = *pNewRegion;\r
+ return sNewStr.Set(pNew);\r
+}\r
+\r
/////////////////////////////////////////////////////////////////////////////\r
// ctor & dtor\r
/////////////////////////////////////////////////////////////////////////////\r
\r
DWORD nPhLinesBefore = pPhLineMgr->MaxLine();\r
\r
- // preserve string and region removed by this action.\r
- if (!bKeepUndo) {\r
- LPTSTR pPrevText = pPhLineMgr->GetRegionString(pDelRegion);\r
- pUndo->SetPrev(pDelRegion, pPrevText);\r
- }\r
+ LPTSTR pPrevText = pPhLineMgr->GetRegionString(pDelRegion);\r
\r
// delete region and insert string\r
Region rNewRegion;\r
return FALSE;\r
}\r
\r
+ // preserve string and region after replaced.\r
if (!bKeepUndo) {\r
- // preserve string and region after replaced.\r
- pUndo->SetNew(&rNewRegion, StringDup(pString));\r
+ if (!pUndo->UpdateUndoRegion(pDelRegion, pPrevText, &rNewRegion, pString)) {\r
+ return FALSE;\r
+ }\r
+ } else {\r
+ delete [] pPrevText;\r
}\r
\r
// notify to view\r
if (pUndo == NULL) return TRUE;\r
\r
BOOL bResult = pUndo->CmdUndo(this);\r
-// delete pUndo;\r
-// pUndo = NULL;\r
return bResult;\r
}\r
\r
////////////////////////////////////////////////////\r
// retrieve & set line \r
\r
+ // bKeepUndo is usualy set FALSE. Only undo operation set true.\r
+ // when the value is true, ReplaceString do not change UndoInfo value.\r
BOOL ReplaceString(const Region *pRegion, LPCTSTR pString, BOOL bKeepUndo = FALSE);\r
+\r
BOOL Undo();\r
\r
BOOL IsModify() { return bModified; }\r
#ifdef UNIT_TEST\r
public:\r
#endif\r
- LPTSTR pPrevStr;\r
+// LPTSTR pPrevStr;\r
+ TString sPrevStr;\r
Region rPrevRegion;\r
\r
- LPTSTR pNewStr;\r
+// LPTSTR pNewStr;\r
+ TString sNewStr;\r
Region rNewRegion;\r
\r
+ // true if this undo is applied. At creation time, this value is false and set true\r
+ // when YAEditDoc::Undo is called.\r
BOOL bUndoApplied;\r
\r
+ // Assume type 'a' and 'b', we expect remove 'ab' when undoing. If this value is ture, \r
+ // UndoInfo merge current changes and previous changes.\r
+ BOOL bOpenRegion;\r
public:\r
UndoInfo();\r
~UndoInfo();\r
\r
- BOOL SetPrev(const Region *pRegion, LPTSTR pPrevStr);\r
- BOOL SetNew(const Region *pRegion, LPTSTR pNewStr);\r
+ BOOL UpdateUndoRegion(const Region *pPrevRegion, LPCTSTR pPrevStr, \r
+ const Region *pNewRegion, LPCTSTR pNewStr);\r
+\r
BOOL CmdUndo(YAEditDoc *pDoc);\r
};\r
\r
\r
#include "VarBuffer.h"\r
#include "Region.h"\r
+#include "TString.h"\r
#include "YAEditDoc.h"\r
#include "PhysicalLineManager.h"\r
#include "MemManager.h"\r
Region rExpectedNew(1, 0, 4, 0);\r
ASSERT(pUndo->rPrevRegion == rExpectedPrev);\r
ASSERT(pUndo->rNewRegion == rExpectedNew);\r
- ASSERT(_tcscmp(pUndo->pPrevStr, TEXT("")) == 0);\r
- ASSERT(_tcscmp(pUndo->pNewStr, TEXT("bcd")) == 0);\r
+ ASSERT(_tcscmp(pUndo->sPrevStr.Get(), TEXT("")) == 0);\r
+ ASSERT(_tcscmp(pUndo->sNewStr.Get(), TEXT("bcd")) == 0);\r
\r
// Undo\r
bResult = pDoc->Undo();\r
ASSERT(pUndo->rPrevRegion == rExpectedPrev);\r
ASSERT(pUndo->rNewRegion == rExpectedNew);\r
\r
- ASSERT(_tcscmp(pUndo->pPrevStr, TEXT("cd")) == 0);\r
- ASSERT(_tcscmp(pUndo->pNewStr, TEXT("fgh")) == 0);\r
+ ASSERT(_tcscmp(pUndo->sPrevStr.Get(), TEXT("cd")) == 0);\r
+ ASSERT(_tcscmp(pUndo->sNewStr.Get(), TEXT("fgh")) == 0);\r
\r
\r
// Undo\r