#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