aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorMarkus Nißl <devnull@localhost>2016-01-31 14:23:34 +1100
committerMarkus Nißl <devnull@localhost>2016-01-31 14:23:34 +1100
commita9880d7d2bba46107f7e700b707c06ea82124269 (patch)
tree9237bfe3acd56cbc14da0ad786023ffb2263a30d /src
parent36eb6b04ed060d7600f6eae682bc4a97d82089ac (diff)
downloadscintilla-mirror-a9880d7d2bba46107f7e700b707c06ea82124269.tar.gz
Bug [#1799]. Folds unfolded when two fold regions are merged by either deleting
an intervening line or changing its fold level by adding characters. Add LevelNumber function to simplify expressions implmenting folding.
Diffstat (limited to 'src')
-rw-r--r--src/Document.h4
-rw-r--r--src/Editor.cxx17
2 files changed, 21 insertions, 0 deletions
diff --git a/src/Document.h b/src/Document.h
index cc3873f59..d82aa46b5 100644
--- a/src/Document.h
+++ b/src/Document.h
@@ -171,6 +171,10 @@ public:
class Document;
+inline int LevelNumber(int level) {
+ return level & SC_FOLDLEVELNUMBERMASK;
+}
+
class LexInterface {
protected:
Document *pdoc;
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 08248a3d9..d9bc37694 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -5422,12 +5422,20 @@ void Editor::FoldChanged(int line, int levelNow, int levelPrev) {
FoldExpand(line, SC_FOLDACTION_EXPAND, levelPrev);
}
} else if (levelPrev & SC_FOLDLEVELHEADERFLAG) {
+ const int prevLine = line - 1;
+ const int prevLineLevel = pdoc->GetLevel(prevLine);
+
+ // Combining two blocks where the first block is collapsed (e.g. by deleting the line(s) which separate(s) the two blocks)
+ if ((LevelNumber(prevLineLevel) == LevelNumber(levelNow)) && !cs.GetVisible(prevLine))
+ FoldLine(pdoc->GetFoldParent(prevLine), SC_FOLDACTION_EXPAND);
+
if (!cs.GetExpanded(line)) {
// Removing the fold from one that has been contracted so should expand
// otherwise lines are left invisible with no way to make them visible
if (cs.SetExpanded(line, true)) {
RedrawSelMargin();
}
+ // Combining two blocks where the second one is collapsed (e.g. by adding characters in the line which separates the two blocks)
FoldExpand(line, SC_FOLDACTION_EXPAND, levelPrev);
}
}
@@ -5443,6 +5451,15 @@ void Editor::FoldChanged(int line, int levelNow, int levelPrev) {
}
}
}
+
+ // Combining two blocks where the first one is collapsed (e.g. by adding characters in the line which separates the two blocks)
+ if (!(levelNow & SC_FOLDLEVELWHITEFLAG) && (LevelNumber(levelPrev) < LevelNumber(levelNow))) {
+ if (cs.HiddenLines()) {
+ const int parentLine = pdoc->GetFoldParent(line);
+ if (!cs.GetExpanded(parentLine) && cs.GetExpanded(line))
+ FoldLine(parentLine, SC_FOLDACTION_EXPAND);
+ }
+ }
}
void Editor::NeedShown(int pos, int len) {