Improve folding/unfolding performance for large files

- Use the Scintilla dedicated command SCI_FOLDALL to replace the inefficient loop for "Fold All" command.
- Fix "Fold level" & switching back to large files folding performance.
- Refactoring the hide/show lines functions.

Note that there might be a regression of URL link:
https://github.com/notepad-plus-plus/notepad-plus-plus/pull/16200/files#r1961937279

The commit is based on code of #16064.

Fix #16064, close #16200
This commit is contained in:
Don Ho 2025-02-17 13:37:43 +01:00
parent a52738c1dd
commit 83755ca155
7 changed files with 242 additions and 210 deletions

View File

@ -2227,7 +2227,7 @@ void Notepad_plus::command(int id)
case IDM_VIEW_FOLD_7: case IDM_VIEW_FOLD_7:
case IDM_VIEW_FOLD_8: case IDM_VIEW_FOLD_8:
_isFolding = true; // So we can ignore events while folding is taking place _isFolding = true; // So we can ignore events while folding is taking place
_pEditView->collapse(id - IDM_VIEW_FOLD - 1, fold_collapse); _pEditView->foldLevel(id - IDM_VIEW_FOLD - 1, fold_collapse);
_isFolding = false; _isFolding = false;
break; break;
@ -2240,7 +2240,7 @@ void Notepad_plus::command(int id)
case IDM_VIEW_UNFOLD_7: case IDM_VIEW_UNFOLD_7:
case IDM_VIEW_UNFOLD_8: case IDM_VIEW_UNFOLD_8:
_isFolding = true; // So we can ignore events while folding is taking place _isFolding = true; // So we can ignore events while folding is taking place
_pEditView->collapse(id - IDM_VIEW_UNFOLD - 1, fold_expand); _pEditView->foldLevel(id - IDM_VIEW_UNFOLD - 1, fold_expand);
_isFolding = false; _isFolding = false;
break; break;

View File

