mirror of
https://github.com/notepad-plus-plus/notepad-plus-plus.git
synced 2025-07-28 08:14:18 +02:00
[NEW_FEATURE] (Author: FLS) Remember folding states for each file in session.
git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@1024 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
parent
283f7567a6
commit
0180d012cb
@ -4217,6 +4217,44 @@ void Notepad_plus::getCurrentOpenedFiles(Session & session)
|
|||||||
sfi.marks.push_back(j);
|
sfi.marks.push_back(j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--FLS: xSaveFoldingStateSession:
|
||||||
|
// For all but the active document in the view, the folding states have to be retrieved from the buffer.
|
||||||
|
// For the active document, the folding state has to be retrieved directly from the view!
|
||||||
|
Buffer * viewCurrentBuf = _mainEditView.getCurrentBuffer();
|
||||||
|
if (buf != viewCurrentBuf) {
|
||||||
|
std::vector<HeaderLineState> lineStateVector;
|
||||||
|
lineStateVector = buf->getHeaderLineState(&_mainEditView);
|
||||||
|
int nbLineState = lineStateVector.size();
|
||||||
|
for (int i = 0 ; i < nbLineState ; i++)
|
||||||
|
{
|
||||||
|
const HeaderLineState & hls = lineStateVector.at(i);
|
||||||
|
//-- Store, if line is contracted
|
||||||
|
if (!hls._isExpanded)
|
||||||
|
sfi.foldedLines.push_back(hls._headerLineNumber);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//-- Development of saving Folding State to File Edit View History
|
||||||
|
//SCI_CONTRACTEDFOLDNEXT(int lineStart)
|
||||||
|
// Search efficiently for lines that are contracted fold headers.
|
||||||
|
// This is useful when saving the user's folding when switching documents or saving folding with a file.
|
||||||
|
// The search starts at line number lineStart and continues forwards to the end of the file.
|
||||||
|
// lineStart is returned if it is a contracted fold header otherwise the next contracted fold header is returned.
|
||||||
|
// If there are no more contracted fold headers then -1 is returned.
|
||||||
|
//-- Folding state is not copied to invisible view but only accessable in original view !!
|
||||||
|
int contractedFoldHeaderLine=0;
|
||||||
|
do {
|
||||||
|
contractedFoldHeaderLine = _mainEditView.execute(SCI_CONTRACTEDFOLDNEXT, contractedFoldHeaderLine);
|
||||||
|
if (contractedFoldHeaderLine != -1) {
|
||||||
|
//-- Store contracted line
|
||||||
|
sfi.foldedLines.push_back(contractedFoldHeaderLine);
|
||||||
|
//-- Start next search with next line
|
||||||
|
contractedFoldHeaderLine++;
|
||||||
|
}
|
||||||
|
} while (contractedFoldHeaderLine != -1);
|
||||||
|
} //-- else if (buf != viewCurrentBuf) --
|
||||||
|
|
||||||
|
//-- saving sfi in session --
|
||||||
session._mainViewFiles.push_back(sfi);
|
session._mainViewFiles.push_back(sfi);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4249,6 +4287,44 @@ void Notepad_plus::getCurrentOpenedFiles(Session & session)
|
|||||||
sfi.marks.push_back(j);
|
sfi.marks.push_back(j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--FLS: xSaveFoldingStateSession:
|
||||||
|
// For all but the active document in the view, the folding states have to be retrieved from the buffer.
|
||||||
|
// For the active document, the folding state has to be retrieved directly from the view!
|
||||||
|
Buffer * viewCurrentBuf = _subEditView.getCurrentBuffer();
|
||||||
|
if (buf != viewCurrentBuf) {
|
||||||
|
std::vector<HeaderLineState> lineStateVector;
|
||||||
|
lineStateVector = buf->getHeaderLineState(&_subEditView);
|
||||||
|
int nbLineState = lineStateVector.size();
|
||||||
|
for (int i = 0 ; i < nbLineState ; i++)
|
||||||
|
{
|
||||||
|
const HeaderLineState & hls = lineStateVector.at(i);
|
||||||
|
//-- Store, if line is contracted
|
||||||
|
if (!hls._isExpanded)
|
||||||
|
sfi.foldedLines.push_back(hls._headerLineNumber);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//-- Development of saving Folding State to File Edit View History
|
||||||
|
//SCI_CONTRACTEDFOLDNEXT(int lineStart)
|
||||||
|
// Search efficiently for lines that are contracted fold headers.
|
||||||
|
// This is useful when saving the user's folding when switching documents or saving folding with a file.
|
||||||
|
// The search starts at line number lineStart and continues forwards to the end of the file.
|
||||||
|
// lineStart is returned if it is a contracted fold header otherwise the next contracted fold header is returned.
|
||||||
|
// If there are no more contracted fold headers then -1 is returned.
|
||||||
|
//-- Folding state is not copied to invisible view but only accessable in original view !!
|
||||||
|
int contractedFoldHeaderLine=0;
|
||||||
|
do {
|
||||||
|
contractedFoldHeaderLine = _subEditView.execute(SCI_CONTRACTEDFOLDNEXT, contractedFoldHeaderLine);
|
||||||
|
if (contractedFoldHeaderLine != -1) {
|
||||||
|
//-- Store contracted line
|
||||||
|
sfi.foldedLines.push_back(contractedFoldHeaderLine);
|
||||||
|
//-- Start next search with next line
|
||||||
|
contractedFoldHeaderLine++;
|
||||||
|
}
|
||||||
|
} while (contractedFoldHeaderLine != -1);
|
||||||
|
} //-- else if (buf != viewCurrentBuf) --
|
||||||
|
|
||||||
|
//-- saving sfi in session --
|
||||||
session._subViewFiles.push_back(sfi);
|
session._subViewFiles.push_back(sfi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5755,3 +5831,168 @@ bool Notepad_plus::undoStreamComment()
|
|||||||
} while(1); //do as long as stream-comments are within selection
|
} while(1); //do as long as stream-comments are within selection
|
||||||
//return retVal;
|
//return retVal;
|
||||||
} //----- undoStreamComment() -------------------------------
|
} //----- undoStreamComment() -------------------------------
|
||||||
|
|
||||||
|
//--FLS: xFileEditViewHistory: new function addFileToFileEditViewSession()
|
||||||
|
void Notepad_plus::addFileToFileEditViewSession(Session * pSession, const TCHAR *fileNamePath, BufferID id, int whichOne)
|
||||||
|
{
|
||||||
|
//--FLS: Adds the edit-view parameters of the current file, which is closed by fileClose()
|
||||||
|
// into the FileEditViewHistory-Session.
|
||||||
|
// (see also code from _lastRecentFileList.add(fileNamePath) and getCurrentOpenedFiles(currentSession) )
|
||||||
|
//--FLS: Use _mainViewFiles for ALL session files, even for the sub-view files, because FileEditViewHistory does not distinguish.
|
||||||
|
|
||||||
|
TCHAR strFileName[MAX_PATH];
|
||||||
|
vector<sessionFileInfo>::iterator posIt;
|
||||||
|
|
||||||
|
//-- Get Pointer to Buffer and to _EditView --
|
||||||
|
Buffer * buf = MainFileManager->getBufferByID(id);
|
||||||
|
ScintillaEditView *_pEditView= whichOne==MAIN_VIEW?(&_mainEditView):(&_subEditView);
|
||||||
|
|
||||||
|
if (!buf->isUntitled())
|
||||||
|
{
|
||||||
|
// 1.) Search throught the session list and if an entry with fileNamePath is available, delete the entry
|
||||||
|
for (size_t i = 0 ; i < pSession->_mainViewFiles.size() ; i++)
|
||||||
|
{
|
||||||
|
lstrcpy(strFileName, pSession->_mainViewFiles[i]._fileName.c_str());
|
||||||
|
if (generic_stricmp((TCHAR*)&strFileName, fileNamePath)==0) {
|
||||||
|
posIt = pSession->_mainViewFiles.begin() + i;
|
||||||
|
pSession->_mainViewFiles.erase(posIt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2.) Insert the edit-view parameters at the end of the session list.
|
||||||
|
// Code stolen from getCurrentOpenedFiles(currentSession) and doClose()
|
||||||
|
_pEditView->saveCurrentPos();
|
||||||
|
pSession->_activeMainIndex = _mainDocTab.getCurrentTabIndex();
|
||||||
|
//Use _invisibleEditView to temporarily open documents to retrieve markers
|
||||||
|
Document oldDoc = _invisibleEditView.execute(SCI_GETDOCPOINTER);
|
||||||
|
generic_string languageName = getLangFromMenu(buf);
|
||||||
|
const TCHAR *langName = languageName.c_str();
|
||||||
|
sessionFileInfo sfi(buf->getFullPathName(), langName, buf->getEncoding(), buf->getPosition(_pEditView));
|
||||||
|
_invisibleEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument());
|
||||||
|
int maxLine = _invisibleEditView.execute(SCI_GETLINECOUNT);
|
||||||
|
for (int j = 0 ; j < maxLine ; j++)
|
||||||
|
{
|
||||||
|
if ((_invisibleEditView.execute(SCI_MARKERGET, j)&(1 << MARK_BOOKMARK)) != 0)
|
||||||
|
{
|
||||||
|
sfi.marks.push_back(j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--FLS: xSaveFoldingStateSession:
|
||||||
|
//-- Development of saving Folding State to File Edit View History
|
||||||
|
//SCI_CONTRACTEDFOLDNEXT(int lineStart)
|
||||||
|
// Search efficiently for lines that are contracted fold headers.
|
||||||
|
// This is useful when saving the user's folding when switching documents or saving folding with a file.
|
||||||
|
// The search starts at line number lineStart and continues forwards to the end of the file.
|
||||||
|
// lineStart is returned if it is a contracted fold header otherwise the next contracted fold header is returned.
|
||||||
|
// If there are no more contracted fold headers then -1 is returned.
|
||||||
|
//-- Folding state is not copied to invisible view but only accessable in original view !!
|
||||||
|
int contractedFoldHeaderLine=0;
|
||||||
|
do {
|
||||||
|
contractedFoldHeaderLine = _pEditView->execute(SCI_CONTRACTEDFOLDNEXT, contractedFoldHeaderLine);
|
||||||
|
if (contractedFoldHeaderLine != -1) {
|
||||||
|
//-- Store contracted line
|
||||||
|
sfi.foldedLines.push_back(contractedFoldHeaderLine);
|
||||||
|
//-- Start next search with next line
|
||||||
|
contractedFoldHeaderLine++;
|
||||||
|
}
|
||||||
|
} while (contractedFoldHeaderLine != -1);
|
||||||
|
|
||||||
|
//-- saving sfi in session --
|
||||||
|
pSession->_mainViewFiles.push_back(sfi);
|
||||||
|
|
||||||
|
//--FLS: Restore original saved document to invisibleEditView
|
||||||
|
_invisibleEditView.execute(SCI_SETDOCPOINTER, 0, oldDoc);
|
||||||
|
} //-- if(!buf->isUntitled() )
|
||||||
|
|
||||||
|
} //-- addFileToFileEditViewSession() -----------------
|
||||||
|
|
||||||
|
//--FLS: xFileEditViewHistory: new function restoreFileEditView()
|
||||||
|
void Notepad_plus::restoreFileEditView(const TCHAR *longFileName, BufferID buffer)
|
||||||
|
{
|
||||||
|
//--FLS: FileEditViewHistory: restores edit-view settings (cursor position, marks, etc.) of files
|
||||||
|
// as they were when the file was closes the last time.
|
||||||
|
//--FLS: Use _mainViewFiles for ALL session files, even for the sub-view files, because FileEditViewHistory does not distinguish.
|
||||||
|
//-- Code partly stolen from loadSession() in NppIO.cpp
|
||||||
|
|
||||||
|
std::vector<HeaderLineState> lineStateVector;
|
||||||
|
|
||||||
|
//--Check, if FileEditViewHistoryRestore is Enabled
|
||||||
|
if ((NppParameters::getInstance())->getFileEditViewHistoryRestoreEnabled()) {
|
||||||
|
//--FLS: Save current view-Position and folding of current document into document buffer --
|
||||||
|
// Necessary to avoid drawback when doing SCI_SETDOCPOINTER below, because apparently SCI changes the SCI view-position
|
||||||
|
// and un-folds all foldings in some cases when applying SCI_SETDOCPOINTER!
|
||||||
|
// (see ScintillaEditView::activateBuffer()! )
|
||||||
|
_pEditView->saveCurrentPos();
|
||||||
|
//--FLS: get foldStateInfo of current doc and put the state into the buffer
|
||||||
|
_pEditView->getCurrentFoldStates(lineStateVector);
|
||||||
|
_pEditView->getCurrentBuffer()->setHeaderLineState(lineStateVector, _pEditView);
|
||||||
|
|
||||||
|
//--FLS: Restores the file edit-view (line position, window position, marks) of currently loaded file, if in FileEditViewSession list.
|
||||||
|
//--FLS: code stolen from init:..if (nppGUI._rememberLastSession)
|
||||||
|
Session lastSession = *(NppParameters::getInstance())->getPtrFileEditViewSession(); // _lastFileEditViewSession
|
||||||
|
for (size_t i = 0 ; i < lastSession._mainViewFiles.size() ; i++)
|
||||||
|
{
|
||||||
|
const TCHAR *pFn = lastSession._mainViewFiles[i]._fileName.c_str();
|
||||||
|
//-- searches through the list of FileEditViewSession for the recent FileName and restores the edit-view if found.
|
||||||
|
int res = generic_stricmp(longFileName,pFn);
|
||||||
|
if (res==0)
|
||||||
|
{
|
||||||
|
//--FLS: Compare restore actions with restore actions in loadSession() in NppIO.cpp - if (lastOpened)-case.!!
|
||||||
|
//showView(currentView()); //--- not needed, because view is not changed!
|
||||||
|
const TCHAR *pLn = lastSession._mainViewFiles[i]._langName.c_str();
|
||||||
|
int id = getLangFromMenuName(pLn);
|
||||||
|
LangType typeToSet = L_TEXT;
|
||||||
|
if (id != 0 && id != IDM_LANG_USER)
|
||||||
|
typeToSet = menuID2LangType(id);
|
||||||
|
if (typeToSet == L_EXTERNAL )
|
||||||
|
typeToSet = (LangType)(id - IDM_LANG_EXTERNAL + L_EXTERNAL);
|
||||||
|
|
||||||
|
Buffer * buf = MainFileManager->getBufferByID(buffer);
|
||||||
|
buf->setPosition(lastSession._mainViewFiles[i], _pEditView);
|
||||||
|
buf->setLangType(typeToSet, pLn);
|
||||||
|
if (lastSession._mainViewFiles[i]._encoding != -1)
|
||||||
|
buf->setEncoding(lastSession._mainViewFiles[i]._encoding);
|
||||||
|
|
||||||
|
//Force in the document so we can add the markers
|
||||||
|
//Dont use default methods because of performance
|
||||||
|
Document prevDoc = _pEditView->execute(SCI_GETDOCPOINTER);
|
||||||
|
_pEditView->execute(SCI_SETDOCPOINTER, 0, buf->getDocument());
|
||||||
|
for (size_t j = 0 ; j < lastSession._mainViewFiles[i].marks.size() ; j++)
|
||||||
|
{
|
||||||
|
_pEditView->execute(SCI_MARKERADD, lastSession._mainViewFiles[i].marks[j], MARK_BOOKMARK);
|
||||||
|
}
|
||||||
|
//--FLS: xSaveFoldingStateSession: restore fold levels
|
||||||
|
//- Bookmarks, selection marks and style marks are valid for a document in SCI (equal in all views of the same document in SCI)
|
||||||
|
//- But "folding" is a property of a view and not a document (different for the same document in two views)!
|
||||||
|
// So, if changing documents with SCI_SETDOCPOINTER, SCI un-folds all foldings!!
|
||||||
|
//- Therefore, the lexer needs first to do its work! But the lexer is not set at this stage (only for the first document replacing "new x" dummy document).
|
||||||
|
//- Set document language type and request lexter to style the document.
|
||||||
|
_pEditView->defineDocType(buf->getLangType());
|
||||||
|
_pEditView->execute(SCI_COLOURISE, 0, -1); // request the lexer to style the document.
|
||||||
|
|
||||||
|
for (size_t j = 0 ; j < lastSession._mainViewFiles[i].foldedLines.size() ; j++)
|
||||||
|
{
|
||||||
|
//-- Pre-Condition is that after file is opened NO lines are folded,
|
||||||
|
// but the Lexer has already styled the document so that the Folding-Header lines exist!!
|
||||||
|
_pEditView->execute(SCI_TOGGLEFOLD, lastSession._mainViewFiles[i].foldedLines[j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-- Write folding state info also into current buffer for activation later in current view.
|
||||||
|
// get foldStateInfo of current doc
|
||||||
|
std::vector<HeaderLineState> lineStateVector;
|
||||||
|
_pEditView->getCurrentFoldStates(lineStateVector);
|
||||||
|
// put the state into the future ex buffer
|
||||||
|
buf->setHeaderLineState(lineStateVector, _pEditView);
|
||||||
|
|
||||||
|
//-- switch back the SCI-Buffer to the buffer of the current edit view.
|
||||||
|
_pEditView->execute(SCI_SETDOCPOINTER, 0, prevDoc);
|
||||||
|
} //-- if (res==0), when a File to restore EditView was found --
|
||||||
|
}
|
||||||
|
//--FLS: Restore saved view-Position and folding of original document from document buffer --
|
||||||
|
lineStateVector = _pEditView->getCurrentBuffer()->getHeaderLineState(_pEditView);
|
||||||
|
_pEditView->syncFoldStateWith(lineStateVector);
|
||||||
|
_pEditView->restoreCurrentPos();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} //--restoreFileEditView()
|
@ -219,7 +219,8 @@ public:
|
|||||||
|
|
||||||
// fileOperations
|
// fileOperations
|
||||||
//The doXXX functions apply to a single buffer and dont need to worry about views, with the excpetion of doClose, since closing one view doesnt have to mean the document is gone
|
//The doXXX functions apply to a single buffer and dont need to worry about views, with the excpetion of doClose, since closing one view doesnt have to mean the document is gone
|
||||||
BufferID doOpen(const TCHAR *fileName, bool isReadOnly = false, int encoding = -1);
|
//--FLS: xFileEditViewHistory: doOpen(fileName, isReadOnly, encoding) replaced by doOpen(fileName, isReadOnly, encoding, noRestoreFileEditView), due to reundancy of session-loading with RestoreFileEditView
|
||||||
|
BufferID doOpen(const TCHAR *fileName, bool isReadOnly = false, int encoding = -1, bool noRestoreFileEditView=false);
|
||||||
bool doReload(BufferID id, bool alert = true);
|
bool doReload(BufferID id, bool alert = true);
|
||||||
bool doSave(BufferID, const TCHAR * filename, bool isSaveCopy = false);
|
bool doSave(BufferID, const TCHAR * filename, bool isSaveCopy = false);
|
||||||
void doClose(BufferID, int whichOne);
|
void doClose(BufferID, int whichOne);
|
||||||
@ -269,6 +270,11 @@ public:
|
|||||||
|
|
||||||
void getCurrentOpenedFiles(Session & session);
|
void getCurrentOpenedFiles(Session & session);
|
||||||
|
|
||||||
|
//--FLS: xFileEditViewHistory: new function addFileToFileEditViewSession()
|
||||||
|
void addFileToFileEditViewSession(Session * pSession, const TCHAR *fileNamePath, BufferID id, int whichOne);
|
||||||
|
//--FLS: xFileEditViewHistory: new function declaration
|
||||||
|
void restoreFileEditView(const TCHAR *longFileName, BufferID buffer);
|
||||||
|
|
||||||
bool fileLoadSession(const TCHAR *fn = NULL);
|
bool fileLoadSession(const TCHAR *fn = NULL);
|
||||||
const TCHAR * fileSaveSession(size_t nbFile, TCHAR ** fileNames, const TCHAR *sessionFile2save);
|
const TCHAR * fileSaveSession(size_t nbFile, TCHAR ** fileNames, const TCHAR *sessionFile2save);
|
||||||
const TCHAR * fileSaveSession(size_t nbFile = 0, TCHAR ** fileNames = NULL);
|
const TCHAR * fileSaveSession(size_t nbFile = 0, TCHAR ** fileNames = NULL);
|
||||||
|
@ -1459,6 +1459,9 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
|
|||||||
saveScintillaParams(); //writeScintillaParams
|
saveScintillaParams(); //writeScintillaParams
|
||||||
saveGUIParams(); //writeGUIParams
|
saveGUIParams(); //writeGUIParams
|
||||||
saveProjectPanelsParams(); //writeProjectPanelsSettings
|
saveProjectPanelsParams(); //writeProjectPanelsSettings
|
||||||
|
//--FLS: xFileEditViewHistory: write also FileEditViewHistory
|
||||||
|
Session lastSession = *(NppParameters::getInstance())->getPtrFileEditViewSession(); // _lastFileEditViewSession
|
||||||
|
(NppParameters::getInstance())->writeFileEditViewHistory(lastSession);
|
||||||
pNppParam->saveConfig_xml();
|
pNppParam->saveConfig_xml();
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,7 +34,8 @@
|
|||||||
#include <TCHAR.h>
|
#include <TCHAR.h>
|
||||||
|
|
||||||
|
|
||||||
BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isReadOnly, int encoding)
|
//--FLS: xFileEditViewHistory: Additional parameter "noRestoreFileEditView" to avoid redundancy when a session is loaded!
|
||||||
|
BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isReadOnly, int encoding, bool noRestoreFileEditView)
|
||||||
{
|
{
|
||||||
NppParameters *pNppParam = NppParameters::getInstance();
|
NppParameters *pNppParam = NppParameters::getInstance();
|
||||||
TCHAR longFileName[MAX_PATH];
|
TCHAR longFileName[MAX_PATH];
|
||||||
@ -166,6 +167,10 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isReadOnly, int encodi
|
|||||||
::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0);
|
::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//--FLS: xFileEditViewHistory: File opened and now reset edit-view if file is in FileEditViewHistory and FileEditViewHistory is enabled!
|
||||||
|
if (!noRestoreFileEditView)
|
||||||
|
restoreFileEditView(longFileName, buffer);
|
||||||
|
|
||||||
PathRemoveFileSpec(longFileName);
|
PathRemoveFileSpec(longFileName);
|
||||||
_linkTriggered = true;
|
_linkTriggered = true;
|
||||||
_isFileOpening = false;
|
_isFileOpening = false;
|
||||||
@ -348,6 +353,10 @@ void Notepad_plus::doClose(BufferID id, int whichOne)
|
|||||||
if (PathFileExists(buf->getFullPathName()))
|
if (PathFileExists(buf->getFullPathName()))
|
||||||
_lastRecentFileList.add(buf->getFullPathName());
|
_lastRecentFileList.add(buf->getFullPathName());
|
||||||
|
|
||||||
|
//--FLS: xFileEditViewHistory: save current edit-view into list of FileEditViewHistory
|
||||||
|
Session *lastSession = (NppParameters::getInstance())->getPtrFileEditViewSession(); // returns pointer to _lastFileEditViewSession
|
||||||
|
addFileToFileEditViewSession(lastSession, buf->getFullPathName(), id, whichOne);
|
||||||
|
|
||||||
// We enable Wow64 system, if it was disabled
|
// We enable Wow64 system, if it was disabled
|
||||||
if (isWow64Off)
|
if (isWow64Off)
|
||||||
{
|
{
|
||||||
@ -1019,7 +1028,8 @@ bool Notepad_plus::loadSession(Session & session)
|
|||||||
}
|
}
|
||||||
if (PathFileExists(pFn))
|
if (PathFileExists(pFn))
|
||||||
{
|
{
|
||||||
lastOpened = doOpen(pFn, false, session._mainViewFiles[i]._encoding);
|
//--FLS: xFileEditViewHistory: Calling doOpen(..,noRestoreFileEditView=true), in order to suppress RestoreFileEditView() when a session is loading due to redundancy.
|
||||||
|
lastOpened = doOpen(pFn, false, session._mainViewFiles[i]._encoding, true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1048,15 +1058,51 @@ bool Notepad_plus::loadSession(Session & session)
|
|||||||
if (session._mainViewFiles[i]._encoding != -1)
|
if (session._mainViewFiles[i]._encoding != -1)
|
||||||
buf->setEncoding(session._mainViewFiles[i]._encoding);
|
buf->setEncoding(session._mainViewFiles[i]._encoding);
|
||||||
|
|
||||||
|
//--FLS: xSaveFoldingStateSession: The CurrentPos from the session has to be also activated
|
||||||
|
// in Scintilla document before activateBuffer() is called, because activateBuffer() saves
|
||||||
|
// CurrentPos from Scintilla document into the buffer!
|
||||||
|
// This is especially necessary for the first session file loaded into "New xx" buffer and view.
|
||||||
|
_mainEditView.restoreCurrentPos();
|
||||||
|
//--FLS: xSaveFoldingStateSession: To switch and style the new document, activateBuffer() is better than
|
||||||
|
// to do the whole buffer/view treatment manually using the low level SCI_SETDOCPOINTER approach.
|
||||||
|
// Furthermore, for some reason, the folding below does not work properly without activateBuffer().
|
||||||
|
activateBuffer(lastOpened, MAIN_VIEW);
|
||||||
|
|
||||||
|
//--FLS: xSaveFoldingStateSession: SCI_SETDOCPOINTER approach not necessary, if document is switched with activateBuffer() !!
|
||||||
|
//-- To be deleted afterwards --
|
||||||
//Force in the document so we can add the markers
|
//Force in the document so we can add the markers
|
||||||
//Dont use default methods because of performance
|
//Dont use default methods because of performance
|
||||||
Document prevDoc = _mainEditView.execute(SCI_GETDOCPOINTER);
|
//Document prevDoc = _mainEditView.execute(SCI_GETDOCPOINTER);
|
||||||
_mainEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument());
|
//_mainEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument());
|
||||||
|
//-- Add the bookmark markers.
|
||||||
for (size_t j = 0 ; j < session._mainViewFiles[i].marks.size() ; j++)
|
for (size_t j = 0 ; j < session._mainViewFiles[i].marks.size() ; j++)
|
||||||
{
|
{
|
||||||
_mainEditView.execute(SCI_MARKERADD, session._mainViewFiles[i].marks[j], MARK_BOOKMARK);
|
_mainEditView.execute(SCI_MARKERADD, session._mainViewFiles[i].marks[j], MARK_BOOKMARK);
|
||||||
}
|
}
|
||||||
_mainEditView.execute(SCI_SETDOCPOINTER, 0, prevDoc);
|
|
||||||
|
//--FLS: xSaveFoldingStateSession: Restore fold levels.
|
||||||
|
//- Bookmarks, selection marks and style marks are valid for a document in SCI (equal in all views of the same document in SCI)
|
||||||
|
//- But "folding" is a property of a view and not a document (different for the same document in two views)!
|
||||||
|
// So, if changing documents with SCI_SETDOCPOINTER, SCI un-folds all foldings!!
|
||||||
|
//- Therefore, the lexer needs first to do its work! But the lexer is not set at this stage
|
||||||
|
// (only for the first document replacing "new x" dummy document).
|
||||||
|
// So set document language type and request lexer to style the document.
|
||||||
|
//--FLS: xSaveFoldingStateSession: For some reason, the document has to be styled again here, whereas it should be already styled by activateBuffer().
|
||||||
|
// Otherwise, the folding below will not work !!??
|
||||||
|
_mainEditView.defineDocType(buf->getLangType());
|
||||||
|
//-- Following is equivalent to _mainEditView.restyleBuffer();
|
||||||
|
_mainEditView.execute(SCI_CLEARDOCUMENTSTYLE);
|
||||||
|
_mainEditView.execute(SCI_COLOURISE, 0, -1); // request the lexer to style the document.
|
||||||
|
for (size_t j = 0 ; j < session._mainViewFiles[i].foldedLines.size() ; j++)
|
||||||
|
{
|
||||||
|
//-- Pre-Condition is that after file is opened NO lines are folded,
|
||||||
|
// but the Lexer has already styled the document so that the Folding-Header lines exist!!
|
||||||
|
_mainEditView.execute(SCI_TOGGLEFOLD, session._mainViewFiles[i].foldedLines[j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--FLS: xSaveFoldingStateSession: SCI_SETDOCPOINTER approach not necessary, if document is switched with activateBuffer() !!
|
||||||
|
//-- To be deleted afterwards --
|
||||||
|
//_mainEditView.execute(SCI_SETDOCPOINTER, 0, prevDoc);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1087,7 +1133,8 @@ bool Notepad_plus::loadSession(Session & session)
|
|||||||
}
|
}
|
||||||
if (PathFileExists(pFn))
|
if (PathFileExists(pFn))
|
||||||
{
|
{
|
||||||
lastOpened = doOpen(pFn, false, session._subViewFiles[k]._encoding);
|
//--FLS: xFileEditViewHistory: Calling doOpen(..,noRestoreFileEditView=true), in order to suppress RestoreFileEditView() when a session is loading due to redundancy.
|
||||||
|
lastOpened = doOpen(pFn, false, session._subViewFiles[k]._encoding, true);
|
||||||
//check if already open in main. If so, clone
|
//check if already open in main. If so, clone
|
||||||
if (_mainDocTab.getIndexByBuffer(lastOpened) != -1) {
|
if (_mainDocTab.getIndexByBuffer(lastOpened) != -1) {
|
||||||
loadBufferIntoView(lastOpened, SUB_VIEW);
|
loadBufferIntoView(lastOpened, SUB_VIEW);
|
||||||
@ -1111,6 +1158,7 @@ bool Notepad_plus::loadSession(Session & session)
|
|||||||
const TCHAR *pLn = session._subViewFiles[k]._langName.c_str();
|
const TCHAR *pLn = session._subViewFiles[k]._langName.c_str();
|
||||||
int id = getLangFromMenuName(pLn);
|
int id = getLangFromMenuName(pLn);
|
||||||
LangType typeToSet = L_TEXT;
|
LangType typeToSet = L_TEXT;
|
||||||
|
//-- FLS: Attention, handling of language-setting is different to the MAIN_VIEW code above !!??
|
||||||
if (id != 0)
|
if (id != 0)
|
||||||
typeToSet = menuID2LangType(id);
|
typeToSet = menuID2LangType(id);
|
||||||
if (typeToSet == L_EXTERNAL )
|
if (typeToSet == L_EXTERNAL )
|
||||||
@ -1126,15 +1174,41 @@ bool Notepad_plus::loadSession(Session & session)
|
|||||||
buf->setLangType(typeToSet, pLn);
|
buf->setLangType(typeToSet, pLn);
|
||||||
buf->setEncoding(session._subViewFiles[k]._encoding);
|
buf->setEncoding(session._subViewFiles[k]._encoding);
|
||||||
|
|
||||||
|
//--FLS: xSaveFoldingStateSession: Activate CurrentPos in Scintilla document.
|
||||||
|
// (for more detailed comments see at mainEditView part above)
|
||||||
|
_subEditView.restoreCurrentPos();
|
||||||
|
//--FLS: xSaveFoldingStateSession: Switch and style the new document using activateBuffer()
|
||||||
|
// (for more detailed comments see at mainEditView part above)
|
||||||
|
activateBuffer(lastOpened, SUB_VIEW);
|
||||||
|
|
||||||
|
//--FLS: xSaveFoldingStateSession: SCI_SETDOCPOINTER approach not necessary, if document is switched with activateBuffer() !!
|
||||||
|
//-- To be deleted afterwards --
|
||||||
//Force in the document so we can add the markers
|
//Force in the document so we can add the markers
|
||||||
//Dont use default methods because of performance
|
//Dont use default methods because of performance
|
||||||
Document prevDoc = _subEditView.execute(SCI_GETDOCPOINTER);
|
//Document prevDoc = _subEditView.execute(SCI_GETDOCPOINTER);
|
||||||
_subEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument());
|
//_subEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument());
|
||||||
|
//-- Add the bookmark markers.
|
||||||
for (size_t j = 0 ; j < session._subViewFiles[k].marks.size() ; j++)
|
for (size_t j = 0 ; j < session._subViewFiles[k].marks.size() ; j++)
|
||||||
{
|
{
|
||||||
_subEditView.execute(SCI_MARKERADD, session._subViewFiles[k].marks[j], MARK_BOOKMARK);
|
_subEditView.execute(SCI_MARKERADD, session._subViewFiles[k].marks[j], MARK_BOOKMARK);
|
||||||
}
|
}
|
||||||
_subEditView.execute(SCI_SETDOCPOINTER, 0, prevDoc);
|
|
||||||
|
//--FLS: xSaveFoldingStateSession: Restore fold levels
|
||||||
|
// (for more detailed comments see at mainEditView part above)
|
||||||
|
_subEditView.defineDocType(buf->getLangType());
|
||||||
|
//-- Following is equivalent to _subEditView.restyleBuffer();
|
||||||
|
_subEditView.execute(SCI_CLEARDOCUMENTSTYLE);
|
||||||
|
_subEditView.execute(SCI_COLOURISE, 0, -1); // request the lexer to style the document.
|
||||||
|
for (size_t j = 0 ; j < session._subViewFiles[k].foldedLines.size() ; j++)
|
||||||
|
{
|
||||||
|
//-- Pre-Condition is that after file is opened NO lines are folded,
|
||||||
|
// but the Lexer has already styled the document so that the Folding-Header lines exist!!
|
||||||
|
_subEditView.execute(SCI_TOGGLEFOLD, session._subViewFiles[k].foldedLines[j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//--FLS: xSaveFoldingStateSession: SCI_SETDOCPOINTER approach not necessary, if document is switched with activateBuffer() !!
|
||||||
|
//-- To be deleted afterwards --
|
||||||
|
//_subEditView.execute(SCI_SETDOCPOINTER, 0, prevDoc);
|
||||||
|
|
||||||
k++;
|
k++;
|
||||||
}
|
}
|
||||||
@ -1146,8 +1220,11 @@ bool Notepad_plus::loadSession(Session & session)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_mainEditView.restoreCurrentPos();
|
|
||||||
_subEditView.restoreCurrentPos();
|
//--FLS: xSaveFoldingStateSession: SCI_SETDOCPOINTER approach not necessary, if document is switched with activateBuffer() !!
|
||||||
|
//-- To be deleted afterwards --
|
||||||
|
//_mainEditView.restoreCurrentPos();
|
||||||
|
//_subEditView.restoreCurrentPos();
|
||||||
|
|
||||||
if (session._activeMainIndex < (size_t)_mainDocTab.nbItem())//session.nbMainFiles())
|
if (session._activeMainIndex < (size_t)_mainDocTab.nbItem())//session.nbMainFiles())
|
||||||
activateBuffer(_mainDocTab.getBufferByIndex(session._activeMainIndex), MAIN_VIEW);
|
activateBuffer(_mainDocTab.getBufferByIndex(session._activeMainIndex), MAIN_VIEW);
|
||||||
|
@ -629,7 +629,9 @@ NppParameters::NppParameters() : _pXmlDoc(NULL),_pXmlUserDoc(NULL), _pXmlUserSty
|
|||||||
_pXmlShortcutDoc(NULL), _pXmlContextMenuDocA(NULL), _pXmlSessionDoc(NULL), _pXmlBlacklistDoc(NULL),\
|
_pXmlShortcutDoc(NULL), _pXmlContextMenuDocA(NULL), _pXmlSessionDoc(NULL), _pXmlBlacklistDoc(NULL),\
|
||||||
_nbUserLang(0), _nbExternalLang(0), _hUser32(NULL), _hUXTheme(NULL),\
|
_nbUserLang(0), _nbExternalLang(0), _hUser32(NULL), _hUXTheme(NULL),\
|
||||||
_transparentFuncAddr(NULL), _enableThemeDialogTextureFuncAddr(NULL), _pNativeLangSpeaker(NULL),\
|
_transparentFuncAddr(NULL), _enableThemeDialogTextureFuncAddr(NULL), _pNativeLangSpeaker(NULL),\
|
||||||
_isTaskListRBUTTONUP_Active(false), _fileSaveDlgFilterIndex(-1), _asNotepadStyle(false), _isFindReplacing(false)
|
_isTaskListRBUTTONUP_Active(false), _fileSaveDlgFilterIndex(-1), _asNotepadStyle(false), _isFindReplacing(false),\
|
||||||
|
//--FLS: xFileEditViewHistory: Initialize parameter setting variables:
|
||||||
|
_nbMaxFileEditView(20), _blnFileEditViewHistoryRestoreEnabled(false)
|
||||||
{
|
{
|
||||||
// init import UDL array
|
// init import UDL array
|
||||||
_nbImportedULD = 0;
|
_nbImportedULD = 0;
|
||||||
@ -1248,6 +1250,9 @@ bool NppParameters::getUserParametersFromXmlTree()
|
|||||||
//Get Find history parameters
|
//Get Find history parameters
|
||||||
feedFindHistoryParameters(root);
|
feedFindHistoryParameters(root);
|
||||||
|
|
||||||
|
//--FLS: xFileEditViewHistory: new function feedFileEditViewHistoryParameters() to feed the parameters from config.xml
|
||||||
|
feedFileEditViewHistoryParameters(root);
|
||||||
|
|
||||||
//Get Project Panel parameters
|
//Get Project Panel parameters
|
||||||
feedProjectPanelsParameters(root);
|
feedProjectPanelsParameters(root);
|
||||||
|
|
||||||
@ -1654,6 +1659,18 @@ bool NppParameters::getSessionFromXmlTree(TiXmlDocument *pSessionDoc, Session *p
|
|||||||
sfi.marks.push_back(lineNumber);
|
sfi.marks.push_back(lineNumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//--FLS: xSaveFoldingStateSession:
|
||||||
|
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.foldedLines.push_back(lineNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
(*ptrSession)._mainViewFiles.push_back(sfi);
|
(*ptrSession)._mainViewFiles.push_back(sfi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1702,6 +1719,18 @@ bool NppParameters::getSessionFromXmlTree(TiXmlDocument *pSessionDoc, Session *p
|
|||||||
sfi.marks.push_back(lineNumber);
|
sfi.marks.push_back(lineNumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//--FLS: xSaveFoldingStateSession:
|
||||||
|
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.foldedLines.push_back(lineNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
(*ptrSession)._subViewFiles.push_back(sfi);
|
(*ptrSession)._subViewFiles.push_back(sfi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2416,6 +2445,13 @@ void NppParameters::writeSession(const Session & session, const TCHAR *fileName)
|
|||||||
TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Mark")));
|
TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Mark")));
|
||||||
markNode->ToElement()->SetAttribute(TEXT("line"), markLine);
|
markNode->ToElement()->SetAttribute(TEXT("line"), markLine);
|
||||||
}
|
}
|
||||||
|
//--FLS: xSaveFoldingStateSession:
|
||||||
|
for (size_t j = 0 ; j < session._mainViewFiles[i].foldedLines.size() ; j++)
|
||||||
|
{
|
||||||
|
size_t foldedLine = session._mainViewFiles[i].foldedLines[j];
|
||||||
|
TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Fold")));
|
||||||
|
markNode->ToElement()->SetAttribute(TEXT("line"), foldedLine);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TiXmlNode *subViewNode = sessionNode->InsertEndChild(TiXmlElement(TEXT("subView")));
|
TiXmlNode *subViewNode = sessionNode->InsertEndChild(TiXmlElement(TEXT("subView")));
|
||||||
@ -2440,6 +2476,13 @@ void NppParameters::writeSession(const Session & session, const TCHAR *fileName)
|
|||||||
TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Mark")));
|
TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Mark")));
|
||||||
markNode->ToElement()->SetAttribute(TEXT("line"), markLine);
|
markNode->ToElement()->SetAttribute(TEXT("line"), markLine);
|
||||||
}
|
}
|
||||||
|
//--FLS: xSaveFoldingStateSession:
|
||||||
|
for (size_t j = 0 ; j < session._subViewFiles[i].foldedLines.size() ; j++)
|
||||||
|
{
|
||||||
|
size_t foldedLine = session._subViewFiles[i].foldedLines[j];
|
||||||
|
TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Fold")));
|
||||||
|
markNode->ToElement()->SetAttribute(TEXT("line"), foldedLine);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_pXmlSessionDoc->SaveFile();
|
_pXmlSessionDoc->SaveFile();
|
||||||
@ -5487,3 +5530,154 @@ void NppParameters::safeWow64EnableWow64FsRedirection(BOOL Wow64FsEnableRedirect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--FLS: xFileEditViewHistory: new function writeFileEditViewHistory()
|
||||||
|
void NppParameters::writeFileEditViewHistory(const Session & session)
|
||||||
|
{
|
||||||
|
//--FLS: Opens the XML-node of config.xml file and dumps the session. File is saved when notepad++ is exited.
|
||||||
|
//-- Code stolen from writeSession()
|
||||||
|
//--FLS: Use _mainViewFiles for ALL session files, even for the sub-view files, because FileEditViewHistory does not distinguish.
|
||||||
|
if (!_pXmlUserDoc) return; //otherwise, this will cause a system error!
|
||||||
|
TiXmlNode *nppRoot = _pXmlUserDoc->FirstChild(TEXT("NotepadPlus"));
|
||||||
|
if (!nppRoot) return;
|
||||||
|
TiXmlNode *sessionNode;
|
||||||
|
sessionNode = nppRoot->FirstChildElement(TEXT("FileEditViewHistory"));
|
||||||
|
//--FLS: Erase always FileEditViewHistory node and re-insert it at the end.
|
||||||
|
if (sessionNode)
|
||||||
|
nppRoot->RemoveChild(sessionNode);
|
||||||
|
sessionNode = new TiXmlElement(TEXT("FileEditViewHistory"));
|
||||||
|
if (!sessionNode) return;
|
||||||
|
|
||||||
|
//--FLS: Write FileEditViewHistory to config.xml Document. Note: Document is only written to config.xml-file with _pXmlUserDoc->SaveFile()!
|
||||||
|
(sessionNode->ToElement())->SetAttribute(TEXT("FileEditViewHistoryRestoreEnabled"), _blnFileEditViewHistoryRestoreEnabled?TEXT("True"):TEXT("False"));
|
||||||
|
//--FLS: Write Attribute "nbMaxFile" and activeIndex
|
||||||
|
(sessionNode->ToElement())->SetAttribute(TEXT("nbMaxFile"), (int)_nbMaxFileEditView);
|
||||||
|
int actIndex = 0; // set default, if no file is present!!
|
||||||
|
if (session._mainViewFiles.size() != 0) actIndex = session._activeMainIndex;
|
||||||
|
(sessionNode->ToElement())->SetAttribute(TEXT("activeMainIndex"), actIndex);
|
||||||
|
//-- Only write last _nbMaxFileEditView elements from session.
|
||||||
|
int nAll = session._mainViewFiles.size();
|
||||||
|
size_t nStart = (nAll - _nbMaxFileEditView)>0?(nAll - _nbMaxFileEditView):0;
|
||||||
|
for (size_t i = nStart ; i < session._mainViewFiles.size() ; i++)
|
||||||
|
{
|
||||||
|
TiXmlNode *fileNameNode = sessionNode->InsertEndChild(TiXmlElement(TEXT("File")));
|
||||||
|
////--FLS: Don't save editViewIndex, because for file edit view history user wants to load the document allways into the current view.
|
||||||
|
|
||||||
|
(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());
|
||||||
|
for (size_t j = 0 ; j < session._mainViewFiles[i].marks.size() ; j++)
|
||||||
|
{
|
||||||
|
size_t markLine = session._mainViewFiles[i].marks[j];
|
||||||
|
TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Mark")));
|
||||||
|
markNode->ToElement()->SetAttribute(TEXT("line"), markLine);
|
||||||
|
}
|
||||||
|
//--FLS: xSaveFoldingStateSession:
|
||||||
|
for (size_t j = 0 ; j < session._mainViewFiles[i].foldedLines.size() ; j++)
|
||||||
|
{
|
||||||
|
size_t foldedLine = session._mainViewFiles[i].foldedLines[j];
|
||||||
|
TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Fold")));
|
||||||
|
markNode->ToElement()->SetAttribute(TEXT("line"), foldedLine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//-- (Re)Insert the XML-node
|
||||||
|
(nppRoot->ToElement())->InsertEndChild(*sessionNode);
|
||||||
|
} //--- writeFileEditViewHistory() ----
|
||||||
|
|
||||||
|
|
||||||
|
//--FLS: xFileEditViewHistory: new function feedFileEditViewHistoryParameters()
|
||||||
|
// Reads the parameters from the config.xml file Node, after config.xml file is loaded.
|
||||||
|
void NppParameters::feedFileEditViewHistoryParameters(TiXmlNode *node)
|
||||||
|
{
|
||||||
|
const TCHAR *str;
|
||||||
|
//--FLS: Reads the FileEditViewHistory parameters out of according section in config.xml and stores them
|
||||||
|
// in a Session _lastFileEditViewSession.
|
||||||
|
//--FLS: Use _mainViewFiles for ALL session files, even for the sub-view files, because FileEditViewHistory does not distinguish.
|
||||||
|
//--FLS: Note: Don't use _nbMaxFile, which is directly assigned to the history _LRFileList,
|
||||||
|
// which is not really an independent class but a somehow directly linked class to _nbMaxFile variable!!
|
||||||
|
//--FLS: Code stolen from getSessionFromXmlTree().
|
||||||
|
//-- Set default values for variables, if there would be a reading error.
|
||||||
|
_nbMaxFileEditView = 20;
|
||||||
|
_blnFileEditViewHistoryRestoreEnabled = true;
|
||||||
|
//--FLS: Read FileEditViewHistory list into _lastFileEditViewSession. Same approach as used in getSessionFromXmlTree().
|
||||||
|
Session *ptrSession = &_lastFileEditViewSession;
|
||||||
|
TiXmlNode *sessionRoot = node->FirstChildElement(TEXT("FileEditViewHistory"));
|
||||||
|
if (!sessionRoot)
|
||||||
|
return;
|
||||||
|
TiXmlElement *actIndex = sessionRoot->ToElement();
|
||||||
|
size_t index;
|
||||||
|
str = actIndex->Attribute(TEXT("FileEditViewHistoryRestoreEnabled"), (int *)&index);
|
||||||
|
if (str) {
|
||||||
|
_blnFileEditViewHistoryRestoreEnabled = !generic_stricmp(TEXT("TRUE"), str);
|
||||||
|
}
|
||||||
|
//--FLS: Only one of the flags _fileEditViewHistoryRestoreEnabled or _rememberLastSession should be enabled!
|
||||||
|
// The GUI parameters have to be initialized before!!!
|
||||||
|
if (_nppGUI._rememberLastSession && _blnFileEditViewHistoryRestoreEnabled) _blnFileEditViewHistoryRestoreEnabled = false;
|
||||||
|
|
||||||
|
//--FLS: ->Attribute(const char *name, int *i) returns i=0, if a reading error occurs.
|
||||||
|
// Therefore, the code using "if (str)..." is not needed and is not the best, because it lets the ptrSession parameter uninitialized.
|
||||||
|
// read also activeYyIndex, which is not needed but just handled to set it in the session structure.
|
||||||
|
str = actIndex->Attribute(TEXT("activeView"), (int *)&(ptrSession->_activeView));
|
||||||
|
str = actIndex->Attribute(TEXT("activeMainIndex"), (int *)&(ptrSession->_activeMainIndex));
|
||||||
|
str = actIndex->Attribute(TEXT("activeSubIndex"), (int *)&(ptrSession->_activeSubIndex));
|
||||||
|
|
||||||
|
// read maximum list size
|
||||||
|
str = actIndex->Attribute(TEXT("nbMaxFile"), &_nbMaxFileEditView);
|
||||||
|
|
||||||
|
for (TiXmlNode *childNode = sessionRoot->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;
|
||||||
|
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")))
|
||||||
|
{
|
||||||
|
int lineNumber;
|
||||||
|
const TCHAR *lineNumberStr = (markNode->ToElement())->Attribute(TEXT("line"), &lineNumber);
|
||||||
|
if (lineNumberStr)
|
||||||
|
{
|
||||||
|
sfi.marks.push_back(lineNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--FLS: xSaveFoldingStateSession:
|
||||||
|
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.foldedLines.push_back(lineNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(*ptrSession)._mainViewFiles.push_back(sfi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} //---feedFileEditViewHistoryParameters()-----
|
||||||
|
|
||||||
|
@ -155,6 +155,8 @@ struct sessionFileInfo : public Position {
|
|||||||
generic_string _fileName;
|
generic_string _fileName;
|
||||||
generic_string _langName;
|
generic_string _langName;
|
||||||
vector<size_t> marks;
|
vector<size_t> marks;
|
||||||
|
//--FLS: xSaveFoldingStateSession: additional vector for saving folding state.
|
||||||
|
vector<size_t> foldedLines;
|
||||||
int _encoding;
|
int _encoding;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1305,6 +1307,8 @@ public:
|
|||||||
void writeShortcuts();
|
void writeShortcuts();
|
||||||
void writeSession(const Session & session, const TCHAR *fileName = NULL);
|
void writeSession(const Session & session, const TCHAR *fileName = NULL);
|
||||||
bool writeFindHistory();
|
bool writeFindHistory();
|
||||||
|
//--FLS: xFileEditViewHistory: new function writeFileEditViewHistory()
|
||||||
|
void writeFileEditViewHistory(const Session & session);
|
||||||
|
|
||||||
|
|
||||||
bool isExistingUserLangName(const TCHAR *newName) const {
|
bool isExistingUserLangName(const TCHAR *newName) const {
|
||||||
@ -1401,6 +1405,14 @@ public:
|
|||||||
|
|
||||||
vector<MenuItemUnit> & getContextMenuItems() {return _contextMenuItems;};
|
vector<MenuItemUnit> & getContextMenuItems() {return _contextMenuItems;};
|
||||||
const Session & getSession() const {return _session;};
|
const Session & getSession() const {return _session;};
|
||||||
|
|
||||||
|
//--FLS: xFileEditViewHistory: new functions for EditViewPerFileHistory
|
||||||
|
Session * getPtrFileEditViewSession() {return &_lastFileEditViewSession;};
|
||||||
|
bool getFileEditViewHistoryRestoreEnabled() const {return _blnFileEditViewHistoryRestoreEnabled;};
|
||||||
|
void setFileEditViewHistoryRestoreEnabled(bool en) { _blnFileEditViewHistoryRestoreEnabled=en;};
|
||||||
|
int getNbMaxFileEditView() const {return _nbMaxFileEditView;};
|
||||||
|
void setNbMaxFileEditView(int nb) { _nbMaxFileEditView = nb;};
|
||||||
|
|
||||||
bool hasCustomContextMenu() const {return !_contextMenuItems.empty();};
|
bool hasCustomContextMenu() const {return !_contextMenuItems.empty();};
|
||||||
|
|
||||||
void setAccelerator(Accelerator *pAccel) {_pAccelerator = pAccel;};
|
void setAccelerator(Accelerator *pAccel) {_pAccelerator = pAccel;};
|
||||||
@ -1568,6 +1580,12 @@ private:
|
|||||||
vector<MenuItemUnit> _contextMenuItems;
|
vector<MenuItemUnit> _contextMenuItems;
|
||||||
Session _session;
|
Session _session;
|
||||||
|
|
||||||
|
//--FLS: xFileEditViewHistory: _lastFileEditViewList for (FileEditViewHistory)
|
||||||
|
Session _lastFileEditViewSession;
|
||||||
|
int _nbMaxFileEditView;
|
||||||
|
//--FLS: xFileEditViewHistory: Parameter setting control for FileEditViewHistory (restores last EditView of files, if true)
|
||||||
|
bool _blnFileEditViewHistoryRestoreEnabled;
|
||||||
|
|
||||||
generic_string _shortcutsPath;
|
generic_string _shortcutsPath;
|
||||||
generic_string _contextMenuPath;
|
generic_string _contextMenuPath;
|
||||||
generic_string _sessionPath;
|
generic_string _sessionPath;
|
||||||
@ -1625,6 +1643,8 @@ private:
|
|||||||
void feedGUIParameters(TiXmlNode *node);
|
void feedGUIParameters(TiXmlNode *node);
|
||||||
void feedKeyWordsParameters(TiXmlNode *node);
|
void feedKeyWordsParameters(TiXmlNode *node);
|
||||||
void feedFileListParameters(TiXmlNode *node);
|
void feedFileListParameters(TiXmlNode *node);
|
||||||
|
//--FLS: xFileEditViewHistory: new function feedFileEditViewHistoryParameters()
|
||||||
|
void feedFileEditViewHistoryParameters(TiXmlNode *node);
|
||||||
void feedScintillaParam(TiXmlNode *node);
|
void feedScintillaParam(TiXmlNode *node);
|
||||||
void feedDockingManager(TiXmlNode *node);
|
void feedDockingManager(TiXmlNode *node);
|
||||||
void feedFindHistoryParameters(TiXmlNode *node);
|
void feedFindHistoryParameters(TiXmlNode *node);
|
||||||
|
@ -269,6 +269,11 @@ void Buffer::setPosition(const Position & pos, ScintillaEditView * identifier) {
|
|||||||
|
|
||||||
Position & Buffer::getPosition(ScintillaEditView * identifier) {
|
Position & Buffer::getPosition(ScintillaEditView * identifier) {
|
||||||
int index = indexOfReference(identifier);
|
int index = indexOfReference(identifier);
|
||||||
|
//--FLS: xFileEditViewHistory: Crashes if index is -1 when buffer is not within given EditView! Therefore, check and return default Position.
|
||||||
|
if (index == -1) {
|
||||||
|
static Position pos; // 'static' because of warning returning local value!
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
return _positions.at(index);
|
return _positions.at(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -716,6 +716,23 @@ BOOL CALLBACK SettingsDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM)
|
|||||||
::SendDlgItemMessage(_hSelf, IDC_CHECK_MIN2SYSTRAY, BM_SETCHECK, nppGUI._isMinimizedToTray, 0);
|
::SendDlgItemMessage(_hSelf, IDC_CHECK_MIN2SYSTRAY, BM_SETCHECK, nppGUI._isMinimizedToTray, 0);
|
||||||
::SendDlgItemMessage(_hSelf, IDC_CHECK_REMEMBERSESSION, BM_SETCHECK, nppGUI._rememberLastSession, 0);
|
::SendDlgItemMessage(_hSelf, IDC_CHECK_REMEMBERSESSION, BM_SETCHECK, nppGUI._rememberLastSession, 0);
|
||||||
::SendDlgItemMessage(_hSelf, IDC_CHECK_AUTOUPDATE, BM_SETCHECK, nppGUI._autoUpdateOpt._doAutoUpdate, 0);
|
::SendDlgItemMessage(_hSelf, IDC_CHECK_AUTOUPDATE, BM_SETCHECK, nppGUI._autoUpdateOpt._doAutoUpdate, 0);
|
||||||
|
|
||||||
|
//--FLS: xFileEditViewHistoryParameterGUI: Initialize Checkbox for enabling the history for restoring the edit view per file.
|
||||||
|
bool boolItem = (pNppParam->getFileEditViewHistoryRestoreEnabled());
|
||||||
|
//--FLS: Only one of the flags _fileEditViewHistoryRestoreEnabled or _rememberLastSession should be enabled!
|
||||||
|
if (boolItem && nppGUI._rememberLastSession)
|
||||||
|
{
|
||||||
|
boolItem = false;
|
||||||
|
(pNppParam->setFileEditViewHistoryRestoreEnabled(boolItem));
|
||||||
|
}
|
||||||
|
::SendDlgItemMessage(_hSelf, IDC_CHECK_REMEMBEREDITVIEWPERFILE, BM_SETCHECK, boolItem, 0);
|
||||||
|
|
||||||
|
//--FLS: xFileEditViewHistoryParameterGUI: Initializing number of files for edit view history per file
|
||||||
|
::SetDlgItemInt(_hSelf, IDC_EDIT_REMEMBEREDITVIEWPERFILE, pNppParam->getNbMaxFileEditView(), FALSE);
|
||||||
|
_nbFileEditViewHistoryVal.init(_hInst, _hSelf);
|
||||||
|
_nbFileEditViewHistoryVal.create(::GetDlgItem(_hSelf, IDC_EDIT_REMEMBEREDITVIEWPERFILE), IDC_EDIT_REMEMBEREDITVIEWPERFILE);
|
||||||
|
|
||||||
|
|
||||||
::ShowWindow(::GetDlgItem(_hSelf, IDC_CHECK_AUTOUPDATE), nppGUI._doesExistUpdater?SW_SHOW:SW_HIDE);
|
::ShowWindow(::GetDlgItem(_hSelf, IDC_CHECK_AUTOUPDATE), nppGUI._doesExistUpdater?SW_SHOW:SW_HIDE);
|
||||||
|
|
||||||
BOOL linkEnable = FALSE;
|
BOOL linkEnable = FALSE;
|
||||||
@ -846,8 +863,45 @@ BOOL CALLBACK SettingsDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM)
|
|||||||
case IDC_CHECK_REMEMBERSESSION:
|
case IDC_CHECK_REMEMBERSESSION:
|
||||||
//::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_REMEMBER_LAST_SESSION, 0);
|
//::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_REMEMBER_LAST_SESSION, 0);
|
||||||
nppGUI._rememberLastSession = isCheckedOrNot(wParam);
|
nppGUI._rememberLastSession = isCheckedOrNot(wParam);
|
||||||
|
//--FLS: xFileEditViewHistoryParameterGUI: Only one of the flags _fileEditViewHistoryRestoreEnabled or _rememberLastSession should be enabled!
|
||||||
|
if (nppGUI._rememberLastSession) {
|
||||||
|
//-- disable IDC_CHECK_REMEMBEREDITVIEWPERFILE
|
||||||
|
(pNppParam->setFileEditViewHistoryRestoreEnabled(false));
|
||||||
|
::SendDlgItemMessage(_hSelf, IDC_CHECK_REMEMBEREDITVIEWPERFILE, BM_SETCHECK, false, 0);
|
||||||
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
//--FLS: xFileEditViewHistoryParameterGUI: Checkbox for enabling the history for restoring the edit view per file.
|
||||||
|
case IDC_CHECK_REMEMBEREDITVIEWPERFILE:
|
||||||
|
{
|
||||||
|
bool isChecked = isCheckedOrNot(wParam);
|
||||||
|
(pNppParam->setFileEditViewHistoryRestoreEnabled(isChecked));
|
||||||
|
//--FLS: Only one of the flags _fileEditViewHistoryRestoreEnabled or _rememberLastSession should be enabled!
|
||||||
|
if (isChecked) {
|
||||||
|
//-- disable IDM_SETTING_REMEMBER_LAST_SESSION
|
||||||
|
nppGUI._rememberLastSession = false;
|
||||||
|
::SendDlgItemMessage(_hSelf, IDC_CHECK_REMEMBERSESSION, BM_SETCHECK, false, 0);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--FLS: xFileEditViewHistoryParameterGUI: Handle number of files for edit view history per file
|
||||||
|
case IDC_EDIT_REMEMBEREDITVIEWPERFILE:
|
||||||
|
{
|
||||||
|
ValueDlg nbFileMaxDlg;
|
||||||
|
nbFileMaxDlg.init(NULL, _hSelf, pNppParam->getNbMaxFileEditView(), TEXT("Max File: "));
|
||||||
|
POINT p;
|
||||||
|
::GetCursorPos(&p);
|
||||||
|
int nbMaxFile = nbFileMaxDlg.doDialog(p);
|
||||||
|
if (nbMaxFile != -1)
|
||||||
|
{
|
||||||
|
pNppParam->setNbMaxFileEditView(nbMaxFile);
|
||||||
|
::SetDlgItemInt(_hSelf, IDC_EDIT_REMEMBEREDITVIEWPERFILE, nbMaxFile, FALSE);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
case IDC_CHECK_ENABLEDOCSWITCHER :
|
case IDC_CHECK_ENABLEDOCSWITCHER :
|
||||||
{
|
{
|
||||||
nppGUI._doTaskList = !nppGUI._doTaskList;
|
nppGUI._doTaskList = !nppGUI._doTaskList;
|
||||||
|
@ -57,7 +57,13 @@ class SettingsDlg : public StaticDialog
|
|||||||
{
|
{
|
||||||
public :
|
public :
|
||||||
SettingsDlg() {};
|
SettingsDlg() {};
|
||||||
|
//--FLS: xFileEditViewHistoryParameterGUI: Number of files in file edit view history list.
|
||||||
|
virtual void destroy() {
|
||||||
|
_nbFileEditViewHistoryVal.destroy();
|
||||||
|
}
|
||||||
private :
|
private :
|
||||||
|
//--FLS: xFileEditViewHistoryParameterGUI: Number of files in file edit view history list.
|
||||||
|
URLCtrl _nbFileEditViewHistoryVal;
|
||||||
BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam);
|
BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -137,6 +137,11 @@
|
|||||||
#define IDC_CHECK_SHORTTITLE (IDD_PREFERENCE_SETTING_BOX + 31)
|
#define IDC_CHECK_SHORTTITLE (IDD_PREFERENCE_SETTING_BOX + 31)
|
||||||
#define IDC_CHECK_SMARTHILITECASESENSITIVE (IDD_PREFERENCE_SETTING_BOX + 32)
|
#define IDC_CHECK_SMARTHILITECASESENSITIVE (IDD_PREFERENCE_SETTING_BOX + 32)
|
||||||
#define IDC_SMARTHILITING_STATIC (IDD_PREFERENCE_SETTING_BOX + 33)
|
#define IDC_SMARTHILITING_STATIC (IDD_PREFERENCE_SETTING_BOX + 33)
|
||||||
|
//-- FLS: xFileEditViewHistoryParameterGUI: Additional Checkbox for enabling the history for restoring the edit view per file.
|
||||||
|
#define IDC_PREFERENCE_OFFSET_FLS 40
|
||||||
|
#define IDC_CHECK_REMEMBEREDITVIEWPERFILE (IDD_PREFERENCE_SETTING_BOX + IDC_PREFERENCE_OFFSET_FLS + 1)
|
||||||
|
#define IDC_REMEMBEREDITVIEWPERFILE_STATIC (IDD_PREFERENCE_SETTING_BOX + IDC_PREFERENCE_OFFSET_FLS + 2)
|
||||||
|
#define IDC_EDIT_REMEMBEREDITVIEWPERFILE (IDD_PREFERENCE_SETTING_BOX + IDC_PREFERENCE_OFFSET_FLS + 3)
|
||||||
|
|
||||||
#define IDD_PREFERENCE_NEWDOCSETTING_BOX 6400 //(IDD_PREFERENCE_BOX + 400)
|
#define IDD_PREFERENCE_NEWDOCSETTING_BOX 6400 //(IDD_PREFERENCE_BOX + 400)
|
||||||
#define IDC_FORMAT_GB_STATIC (IDD_PREFERENCE_NEWDOCSETTING_BOX + 1)
|
#define IDC_FORMAT_GB_STATIC (IDD_PREFERENCE_NEWDOCSETTING_BOX + 1)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user