diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index acc7bf0e3..ae4cbeda0 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -3201,6 +3201,10 @@ void Notepad_plus::docGotoAnotherEditView(FileTransferMode mode) bool Notepad_plus::activateBuffer(BufferID id, int whichOne) { //scnN.nmhdr.code = NPPN_DOCSWITCHINGOFF; //superseeded by NPPN_BUFFERACTIVATED + + // Before switching off, synchronize backup file + MainFileManager->backupCurrentBuffer(); + Buffer * pBuf = MainFileManager->getBufferByID(id); bool reload = pBuf->getNeedReload(); if (reload) @@ -4275,7 +4279,7 @@ void Notepad_plus::getCurrentOpenedFiles(Session & session) generic_string languageName = getLangFromMenu(buf); const TCHAR *langName = languageName.c_str(); - sessionFileInfo sfi(buf->getFullPathName(), langName, buf->getEncoding(), buf->getPosition(&_mainEditView)); + sessionFileInfo sfi(buf->getFullPathName(), langName, buf->getEncoding(), buf->getPosition(&_mainEditView), buf->getBackupFileName().c_str(), int(buf->getLastModifiedTimestamp())); //_mainEditView.activateBuffer(buf->getID()); _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument()); @@ -4319,7 +4323,7 @@ void Notepad_plus::getCurrentOpenedFiles(Session & session) generic_string languageName = getLangFromMenu( buf ); const TCHAR *langName = languageName.c_str(); - sessionFileInfo sfi(buf->getFullPathName(), langName, buf->getEncoding(), buf->getPosition(&_subEditView)); + sessionFileInfo sfi(buf->getFullPathName(), langName, buf->getEncoding(), buf->getPosition(&_subEditView), buf->getBackupFileName().c_str(), int(buf->getLastModifiedTimestamp())); _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument()); int maxLine = _invisibleEditView.execute(SCI_GETLINECOUNT); @@ -4503,8 +4507,8 @@ void Notepad_plus::notifyBufferChanged(Buffer * buffer, int mask) if (doCloseOrNot(buffer->getFullPathName()) == IDNO) { //close in both views, doing current view last since that has to remain opened - doClose(buffer->getID(), otherView()); - doClose(buffer->getID(), currentView()); + doClose(buffer->getID(), otherView(), true); + doClose(buffer->getID(), currentView(), true); } break; } @@ -5790,7 +5794,7 @@ DWORD WINAPI Notepad_plus::backupDocument(void *param) //static int i = 0; while (notepad_plus) { - ::Sleep(3000); + ::Sleep(7000); //printInt(i++); MainFileManager->backupCurrentBuffer(); diff --git a/PowerEditor/src/Notepad_plus.h b/PowerEditor/src/Notepad_plus.h index 3d05fccc4..9634c668e 100644 --- a/PowerEditor/src/Notepad_plus.h +++ b/PowerEditor/src/Notepad_plus.h @@ -223,7 +223,7 @@ public: BufferID doOpen(const TCHAR *fileName, bool isRecursive = false, bool isReadOnly = false, int encoding = -1); bool doReload(BufferID id, bool alert = true); bool doSave(BufferID, const TCHAR * filename, bool isSaveCopy = false); - void doClose(BufferID, int whichOne); + void doClose(BufferID, int whichOne, bool doDeleteBackup = false); //bool doDelete(const TCHAR *fileName) const {return ::DeleteFile(fileName) != 0;}; void fileOpen(); @@ -235,7 +235,7 @@ public: }; bool fileClose(BufferID id = BUFFER_INVALID, int curView = -1); //use curView to override view to close from - bool fileCloseAll(); + bool fileCloseAll(bool doDeleteBackup); bool fileCloseAllButCurrent(); bool fileCloseAllGiven(const std::vector &krvecBufferIndexes); bool fileCloseAllToLeft(); diff --git a/PowerEditor/src/Notepad_plus_Window.cpp b/PowerEditor/src/Notepad_plus_Window.cpp index 4d7a3dabd..304af9960 100644 --- a/PowerEditor/src/Notepad_plus_Window.cpp +++ b/PowerEditor/src/Notepad_plus_Window.cpp @@ -224,7 +224,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin } // Lauch backup task - //_notepad_plus_plus_core.launchDocumentBackupTask(); + _notepad_plus_plus_core.launchDocumentBackupTask(); } bool Notepad_plus_Window::isDlgsMsg(MSG *msg, bool unicodeSupported) const diff --git a/PowerEditor/src/NppBigSwitch.cpp b/PowerEditor/src/NppBigSwitch.cpp index 7ea491628..e83f6a5c0 100644 --- a/PowerEditor/src/NppBigSwitch.cpp +++ b/PowerEditor/src/NppBigSwitch.cpp @@ -1407,7 +1407,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa //Causing them to show on restart even though they are loaded by session _lastRecentFileList.setLock(true); //only lock when the session is remembered } - bool allClosed = fileCloseAll(); //try closing files before doing anything else + bool allClosed = fileCloseAll(false); //try closing files before doing anything else if (nppgui._rememberLastSession) { diff --git a/PowerEditor/src/NppCommands.cpp b/PowerEditor/src/NppCommands.cpp index a0345f918..f1c3ab7f6 100644 --- a/PowerEditor/src/NppCommands.cpp +++ b/PowerEditor/src/NppCommands.cpp @@ -117,7 +117,7 @@ void Notepad_plus::command(int id) break; case IDM_FILE_CLOSEALL: - fileCloseAll(); + fileCloseAll(true); checkDocState(); break; diff --git a/PowerEditor/src/NppIO.cpp b/PowerEditor/src/NppIO.cpp index 778601579..c77cefc10 100644 --- a/PowerEditor/src/NppIO.cpp +++ b/PowerEditor/src/NppIO.cpp @@ -333,13 +333,16 @@ bool Notepad_plus::doSave(BufferID id, const TCHAR * filename, bool isCopy) return res; } -void Notepad_plus::doClose(BufferID id, int whichOne) +void Notepad_plus::doClose(BufferID id, int whichOne, bool doDeleteBackup) { DocTabView *tabToClose = (whichOne == MAIN_VIEW)?&_mainDocTab:&_subDocTab; int i = tabToClose->getIndexByBuffer(id); if (i == -1) return; + if (doDeleteBackup) + MainFileManager->deleteCurrentBufferBackup(); + Buffer * buf = MainFileManager->getBufferByID(id); // Notify plugins that current file is about to be closed @@ -575,11 +578,11 @@ bool Notepad_plus::fileClose(BufferID id, int curView) viewToClose = curView; //first check amount of documents, we dont want the view to hide if we closed a secondary doc with primary being empty //int nrDocs = _pDocTab->nbItem(); - doClose(bufferID, viewToClose); + doClose(bufferID, viewToClose, true); return true; } -bool Notepad_plus::fileCloseAll() +bool Notepad_plus::fileCloseAll(bool doDeleteBackup) { //closes all documents, makes the current view the only one visible @@ -643,14 +646,14 @@ bool Notepad_plus::fileCloseAll() //Set active tab to the last one closed. activateBuffer(_pNonDocTab->getBufferByIndex(0), otherView()); for(int i = _pNonDocTab->nbItem() - 1; i >= 0; i--) { //close all from right to left - doClose(_pNonDocTab->getBufferByIndex(i), otherView()); + doClose(_pNonDocTab->getBufferByIndex(i), otherView(), doDeleteBackup); } //hideView(otherView()); } activateBuffer(_pDocTab->getBufferByIndex(0), currentView()); for(int i = _pDocTab->nbItem() - 1; i >= 0; i--) { //close all from right to left - doClose(_pDocTab->getBufferByIndex(i), currentView()); + doClose(_pDocTab->getBufferByIndex(i), currentView(), doDeleteBackup); } return true; } @@ -697,7 +700,7 @@ bool Notepad_plus::fileCloseAllGiven(const std::vector &krvecBufferIndexes) // Now we close. for(std::vector::const_iterator itIndex = krvecBufferIndexes.begin(); itIndex != itIndexesEnd; ++itIndex) { - doClose(_pDocTab->getBufferByIndex(*itIndex), currentView()); + doClose(_pDocTab->getBufferByIndex(*itIndex), currentView(), true); } return true; @@ -794,7 +797,7 @@ bool Notepad_plus::fileCloseAllButCurrent() //Set active tab to the last one closed. activateBuffer(_pNonDocTab->getBufferByIndex(0), otherView()); for(int i = _pNonDocTab->nbItem() - 1; i >= 0; i--) { //close all from right to left - doClose(_pNonDocTab->getBufferByIndex(i), otherView()); + doClose(_pNonDocTab->getBufferByIndex(i), otherView(), true); } //hideView(otherView()); } @@ -804,7 +807,7 @@ bool Notepad_plus::fileCloseAllButCurrent() if (i == active) { //dont close active index continue; } - doClose(_pDocTab->getBufferByIndex(i), currentView()); + doClose(_pDocTab->getBufferByIndex(i), currentView(), true); } return true; } @@ -1019,8 +1022,8 @@ bool Notepad_plus::fileDelete(BufferID id) MB_OK); return false; } - doClose(bufferID, MAIN_VIEW); - doClose(bufferID, SUB_VIEW); + doClose(bufferID, MAIN_VIEW, true); + doClose(bufferID, SUB_VIEW, true); return true; } return false; diff --git a/PowerEditor/src/NppNotification.cpp b/PowerEditor/src/NppNotification.cpp index 50a43c518..e5d1d2de6 100644 --- a/PowerEditor/src/NppNotification.cpp +++ b/PowerEditor/src/NppNotification.cpp @@ -109,12 +109,12 @@ BOOL Notepad_plus::notify(SCNotification *notification) } bool isDirty = notification->nmhdr.code == SCN_SAVEPOINTLEFT; buf->setDirty(isDirty); -/* + if (notification->nmhdr.code == SCN_SAVEPOINTREACHED) { MainFileManager->backupCurrentBuffer(); } -*/ + break; } @@ -234,7 +234,7 @@ BOOL Notepad_plus::notify(SCNotification *notification) int open = 1; if (isFromPrimary || isFromSecondary) open = notifyDocTab->nbItem(); - doClose(bufferToClose, iView); + doClose(bufferToClose, iView, true); //if (open == 1 && canHideView(iView)) // hideView(iView); break; @@ -277,12 +277,18 @@ BOOL Notepad_plus::notify(SCNotification *notification) _statusBar.setText((_pEditView->execute(SCI_GETOVERTYPE))?TEXT("OVR"):TEXT("INS"), STATUSBAR_TYPING_MODE); } } - else if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf()) + else if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf() && _activeView == SUB_VIEW) { + // Before switching off, synchronize backup file + MainFileManager->backupCurrentBuffer(); + // Switch off switchEditViewTo(MAIN_VIEW); } - else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf()) + else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf() && _activeView == MAIN_VIEW) { + // Before switching off, synchronize backup file + MainFileManager->backupCurrentBuffer(); + // Switch off switchEditViewTo(SUB_VIEW); } diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index 22ca1fb45..f607df74a 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -1628,7 +1628,6 @@ bool NppParameters::getSessionFromXmlTree(TiXmlDocument *pSessionDoc, Session *p if (!sessionRoot) return false; - TiXmlElement *actView = sessionRoot->ToElement(); size_t index; const TCHAR *str = actView->Attribute(TEXT("activeView"), (int *)&index); @@ -1637,126 +1636,81 @@ bool NppParameters::getSessionFromXmlTree(TiXmlDocument *pSessionDoc, Session *p (*ptrSession)._activeView = index; } - - TiXmlNode *mainviewRoot = sessionRoot->FirstChildElement(TEXT("mainView")); - if (mainviewRoot) + const size_t nbView = 2; + TiXmlNode *viewRoots[nbView]; + viewRoots[0] = sessionRoot->FirstChildElement(TEXT("mainView")); + viewRoots[1] = sessionRoot->FirstChildElement(TEXT("subView")); + for (size_t k = 0; k < nbView; ++k) { - TiXmlElement *actIndex = mainviewRoot->ToElement(); - str = actIndex->Attribute(TEXT("activeIndex"), (int *)&index); - if (str) + if (viewRoots[k]) { - (*ptrSession)._activeMainIndex = index; - } - for (TiXmlNode *childNode = mainviewRoot->FirstChildElement(TEXT("File")); - childNode ; - childNode = childNode->NextSibling(TEXT("File")) ) - { - const TCHAR *fileName = (childNode->ToElement())->Attribute(TEXT("filename")); - if (fileName) + TiXmlElement *actIndex = viewRoots[k]->ToElement(); + str = actIndex->Attribute(TEXT("activeIndex"), (int *)&index); + if (str) { - Position position; - (childNode->ToElement())->Attribute(TEXT("firstVisibleLine"), &position._firstVisibleLine); - (childNode->ToElement())->Attribute(TEXT("xOffset"), &position._xOffset); - (childNode->ToElement())->Attribute(TEXT("startPos"), &position._startPos); - (childNode->ToElement())->Attribute(TEXT("endPos"), &position._endPos); - (childNode->ToElement())->Attribute(TEXT("selMode"), &position._selMode); - (childNode->ToElement())->Attribute(TEXT("scrollWidth"), &position._scrollWidth); - - const TCHAR *langName; - langName = (childNode->ToElement())->Attribute(TEXT("lang")); - int encoding = -1; - const TCHAR *encStr = (childNode->ToElement())->Attribute(TEXT("encoding"), &encoding); - sessionFileInfo sfi(fileName, langName, encStr?encoding:-1, position); - - for (TiXmlNode *markNode = childNode->FirstChildElement(TEXT("Mark")); - markNode ; - markNode = markNode->NextSibling(TEXT("Mark"))) + if (k == 0) + (*ptrSession)._activeMainIndex = index; + else // k == 1 + (*ptrSession)._activeSubIndex = index; + } + for (TiXmlNode *childNode = viewRoots[k]->FirstChildElement(TEXT("File")); + childNode ; + childNode = childNode->NextSibling(TEXT("File")) ) + { + const TCHAR *fileName = (childNode->ToElement())->Attribute(TEXT("filename")); + if (fileName) { - int lineNumber; - const TCHAR *lineNumberStr = (markNode->ToElement())->Attribute(TEXT("line"), &lineNumber); - if (lineNumberStr) - { - sfi.marks.push_back(lineNumber); - } - } + Position position; + (childNode->ToElement())->Attribute(TEXT("firstVisibleLine"), &position._firstVisibleLine); + (childNode->ToElement())->Attribute(TEXT("xOffset"), &position._xOffset); + (childNode->ToElement())->Attribute(TEXT("startPos"), &position._startPos); + (childNode->ToElement())->Attribute(TEXT("endPos"), &position._endPos); + (childNode->ToElement())->Attribute(TEXT("selMode"), &position._selMode); + (childNode->ToElement())->Attribute(TEXT("scrollWidth"), &position._scrollWidth); - for (TiXmlNode *foldNode = childNode->FirstChildElement(TEXT("Fold")); - foldNode ; - foldNode = foldNode->NextSibling(TEXT("Fold"))) - { - int lineNumber; - const TCHAR *lineNumberStr = (foldNode->ToElement())->Attribute(TEXT("line"), &lineNumber); - if (lineNumberStr) + const TCHAR *langName; + langName = (childNode->ToElement())->Attribute(TEXT("lang")); + int encoding = -1; + const TCHAR *encStr = (childNode->ToElement())->Attribute(TEXT("encoding"), &encoding); + const TCHAR *backupFilePath = (childNode->ToElement())->Attribute(TEXT("backupFilePath")); + + int fileModifiedTimestamp = 0; + (childNode->ToElement())->Attribute(TEXT("originalFileLastModifTimestamp"), &fileModifiedTimestamp); + + sessionFileInfo sfi(fileName, langName, encStr?encoding:-1, position, backupFilePath, fileModifiedTimestamp); + + for (TiXmlNode *markNode = childNode->FirstChildElement(TEXT("Mark")); + markNode ; + markNode = markNode->NextSibling(TEXT("Mark"))) { - sfi._foldStates.push_back(lineNumber); + int lineNumber; + const TCHAR *lineNumberStr = (markNode->ToElement())->Attribute(TEXT("line"), &lineNumber); + if (lineNumberStr) + { + sfi.marks.push_back(lineNumber); + } } + + for (TiXmlNode *foldNode = childNode->FirstChildElement(TEXT("Fold")); + foldNode ; + foldNode = foldNode->NextSibling(TEXT("Fold"))) + { + int lineNumber; + const TCHAR *lineNumberStr = (foldNode->ToElement())->Attribute(TEXT("line"), &lineNumber); + if (lineNumberStr) + { + sfi._foldStates.push_back(lineNumber); + } + } + if (k == 0) + (*ptrSession)._mainViewFiles.push_back(sfi); + else // k == 1 + (*ptrSession)._subViewFiles.push_back(sfi); } - (*ptrSession)._mainViewFiles.push_back(sfi); } } } - TiXmlNode *subviewRoot = sessionRoot->FirstChildElement(TEXT("subView")); - if (subviewRoot) - { - TiXmlElement *actIndex = subviewRoot->ToElement(); - str = actIndex->Attribute(TEXT("activeIndex"), (int *)&index); - if (str) - { - (*ptrSession)._activeSubIndex = index; - } - for (TiXmlNode *childNode = subviewRoot->FirstChildElement(TEXT("File")); - childNode ; - childNode = childNode->NextSibling(TEXT("File")) ) - { - const TCHAR *fileName = (childNode->ToElement())->Attribute(TEXT("filename")); - if (fileName) - { - - Position position; - (childNode->ToElement())->Attribute(TEXT("firstVisibleLine"), &position._firstVisibleLine); - (childNode->ToElement())->Attribute(TEXT("xOffset"), &position._xOffset); - (childNode->ToElement())->Attribute(TEXT("startPos"), &position._startPos); - (childNode->ToElement())->Attribute(TEXT("endPos"), &position._endPos); - (childNode->ToElement())->Attribute(TEXT("selMode"), &position._selMode); - (childNode->ToElement())->Attribute(TEXT("scrollWidth"), &position._scrollWidth); - - const TCHAR *langName; - langName = (childNode->ToElement())->Attribute(TEXT("lang")); - int encoding = -1; - (childNode->ToElement())->Attribute(TEXT("encoding"), &encoding); - - sessionFileInfo sfi(fileName, langName, encoding, position); - - for (TiXmlNode *markNode = childNode->FirstChildElement(TEXT("Mark")); - markNode ; - markNode = markNode->NextSibling(TEXT("Mark"))) - { - int lineNumber; - const TCHAR *lineNumberStr = (markNode->ToElement())->Attribute(TEXT("line"), &lineNumber); - if (lineNumberStr) - { - sfi.marks.push_back(lineNumber); - } - } - - for (TiXmlNode *foldNode = childNode->FirstChildElement(TEXT("Fold")); - foldNode ; - foldNode = foldNode->NextSibling(TEXT("Fold"))) - { - int lineNumber; - const TCHAR *lineNumberStr = (foldNode->ToElement())->Attribute(TEXT("line"), &lineNumber); - if (lineNumberStr) - { - sfi._foldStates.push_back(lineNumber); - } - } - (*ptrSession)._subViewFiles.push_back(sfi); - } - } - } - - return true; } @@ -2443,65 +2397,54 @@ void NppParameters::writeSession(const Session & session, const TCHAR *fileName) TiXmlNode *sessionNode = root->InsertEndChild(TiXmlElement(TEXT("Session"))); (sessionNode->ToElement())->SetAttribute(TEXT("activeView"), (int)session._activeView); - TiXmlNode *mainViewNode = sessionNode->InsertEndChild(TiXmlElement(TEXT("mainView"))); - (mainViewNode->ToElement())->SetAttribute(TEXT("activeIndex"), (int)session._activeMainIndex); - for (size_t i = 0, len = session._mainViewFiles.size(); i < len ; ++i) + struct ViewElem { + TiXmlNode *viewNode; + vector *viewFiles; + size_t activeIndex; + }; + const int nbElem = 2; + ViewElem viewElems[nbElem]; + viewElems[0].viewNode = sessionNode->InsertEndChild(TiXmlElement(TEXT("mainView"))); + viewElems[1].viewNode = sessionNode->InsertEndChild(TiXmlElement(TEXT("subView"))); + viewElems[0].viewFiles = (vector *)(&(session._mainViewFiles)); + viewElems[1].viewFiles = (vector *)(&(session._subViewFiles)); + viewElems[0].activeIndex = session._activeMainIndex; + viewElems[1].activeIndex = session._activeSubIndex; + + for (size_t k = 0; k < nbElem ; ++k) { - TiXmlNode *fileNameNode = mainViewNode->InsertEndChild(TiXmlElement(TEXT("File"))); - - (fileNameNode->ToElement())->SetAttribute(TEXT("firstVisibleLine"), session._mainViewFiles[i]._firstVisibleLine); - (fileNameNode->ToElement())->SetAttribute(TEXT("xOffset"), session._mainViewFiles[i]._xOffset); - (fileNameNode->ToElement())->SetAttribute(TEXT("scrollWidth"), session._mainViewFiles[i]._scrollWidth); - (fileNameNode->ToElement())->SetAttribute(TEXT("startPos"), session._mainViewFiles[i]._startPos); - (fileNameNode->ToElement())->SetAttribute(TEXT("endPos"), session._mainViewFiles[i]._endPos); - (fileNameNode->ToElement())->SetAttribute(TEXT("selMode"), session._mainViewFiles[i]._selMode); - (fileNameNode->ToElement())->SetAttribute(TEXT("lang"), session._mainViewFiles[i]._langName.c_str()); - (fileNameNode->ToElement())->SetAttribute(TEXT("encoding"), session._mainViewFiles[i]._encoding); - (fileNameNode->ToElement())->SetAttribute(TEXT("filename"), session._mainViewFiles[i]._fileName.c_str()); + (viewElems[k].viewNode->ToElement())->SetAttribute(TEXT("activeIndex"), (int)viewElems[k].activeIndex); + vector & viewSessionFiles = *(viewElems[k].viewFiles); - for (size_t j = 0, len = session._mainViewFiles[i].marks.size() ; j < len ; ++j) + for (size_t i = 0, len = viewElems[k].viewFiles->size(); i < len ; ++i) { - size_t markLine = session._mainViewFiles[i].marks[j]; - TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Mark"))); - markNode->ToElement()->SetAttribute(TEXT("line"), markLine); - } + TiXmlNode *fileNameNode = viewElems[k].viewNode->InsertEndChild(TiXmlElement(TEXT("File"))); - for (size_t j = 0, len = session._mainViewFiles[i]._foldStates.size() ; j < len ; ++j) - { - size_t foldLine = session._mainViewFiles[i]._foldStates[j]; - TiXmlNode *foldNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Fold"))); - foldNode->ToElement()->SetAttribute(TEXT("line"), foldLine); - } - } - - TiXmlNode *subViewNode = sessionNode->InsertEndChild(TiXmlElement(TEXT("subView"))); - (subViewNode->ToElement())->SetAttribute(TEXT("activeIndex"), (int)session._activeSubIndex); - for (size_t i = 0, len = session._subViewFiles.size(); i < len ; ++i) - { - TiXmlNode *fileNameNode = subViewNode->InsertEndChild(TiXmlElement(TEXT("File"))); - - (fileNameNode->ToElement())->SetAttribute(TEXT("firstVisibleLine"), session._subViewFiles[i]._firstVisibleLine); - (fileNameNode->ToElement())->SetAttribute(TEXT("xOffset"), session._subViewFiles[i]._xOffset); - (fileNameNode->ToElement())->SetAttribute(TEXT("scrollWidth"), session._subViewFiles[i]._scrollWidth); - (fileNameNode->ToElement())->SetAttribute(TEXT("startPos"), session._subViewFiles[i]._startPos); - (fileNameNode->ToElement())->SetAttribute(TEXT("endPos"), session._subViewFiles[i]._endPos); - (fileNameNode->ToElement())->SetAttribute(TEXT("selMode"), session._subViewFiles[i]._selMode); - (fileNameNode->ToElement())->SetAttribute(TEXT("lang"), session._subViewFiles[i]._langName.c_str()); - (fileNameNode->ToElement())->SetAttribute(TEXT("encoding"), session._subViewFiles[i]._encoding); - (fileNameNode->ToElement())->SetAttribute(TEXT("filename"), session._subViewFiles[i]._fileName.c_str()); + (fileNameNode->ToElement())->SetAttribute(TEXT("firstVisibleLine"), viewSessionFiles[i]._firstVisibleLine); + (fileNameNode->ToElement())->SetAttribute(TEXT("xOffset"), viewSessionFiles[i]._xOffset); + (fileNameNode->ToElement())->SetAttribute(TEXT("scrollWidth"), viewSessionFiles[i]._scrollWidth); + (fileNameNode->ToElement())->SetAttribute(TEXT("startPos"), viewSessionFiles[i]._startPos); + (fileNameNode->ToElement())->SetAttribute(TEXT("endPos"), viewSessionFiles[i]._endPos); + (fileNameNode->ToElement())->SetAttribute(TEXT("selMode"), viewSessionFiles[i]._selMode); + (fileNameNode->ToElement())->SetAttribute(TEXT("lang"), viewSessionFiles[i]._langName.c_str()); + (fileNameNode->ToElement())->SetAttribute(TEXT("encoding"), viewSessionFiles[i]._encoding); + (fileNameNode->ToElement())->SetAttribute(TEXT("filename"), viewSessionFiles[i]._fileName.c_str()); + (fileNameNode->ToElement())->SetAttribute(TEXT("backupFilePath"), viewSessionFiles[i]._backupFilePath.c_str()); + (fileNameNode->ToElement())->SetAttribute(TEXT("originalFileLastModifTimestamp"), int(viewSessionFiles[i]._originalFileLastModifTimestamp)); - for (size_t j = 0, len = session._subViewFiles[i].marks.size(); j < len; ++j) - { - size_t markLine = session._subViewFiles[i].marks[j]; - TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Mark"))); - markNode->ToElement()->SetAttribute(TEXT("line"), markLine); - } + for (size_t j = 0, len = viewSessionFiles[i].marks.size() ; j < len ; ++j) + { + size_t markLine = viewSessionFiles[i].marks[j]; + TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Mark"))); + markNode->ToElement()->SetAttribute(TEXT("line"), markLine); + } - for (size_t j = 0, len = session._subViewFiles[i]._foldStates.size() ; j < len ; ++j) - { - size_t foldLine = session._subViewFiles[i]._foldStates[j]; - TiXmlNode *foldNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Fold"))); - foldNode->ToElement()->SetAttribute(TEXT("line"), foldLine); + for (size_t j = 0, len = viewSessionFiles[i]._foldStates.size() ; j < len ; ++j) + { + size_t foldLine = viewSessionFiles[i]._foldStates[j]; + TiXmlNode *foldNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Fold"))); + foldNode->ToElement()->SetAttribute(TEXT("line"), foldLine); + } } } } diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index 50dea0073..e1c163347 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -145,9 +145,11 @@ struct Position }; struct sessionFileInfo : public Position { - sessionFileInfo(const TCHAR *fn, const TCHAR *ln, int encoding, Position pos) : _encoding(encoding), Position(pos) { + sessionFileInfo(const TCHAR *fn, const TCHAR *ln, int encoding, Position pos, const TCHAR *backupFilePath, int originalFileLastModifTimestamp) : + _encoding(encoding), Position(pos), _originalFileLastModifTimestamp(originalFileLastModifTimestamp) { if (fn) _fileName = fn; if (ln) _langName = ln; + if (backupFilePath) _backupFilePath = backupFilePath; }; sessionFileInfo(generic_string fn) : _fileName(fn), _encoding(-1){}; @@ -157,6 +159,9 @@ struct sessionFileInfo : public Position { vector marks; vector _foldStates; int _encoding; + + generic_string _backupFilePath; + time_t _originalFileLastModifTimestamp; }; struct Session { diff --git a/PowerEditor/src/ScitillaComponent/Buffer.cpp b/PowerEditor/src/ScitillaComponent/Buffer.cpp index 9074344f2..2a08eea5d 100644 --- a/PowerEditor/src/ScitillaComponent/Buffer.cpp +++ b/PowerEditor/src/ScitillaComponent/Buffer.cpp @@ -648,25 +648,36 @@ bool FileManager::backupCurrentBuffer() Utf8_16_Write UnicodeConvertor; UnicodeConvertor.setEncoding(mode); - int encoding = buffer->getEncoding(); - - generic_string backupFilePath = NppParameters::getInstance()->getUserPath(); - if (buffer->getBackupFileName() == TEXT("")) + generic_string backupFilePath = buffer->getBackupFileName(); + if (backupFilePath == TEXT("")) { - // Create file name - if (buffer->isUntitled()) + // Create file + backupFilePath = NppParameters::getInstance()->getUserPath(); + backupFilePath += TEXT("\\backup\\"); + + // if "backup" folder doesn't exist, create it. + if (!PathFileExists(backupFilePath.c_str())) { - - } - else - { - + ::CreateDirectory(backupFilePath.c_str(), NULL); } + backupFilePath += buffer->getFileName(); + + const int temBufLen = 32; + TCHAR tmpbuf[temBufLen]; + time_t ltime = time(0); + struct tm *today; + + today = localtime(<ime); + generic_strftime(tmpbuf, temBufLen, TEXT("%Y-%m-%d_%H%M%S"), today); + + backupFilePath += TEXT("@"); + backupFilePath += tmpbuf; + // Set created file name in buffer - //backupFilePath += + buffer->setBackupFileName(backupFilePath); } @@ -727,7 +738,7 @@ bool FileManager::backupCurrentBuffer() } } */ - + buffer->setModifiedStatus(false); result = true; //all done @@ -745,11 +756,34 @@ bool FileManager::backupCurrentBuffer() if (backupFilePath != TEXT("")) { // delete backup file - + generic_string file2Delete = buffer->getBackupFileName(); + buffer->setBackupFileName(TEXT("")); + result = (::DeleteFile(file2Delete.c_str()) != 0); } + //printStr(TEXT("backup deleted in backupCurrentBuffer")); result = true; // no backup file to delete } + //printStr(TEXT("backup sync")); + ::ReleaseMutex(mutex); + return result; +} +bool FileManager::deleteCurrentBufferBackup() +{ + HANDLE mutex = ::CreateMutex(NULL, false, TEXT("nppBackupSystem")); + ::WaitForSingleObject(mutex, INFINITE); + + Buffer * buffer = _pNotepadPlus->getCurrentBuffer(); + bool result = true; + generic_string backupFilePath = buffer->getBackupFileName(); + if (backupFilePath != TEXT("")) + { + // delete backup file + generic_string file2Delete = buffer->getBackupFileName(); + buffer->setBackupFileName(TEXT("")); + result = (::DeleteFile(file2Delete.c_str()) != 0); + } + //printStr(TEXT("backup deleted in deleteCurrentBufferBackup")); ::ReleaseMutex(mutex); return result; } diff --git a/PowerEditor/src/ScitillaComponent/Buffer.h b/PowerEditor/src/ScitillaComponent/Buffer.h index 34d70e576..453358b34 100644 --- a/PowerEditor/src/ScitillaComponent/Buffer.h +++ b/PowerEditor/src/ScitillaComponent/Buffer.h @@ -96,6 +96,7 @@ public: bool reloadBufferDeferred(BufferID id); bool saveBuffer(BufferID id, const TCHAR * filename, bool isCopy = false, generic_string * error_msg = NULL); bool backupCurrentBuffer(); + bool deleteCurrentBufferBackup(); bool deleteFile(BufferID id); bool moveFile(BufferID id, const TCHAR * newFilename); bool createEmptyFile(const TCHAR * path); @@ -325,6 +326,8 @@ public : bool isModified() const {return _isModified;}; void setModifiedStatus(bool isModified) {_isModified = isModified;}; generic_string getBackupFileName() const {return _backupFileName;}; + void setBackupFileName(generic_string fileName) {_backupFileName = fileName;}; + time_t getLastModifiedTimestamp() const {return _timeStamp;}; private : FileManager * _pManager;