@ -147,7 +147,7 @@ BOOL Notepad_plus::notify(SCNotification *notification)
} }
else if ((notification->margin == ScintillaEditView::_SC_MARGE_SYMBOL) && !notification->modifiers) else if ((notification->margin == ScintillaEditView::_SC_MARGE_SYMBOL) && !notification->modifiers)
{ {
if (!_pEditView->markerMarginClick(lineClick)) if (!_pEditView->hidelineMarkerClicked(lineClick))
bookmarkToggle(lineClick); bookmarkToggle(lineClick);
} }
break; break;
@ -180,28 +180,6 @@ BOOL Notepad_plus::notify(SCNotification *notification)
break; break;
} }
case SCN_FOLDINGSTATECHANGED:
{
if ((notification->nmhdr.hwndFrom == _mainEditView.getHSelf()) || (notification->nmhdr.hwndFrom == _subEditView.getHSelf()))
{
size_t lineClicked = notification->line;
if (!_isFolding)
{
int urlAction = (NppParameters::getInstance()).getNppGUI()._styleURL;
Buffer* currentBuf = _pEditView->getCurrentBuffer();
if (urlAction != urlDisable && currentBuf->allowClickableLink())
{
addHotSpot();
}
}
if (_pDocMap)
_pDocMap->fold(lineClicked, _pEditView->isFolded(lineClicked));
}
return TRUE;
}
case SCN_CHARADDED: case SCN_CHARADDED:
{ {
if (!notifyView) return FALSE; if (!notifyView) return FALSE;
@ -582,6 +560,30 @@ BOOL Notepad_plus::notify(SCNotification *notification)
// ======= End of SCN_* // ======= End of SCN_*
// //
case SCN_FOLDINGSTATECHANGED: // Notification not part of Scintilla, but Notepad++ added
{
if ((notification->nmhdr.hwndFrom == _mainEditView.getHSelf()) || (notification->nmhdr.hwndFrom == _subEditView.getHSelf()))
{
size_t lineClicked = notification->line;
/*
if (!_isFolding)
{
int urlAction = (NppParameters::getInstance()).getNppGUI()._styleURL;
Buffer* currentBuf = _pEditView->getCurrentBuffer();
if (urlAction != urlDisable && currentBuf->allowClickableLink())
{
addHotSpot();
}
}
*/
if (_pDocMap)
_pDocMap->fold(lineClicked, _pEditView->isFolded(lineClicked));
}
return TRUE;
}
case TCN_MOUSEHOVERING: case TCN_MOUSEHOVERING:
case TCN_MOUSEHOVERSWITCHING: case TCN_MOUSEHOVERSWITCHING:

View File

@ -649,13 +649,13 @@ void Buffer::setHideLineChanged(bool isHide, size_t location)
{ {
//First run through all docs without removing markers //First run through all docs without removing markers
for (int i = 0; i < _references; ++i) for (int i = 0; i < _references; ++i)
_referees.at(i)->notifyMarkers(this, isHide, location, false); // (i == _references-1)); _referees.at(i)->notifyHidelineMarkers(this, isHide, location, false); // (i == _references-1));
if (!isHide) // no deleting if hiding lines if (!isHide) // no deleting if hiding lines
{ {
//Then all docs to remove markers. //Then all docs to remove markers.
for (int i = 0; i < _references; ++i) for (int i = 0; i < _references; ++i)
_referees.at(i)->notifyMarkers(this, isHide, location, true); _referees.at(i)->notifyHidelineMarkers(this, isHide, location, true);
} }
} }

View File

@ -5581,7 +5581,7 @@ void Finder::beginNewFilesSearch()
_nbFoundFiles = 0; _nbFoundFiles = 0;
// fold all old searches (1st level only) // fold all old searches (1st level only)
_scintView.collapse(searchHeaderLevel - SC_FOLDLEVELBASE, fold_collapse); _scintView.foldLevel(searchHeaderLevel - SC_FOLDLEVELBASE, fold_collapse);
} }
void Finder::finishFilesSearch(int count, int searchedCount, bool searchedEntireNotSelection, const FindOption* pFindOpt) void Finder::finishFilesSearch(int count, int searchedCount, bool searchedEntireNotSelection, const FindOption* pFindOpt)

View File

@ -2399,10 +2399,7 @@ void ScintillaEditView::activateBuffer(BufferID buffer, bool force)
syncFoldStateWith(lineStateVectorNew); syncFoldStateWith(lineStateVectorNew);
restoreCurrentPosPreStep(); restoreCurrentPosPreStep();
//runMarkers(true, 0, true, false);
restoreHiddenLines(); restoreHiddenLines();
setCRLF(); setCRLF();
NppParameters& nppParam = NppParameters::getInstance(); NppParameters& nppParam = NppParameters::getInstance();
@ -2448,10 +2445,24 @@ void ScintillaEditView::getCurrentFoldStates(std::vector<size_t> & lineStateVect
void ScintillaEditView::syncFoldStateWith(const std::vector<size_t> & lineStateVectorNew) void ScintillaEditView::syncFoldStateWith(const std::vector<size_t> & lineStateVectorNew)
{ {
size_t nbLineState = lineStateVectorNew.size(); size_t nbLineState = lineStateVectorNew.size();
for (size_t i = 0 ; i < nbLineState ; ++i)
if (nbLineState > 0)
{ {
auto line = lineStateVectorNew.at(i); if (nbLineState > MAX_FOLD_LINES_MORE_THAN) // Block WM_SETREDRAW messages
fold(line, false); ::SendMessage(_hSelf, WM_SETREDRAW, FALSE, 0);
for (size_t i = 0; i < nbLineState; ++i)
{
auto line = lineStateVectorNew.at(i);
fold(line, fold_collapse, false);
}
if (nbLineState > MAX_FOLD_LINES_MORE_THAN)
{
::SendMessage(_hSelf, WM_SETREDRAW, TRUE, 0);
execute(SCI_SCROLLCARET);
::InvalidateRect(_hSelf, nullptr, TRUE);
}
} }
} }
@ -2537,16 +2548,19 @@ struct FoldLevelStack
} }
void ScintillaEditView::collapseFoldIndentationBased(int level2Collapse, bool mode) void ScintillaEditView::foldIndentationBasedLevel(int level2Collapse, bool mode)
{ {
execute(SCI_COLOURISE, 0, -1);
FoldLevelStack levelStack; FoldLevelStack levelStack;
++level2Collapse; // 1-based level number ++level2Collapse; // 1-based level number
const intptr_t maxLine = execute(SCI_GETLINECOUNT); const intptr_t maxLine = execute(SCI_GETLINECOUNT);
intptr_t line = 0; intptr_t line = 0;
if (maxLine > MAX_FOLD_LINES_MORE_THAN)
{
::SendMessage(_hSelf, WM_SETREDRAW, FALSE, 0);
}
while (line < maxLine) while (line < maxLine)
{ {
intptr_t level = execute(SCI_GETFOLDLEVEL, line); intptr_t level = execute(SCI_GETFOLDLEVEL, line);
@ -2568,21 +2582,34 @@ void ScintillaEditView::collapseFoldIndentationBased(int level2Collapse, bool mo
++line; ++line;
} }
runMarkers(true, 0, true, false); if (maxLine > MAX_FOLD_LINES_MORE_THAN)
{
::SendMessage(_hSelf, WM_SETREDRAW, TRUE, 0);
execute(SCI_SCROLLCARET);
::InvalidateRect(_hSelf, nullptr, TRUE);
}
if (mode == fold_expand)
hideMarkedLines(0, true);
} }
void ScintillaEditView::collapse(int level2Collapse, bool mode)
void ScintillaEditView::foldLevel(int level2Collapse, bool mode)
{ {
if (isFoldIndentationBased()) if (isFoldIndentationBased())
{ {
collapseFoldIndentationBased(level2Collapse, mode); foldIndentationBasedLevel(level2Collapse, mode);
return; return;
} }
execute(SCI_COLOURISE, 0, -1);
intptr_t maxLine = execute(SCI_GETLINECOUNT); intptr_t maxLine = execute(SCI_GETLINECOUNT);
if (maxLine > MAX_FOLD_LINES_MORE_THAN)
{
::SendMessage(_hSelf, WM_SETREDRAW, FALSE, 0);
}
for (int line = 0; line < maxLine; ++line) for (int line = 0; line < maxLine; ++line)
{ {
intptr_t level = execute(SCI_GETFOLDLEVEL, line); intptr_t level = execute(SCI_GETFOLDLEVEL, line);
@ -2597,7 +2624,15 @@ void ScintillaEditView::collapse(int level2Collapse, bool mode)
} }
} }
runMarkers(true, 0, true, false); if (maxLine > MAX_FOLD_LINES_MORE_THAN)
{
::SendMessage(_hSelf, WM_SETREDRAW, TRUE, 0);
execute(SCI_SCROLLCARET);
::InvalidateRect(_hSelf, nullptr, TRUE);
}
if (mode == fold_expand)
hideMarkedLines(0, true);
} }
void ScintillaEditView::foldCurrentPos(bool mode) void ScintillaEditView::foldCurrentPos(bool mode)
@ -2626,14 +2661,8 @@ bool ScintillaEditView::isCurrentLineFolded() const
return !isExpanded; return !isExpanded;
} }
void ScintillaEditView::fold(size_t line, bool mode) void ScintillaEditView::fold(size_t line, bool mode, bool shouldBeNotified/* = true*/)
{ {
auto endStyled = execute(SCI_GETENDSTYLED);
auto len = execute(SCI_GETTEXTLENGTH);
if (endStyled < len)
execute(SCI_COLOURISE, 0, -1);
intptr_t headerLine; intptr_t headerLine;
auto level = execute(SCI_GETFOLDLEVEL, line); auto level = execute(SCI_GETFOLDLEVEL, line);
@ -2650,27 +2679,27 @@ void ScintillaEditView::fold(size_t line, bool mode)
{ {
execute(SCI_TOGGLEFOLD, headerLine); execute(SCI_TOGGLEFOLD, headerLine);
SCNotification scnN{}; if (shouldBeNotified)
scnN.nmhdr.code = SCN_FOLDINGSTATECHANGED; {
scnN.nmhdr.hwndFrom = _hSelf; SCNotification scnN{};
scnN.nmhdr.idFrom = 0; scnN.nmhdr.code = SCN_FOLDINGSTATECHANGED;
scnN.line = headerLine; scnN.nmhdr.hwndFrom = _hSelf;
scnN.foldLevelNow = isFolded(headerLine)?1:0; //folded:1, unfolded:0 scnN.nmhdr.idFrom = 0;
scnN.line = headerLine;
::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast<LPARAM>(&scnN)); scnN.foldLevelNow = isFolded(headerLine) ? 1 : 0; //folded:1, unfolded:0
::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast<LPARAM>(&scnN));
}
} }
} }
void ScintillaEditView::foldAll(bool mode) void ScintillaEditView::foldAll(bool mode)
{ {
auto maxLine = execute(SCI_GETLINECOUNT); execute(SCI_FOLDALL, (mode == fold_expand ? SC_FOLDACTION_EXPAND : SC_FOLDACTION_CONTRACT) | SC_FOLDACTION_CONTRACT_EVERY_LEVEL, 0);
for (int line = 0; line < maxLine; ++line) if (mode == fold_expand)
{ {
auto level = execute(SCI_GETFOLDLEVEL, line); hideMarkedLines(0, true);
if (level & SC_FOLDLEVELHEADERFLAG) execute(SCI_SCROLLCARET);
if (isFolded(line) != mode)
fold(line, mode);
} }
} }
@ -3015,7 +3044,9 @@ void ScintillaEditView::marginClick(Sci_Position position, int modifiers)
// Toggle this line // Toggle this line
bool mode = isFolded(lineClick); bool mode = isFolded(lineClick);
fold(lineClick, !mode); fold(lineClick, !mode);
runMarkers(true, lineClick, true, false);
if (!mode == fold_expand) // after toggling
hideMarkedLines(lineClick, true);
} }
} }
} }
@ -3067,7 +3098,8 @@ void ScintillaEditView::expand(size_t& line, bool doExpand, bool force, intptr_t
++line; ++line;
} }
runMarkers(true, 0, true, false); if (doExpand)
hideMarkedLines(0, true);
} }
@ -4015,19 +4047,21 @@ void ScintillaEditView::scrollPosToCenter(size_t pos)
void ScintillaEditView::hideLines() void ScintillaEditView::hideLines()
{ {
//Folding can screw up hide lines badly if it unfolds a hidden section. // Unfolding can screw up hide lines badly if it unfolds a hidden section.
//Adding runMarkers(hide, foldstart) directly (folding on single document) can help // Using hideMarkedLines() after unfolding can help
//Special func on buffer. If markers are added, create notification with location of start, and hide bool set to true
size_t startLine = execute(SCI_LINEFROMPOSITION, execute(SCI_GETSELECTIONSTART)); size_t startLine = execute(SCI_LINEFROMPOSITION, execute(SCI_GETSELECTIONSTART));
size_t endLine = execute(SCI_LINEFROMPOSITION, execute(SCI_GETSELECTIONEND)); size_t endLine = execute(SCI_LINEFROMPOSITION, execute(SCI_GETSELECTIONEND));
//perform range check: cannot hide very first and very last lines
//Offset them one off the edges, and then check if they are within the reasonable // perform range check: cannot hide very first and very last lines
// Offset them one off the edges, and then check if they are within the reasonable
size_t nbLines = execute(SCI_GETLINECOUNT); size_t nbLines = execute(SCI_GETLINECOUNT);
if (nbLines < 3) if (nbLines < 3)
return; //cannot possibly hide anything return; //cannot possibly hide anything
if (!startLine) if (!startLine)
++startLine; ++startLine;
if (endLine == (nbLines-1)) if (endLine == (nbLines-1))
--endLine; --endLine;
@ -4064,8 +4098,10 @@ void ScintillaEditView::hideLines()
// Previous markers must be removed in the selected region: // Previous markers must be removed in the selected region:
removeMarker(startMarker, 1 << MARK_HIDELINESBEGIN); removeMarker(startMarker, 1 << MARK_HIDELINESBEGIN);
for (size_t i = startLine; i <= endLine; ++i) for (size_t i = startLine; i <= endLine; ++i)
removeMarker(i, (1 << MARK_HIDELINESBEGIN) | (1 << MARK_HIDELINESEND)); removeMarker(i, (1 << MARK_HIDELINESBEGIN) | (1 << MARK_HIDELINESEND));
removeMarker(endMarker, 1 << MARK_HIDELINESEND); removeMarker(endMarker, 1 << MARK_HIDELINESEND);
// When hiding lines just below/above other hidden lines, // When hiding lines just below/above other hidden lines,
@ -4100,7 +4136,7 @@ void ScintillaEditView::hideLines()
_currentBuffer->setHideLineChanged(true, startMarker); _currentBuffer->setHideLineChanged(true, startMarker);
} }
bool ScintillaEditView::markerMarginClick(intptr_t lineNumber) bool ScintillaEditView::hidelineMarkerClicked(intptr_t lineNumber)
{ {
auto state = execute(SCI_MARKERGET, lineNumber); auto state = execute(SCI_MARKERGET, lineNumber);
bool openPresent = (state & (1 << MARK_HIDELINESBEGIN)) != 0; bool openPresent = (state & (1 << MARK_HIDELINESBEGIN)) != 0;
@ -4139,136 +4175,148 @@ bool ScintillaEditView::markerMarginClick(intptr_t lineNumber)
return true; return true;
} }
void ScintillaEditView::notifyMarkers(Buffer * buf, bool isHide, size_t location, bool del) void ScintillaEditView::notifyHidelineMarkers(Buffer * buf, bool isHide, size_t location, bool del)
{ {
if (buf != _currentBuffer) //if not visible buffer dont do a thing if (buf != _currentBuffer) //if not visible buffer dont do a thing
return; return;
runMarkers(isHide, location, false, del);
if (isHide)
hideMarkedLines(location, false);
else
showHiddenLines(location, false, del);
} }
//Run through full document. When switching in or opening folding //Run through full document. When switching in or opening folding
//hide is false only when user click on margin //hide is false only when user click on margin
void ScintillaEditView::runMarkers(bool doHide, size_t searchStart, bool endOfDoc, bool doDelete)
{
//Removes markers if opening
/*
AllLines = (start,ENDOFDOCUMENT)
Hide:
Run through all lines.
Find open hiding marker:
set hiding start
Find closing:
if (hiding):
Hide lines between now and start
if (endOfDoc = false)
return
else
search for other hidden sections
Show: //Removes markers if opening
Run through all lines /*
Find open hiding marker AllLines = (start,ENDOFDOCUMENT)
set last start Hide:
Find closing: Run through all lines.
Show from last start. Stop. Find open hiding marker:
Find closed folding header: set hiding start
Show from last start to folding header Find closing:
Skip to LASTCHILD if (hiding):
Set last start to lastchild Hide lines between now and start
*/ if (endOfDoc = false)
return
else
search for other hidden sections
Show:
Run through all lines
Find open hiding marker
set last start
Find closing:
Show from last start. Stop.
Find closed folding header:
Show from last start to folding header
Skip to LASTCHILD
Set last start to lastchild
*/
void ScintillaEditView::hideMarkedLines(size_t searchStart, bool toEndOfDoc)
{
size_t maxLines = execute(SCI_GETLINECOUNT); size_t maxLines = execute(SCI_GETLINECOUNT);
if (doHide)
auto startHiding = searchStart;
bool isInSection = false;
for (auto i = searchStart; i < maxLines; ++i)
{ {
auto startHiding = searchStart; auto state = execute(SCI_MARKERGET, i);
bool isInSection = false; if ( ((state & (1 << MARK_HIDELINESEND)) != 0) )
for (auto i = searchStart; i < maxLines; ++i)
{ {
auto state = execute(SCI_MARKERGET, i); if (isInSection)
if ( ((state & (1 << MARK_HIDELINESEND)) != 0) )
{ {
if (isInSection) execute(SCI_HIDELINES, startHiding, i-1);
if (!toEndOfDoc)
{ {
execute(SCI_HIDELINES, startHiding, i-1); return; //done, only single section requested
if (!endOfDoc) } //otherwise keep going
{ }
return; //done, only single section requested isInSection = false;
} //otherwise keep going }
}
if ((state & (1 << MARK_HIDELINESBEGIN)) != 0)
{
isInSection = true;
startHiding = i+1;
}
}
}
void ScintillaEditView::showHiddenLines(size_t searchStart, bool toEndOfDoc, bool doDelete)
{
size_t maxLines = execute(SCI_GETLINECOUNT);
auto startShowing = searchStart;
bool isInSection = false;
for (auto i = searchStart; i < maxLines; ++i)
{
auto state = execute(SCI_MARKERGET, i);
if ((state & (1 << MARK_HIDELINESBEGIN)) != 0 && !isInSection)
{
isInSection = true;
if (doDelete)
{
execute(SCI_MARKERDELETE, i, MARK_HIDELINESBEGIN);
}
else
{
startShowing = i + 1;
}
}
else if ( (state & (1 << MARK_HIDELINESEND)) != 0)
{
if (doDelete)
{
execute(SCI_MARKERDELETE, i, MARK_HIDELINESEND);
if (!toEndOfDoc)
{
return; //done, only single section requested
} //otherwise keep going
isInSection = false; isInSection = false;
} }
if ((state & (1 << MARK_HIDELINESBEGIN)) != 0) else if (isInSection)
{ {
isInSection = true; if (startShowing >= i)
startHiding = i+1; { //because of fold skipping, we passed the close tag. In that case we cant do anything
} if (!toEndOfDoc)
}
}
else
{
auto startShowing = searchStart;
bool isInSection = false;
for (auto i = searchStart; i < maxLines; ++i)
{
auto state = execute(SCI_MARKERGET, i);
if ((state & (1 << MARK_HIDELINESBEGIN)) != 0 && !isInSection)
{
isInSection = true;
if (doDelete)
{
execute(SCI_MARKERDELETE, i, MARK_HIDELINESBEGIN);
}
else
{
startShowing = i + 1;
}
}
else if ( (state & (1 << MARK_HIDELINESEND)) != 0)
{
if (doDelete)
{
execute(SCI_MARKERDELETE, i, MARK_HIDELINESEND);
if (!endOfDoc)
{ {
return; //done, only single section requested return;
} //otherwise keep going
isInSection = false;
}
else if (isInSection)
{
if (startShowing >= i)
{ //because of fold skipping, we passed the close tag. In that case we cant do anything
if (!endOfDoc)
{
return;
}
else
{
isInSection = false; // assume we passed the close tag
continue;
}
} }
execute(SCI_SHOWLINES, startShowing, i-1); else
if (!endOfDoc)
{ {
return; //done, only single section requested isInSection = false; // assume we passed the close tag
} //otherwise keep going continue;
isInSection = false; }
} }
}
auto levelLine = execute(SCI_GETFOLDLEVEL, i, 0); execute(SCI_SHOWLINES, startShowing, i-1);
if (levelLine & SC_FOLDLEVELHEADERFLAG)
{ //fold section. Dont show lines if fold is closed if (!toEndOfDoc)
if (isInSection && !isFolded(i))
{ {
execute(SCI_SHOWLINES, startShowing, i); return; //done, only single section requested
} } //otherwise keep going
isInSection = false;
}
}
auto levelLine = execute(SCI_GETFOLDLEVEL, i, 0);
if (levelLine & SC_FOLDLEVELHEADERFLAG)
{ //fold section. Dont show lines if fold is closed
if (isInSection && !isFolded(i))
{
execute(SCI_SHOWLINES, startShowing, i);
} }
} }
} }
} }
void ScintillaEditView::restoreHiddenLines() void ScintillaEditView::restoreHiddenLines()
{ {
int line = 0; int line = 0;
@ -4285,7 +4333,6 @@ void ScintillaEditView::restoreHiddenLines()
if (line != -1) if (line != -1)
{ {
execute(SCI_HIDELINES, startHiding, line - 1); execute(SCI_HIDELINES, startHiding, line - 1);
} }
} }
} }

View File

@ -68,8 +68,6 @@ typedef void * SCINTILLA_PTR;
#define WM_FINDINPROJECTS (SCINTILLA_USER + 15) #define WM_FINDINPROJECTS (SCINTILLA_USER + 15)
#define WM_REPLACEINPROJECTS (SCINTILLA_USER + 16) #define WM_REPLACEINPROJECTS (SCINTILLA_USER + 16)
const int NB_FOLDER_STATE = 7;
// Codepage // Codepage
const int CP_CHINESE_TRADITIONAL = 950; const int CP_CHINESE_TRADITIONAL = 950;
const int CP_CHINESE_SIMPLIFIED = 936; const int CP_CHINESE_SIMPLIFIED = 936;
@ -89,9 +87,13 @@ const int CP_GREEK = 1253;
#define LIST_7 128 #define LIST_7 128
#define LIST_8 256 #define LIST_8 256
const bool fold_expand = true; const bool fold_expand = true;
const bool fold_collapse = false; const bool fold_collapse = false;
const int NB_FOLDER_STATE = 7;
#define MAX_FOLD_COLLAPSE_LEVEL 8 #define MAX_FOLD_COLLAPSE_LEVEL 8
#define MAX_FOLD_LINES_MORE_THAN 99
#define MODEVENTMASK_OFF 0 #define MODEVENTMASK_OFF 0
@ -454,8 +456,7 @@ public:
void activateBuffer(BufferID buffer, bool force); void activateBuffer(BufferID buffer, bool force);
void getCurrentFoldStates(std::vector<size_t> & lineStateVector);
void syncFoldStateWith(const std::vector<size_t> & lineStateVectorNew);
void getText(char *dest, size_t start, size_t end) const; void getText(char *dest, size_t start, size_t end) const;
void getGenericText(wchar_t *dest, size_t destlen, size_t start, size_t end) const; void getGenericText(wchar_t *dest, size_t destlen, size_t start, size_t end) const;
@ -740,8 +741,6 @@ public:
void updateLineNumberWidth(); void updateLineNumberWidth();
void performGlobalStyles(); void performGlobalStyles();
void expand(size_t& line, bool doExpand, bool force = false, intptr_t visLevels = 0, intptr_t level = -1);
std::pair<size_t, size_t> getSelectionLinesRange(intptr_t selectionNumber = -1) const; std::pair<size_t, size_t> getSelectionLinesRange(intptr_t selectionNumber = -1) const;
void currentLinesUp() const; void currentLinesUp() const;
void currentLinesDown() const; void currentLinesDown() const;
@ -775,14 +774,18 @@ public:
::MessageBox(_hSelf, L"This function needs a newer OS version.", L"Change Case Error", MB_OK | MB_ICONHAND); ::MessageBox(_hSelf, L"This function needs a newer OS version.", L"Change Case Error", MB_OK | MB_ICONHAND);
}; };
void getCurrentFoldStates(std::vector<size_t> & lineStateVector);
void syncFoldStateWith(const std::vector<size_t> & lineStateVectorNew);
bool isFoldIndentationBased() const; bool isFoldIndentationBased() const;
void collapseFoldIndentationBased(int level2Collapse, bool mode); void foldIndentationBasedLevel(int level, bool mode);
void collapse(int level2Collapse, bool mode); void foldLevel(int level, bool mode);
void foldAll(bool mode); void foldAll(bool mode);
void fold(size_t line, bool mode); void fold(size_t line, bool mode, bool shouldBeNotified = true);
bool isFolded(size_t line) const { bool isFolded(size_t line) const {
return (execute(SCI_GETFOLDEXPANDED, line) != 0); return (execute(SCI_GETFOLDEXPANDED, line) != 0);
}; };
void expand(size_t& line, bool doExpand, bool force = false, intptr_t visLevels = 0, intptr_t level = -1);
bool isCurrentLineFolded() const; bool isCurrentLineFolded() const;
void foldCurrentPos(bool mode); void foldCurrentPos(bool mode);
int getCodepage() const {return _codepage;}; int getCodepage() const {return _codepage;};
@ -810,34 +813,14 @@ public:
void styleChange(); void styleChange();
void hideLines(); void hideLines();
bool hidelineMarkerClicked(intptr_t lineNumber); //true if it did something
bool markerMarginClick(intptr_t lineNumber); //true if it did something void notifyHidelineMarkers(Buffer * buf, bool isHide, size_t location, bool del);
void notifyMarkers(Buffer * buf, bool isHide, size_t location, bool del); void hideMarkedLines(size_t searchStart, bool endOfDoc);
void runMarkers(bool doHide, size_t searchStart, bool endOfDoc, bool doDelete); void showHiddenLines(size_t searchStart, bool endOfDoc, bool doDelete);
void restoreHiddenLines(); void restoreHiddenLines();
bool hasSelection() const { return !execute(SCI_GETSELECTIONEMPTY); }; bool hasSelection() const { return !execute(SCI_GETSELECTIONEMPTY); };
bool isSelecting() const {
static Sci_CharacterRangeFull previousSelRange = getSelection();
Sci_CharacterRangeFull currentSelRange = getSelection();
if (currentSelRange.cpMin == currentSelRange.cpMax)
{
previousSelRange = currentSelRange;
return false;
}
if ((previousSelRange.cpMin == currentSelRange.cpMin) || (previousSelRange.cpMax == currentSelRange.cpMax))
{
previousSelRange = currentSelRange;
return true;
}
previousSelRange = currentSelRange;
return false;
};
bool isPythonStyleIndentation(LangType typeDoc) const{ bool isPythonStyleIndentation(LangType typeDoc) const{
return (typeDoc == L_PYTHON || typeDoc == L_COFFEESCRIPT || typeDoc == L_HASKELL ||\ return (typeDoc == L_PYTHON || typeDoc == L_COFFEESCRIPT || typeDoc == L_HASKELL ||\
typeDoc == L_C || typeDoc == L_CPP || typeDoc == L_OBJC || typeDoc == L_CS || typeDoc == L_JAVA ||\ typeDoc == L_C || typeDoc == L_CPP || typeDoc == L_OBJC || typeDoc == L_CS || typeDoc == L_JAVA ||\

View File

@ -293,7 +293,7 @@ void DocumentMap::doMove()
void DocumentMap::fold(size_t line, bool foldOrNot) void DocumentMap::fold(size_t line, bool foldOrNot)
{ {
_pMapView->fold(line, foldOrNot); _pMapView->fold(line, foldOrNot, false);
} }
void DocumentMap::foldAll(bool mode) void DocumentMap::foldAll(bool mode)