add setting to toggle fold mode
This commit is contained in:
parent
da1a45f694
commit
70cef75704
8 changed files with 80 additions and 38 deletions
|
|
@ -283,6 +283,7 @@ var docEl = document.getElementById("doc");
|
||||||
var modeEl = document.getElementById("mode");
|
var modeEl = document.getElementById("mode");
|
||||||
var wrapModeEl = document.getElementById("soft_wrap");
|
var wrapModeEl = document.getElementById("soft_wrap");
|
||||||
var themeEl = document.getElementById("theme");
|
var themeEl = document.getElementById("theme");
|
||||||
|
var foldingEl = document.getElementById("folding");
|
||||||
var selectStyleEl = document.getElementById("select_style");
|
var selectStyleEl = document.getElementById("select_style");
|
||||||
var highlightActiveEl = document.getElementById("highlight_active");
|
var highlightActiveEl = document.getElementById("highlight_active");
|
||||||
var showHiddenEl = document.getElementById("show_hidden");
|
var showHiddenEl = document.getElementById("show_hidden");
|
||||||
|
|
@ -324,6 +325,8 @@ function updateUIEditorOptions() {
|
||||||
docEl.value = session.name;
|
docEl.value = session.name;
|
||||||
modeEl.value = session.getMode().name || "text";
|
modeEl.value = session.getMode().name || "text";
|
||||||
|
|
||||||
|
session.setFoldStyle(foldingEl.value);
|
||||||
|
|
||||||
if (!session.getUseWrapMode()) {
|
if (!session.getUseWrapMode()) {
|
||||||
wrapModeEl.value = "off";
|
wrapModeEl.value = "off";
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -365,6 +368,10 @@ bindDropdown("fontsize", function(value) {
|
||||||
env.split.setFontSize(value);
|
env.split.setFontSize(value);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
bindDropdown("folding", function(value) {
|
||||||
|
env.editor.getSession().setFoldStyle(value);
|
||||||
|
});
|
||||||
|
|
||||||
bindDropdown("soft_wrap", function(value) {
|
bindDropdown("soft_wrap", function(value) {
|
||||||
var session = env.editor.getSession();
|
var session = env.editor.getSession();
|
||||||
var renderer = env.editor.renderer;
|
var renderer = env.editor.renderer;
|
||||||
|
|
@ -496,7 +503,7 @@ event.addListener(container, "drop", function(e) {
|
||||||
|
|
||||||
if (window.FileReader) {
|
if (window.FileReader) {
|
||||||
var reader = new FileReader();
|
var reader = new FileReader();
|
||||||
reader.onload = function(e) {
|
reader.onload = function() {
|
||||||
env.editor.getSelection().selectAll();
|
env.editor.getSelection().selectAll();
|
||||||
|
|
||||||
var mode = modesByName.text;
|
var mode = modesByName.text;
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,17 @@
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="folding">Code Folding</label>
|
||||||
|
</td><td>
|
||||||
|
<select id="folding" size="1">
|
||||||
|
<option value="manual">manual</option>
|
||||||
|
<option value="markbegin" selected="selected">mark begin</option>
|
||||||
|
<option value="markbeginend">mark begin and end</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<label for="select_style">Full Line Selection</label>
|
<label for="select_style">Full Line Selection</label>
|
||||||
|
|
|
||||||
|
|
@ -596,22 +596,23 @@ function Folding() {
|
||||||
var re = new RegExp(token.type.replace(/\..*/, "\\."));
|
var re = new RegExp(token.type.replace(/\..*/, "\\."));
|
||||||
do {
|
do {
|
||||||
token = iterator.stepBackward();
|
token = iterator.stepBackward();
|
||||||
} while(token && re.test(token.type))
|
} while(token && re.test(token.type));
|
||||||
|
|
||||||
iterator.stepForward();
|
iterator.stepForward();
|
||||||
range.start.row = iterator.getCurrentTokenRow();
|
range.start.row = iterator.getCurrentTokenRow();
|
||||||
range.start.column = iterator.getCurrentTokenColumn() + 2;
|
range.start.column = iterator.getCurrentTokenColumn() + 2;
|
||||||
|
|
||||||
var iterator = new TokenIterator(this, row, column);
|
iterator = new TokenIterator(this, row, column);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
token = iterator.stepForward();
|
token = iterator.stepForward();
|
||||||
} while(token && re.test(token.type))
|
} while(token && re.test(token.type));
|
||||||
|
|
||||||
token = iterator.stepBackward();
|
token = iterator.stepBackward();
|
||||||
|
|
||||||
range.end.row = iterator.getCurrentTokenRow();
|
range.end.row = iterator.getCurrentTokenRow();
|
||||||
range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 1;
|
range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 1;
|
||||||
return range
|
return range;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -631,28 +632,51 @@ function Folding() {
|
||||||
this.addFold("...", range);
|
this.addFold("...", range);
|
||||||
} catch(e) {}
|
} catch(e) {}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
|
this.$foldStyles = {
|
||||||
|
"manual": 1,
|
||||||
|
"markbegin": 1,
|
||||||
|
"markbeginend": 1
|
||||||
|
};
|
||||||
|
this.$foldStyle = "markbegin";
|
||||||
|
this.setFoldStyle = function(style) {
|
||||||
|
if (!this.$foldStyles[style])
|
||||||
|
throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]");
|
||||||
|
|
||||||
|
if (this.$foldStyle == style)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.$foldStyle = style;
|
||||||
|
|
||||||
|
// reset folding
|
||||||
|
var mode = this.$foldMode;
|
||||||
|
this.$setFolding(null);
|
||||||
|
this.$setFolding(mode);
|
||||||
|
};
|
||||||
|
|
||||||
// structured folding
|
// structured folding
|
||||||
this.$setFolding = function(foldMode) {
|
this.$setFolding = function(foldMode) {
|
||||||
|
|
||||||
if (this.$foldMode == foldMode)
|
if (this.$foldMode == foldMode)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this.$foldMode = foldMode;
|
this.$foldMode = foldMode;
|
||||||
|
|
||||||
this.removeListener('change', this.$updateFoldWidgets);
|
this.removeListener('change', this.$updateFoldWidgets);
|
||||||
|
this._emit("changeAnnotation");
|
||||||
|
|
||||||
if (!foldMode) {
|
if (!foldMode || this.$foldStyle == "manual") {
|
||||||
this.foldWidgets = null;
|
this.foldWidgets = null;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.foldWidgets = [];
|
this.foldWidgets = [];
|
||||||
this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this);
|
this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle);
|
||||||
this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this);
|
this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle);
|
||||||
|
|
||||||
this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);
|
this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);
|
||||||
this.on('change', this.$updateFoldWidgets);
|
this.on('change', this.$updateFoldWidgets);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
this.onFoldWidgetClick = function(row, e) {
|
this.onFoldWidgetClick = function(row, e) {
|
||||||
|
|
|
||||||
|
|
@ -314,7 +314,7 @@ var Editor = function(renderer, session) {
|
||||||
this.renderer.updateLines(rows.first, rows.last);
|
this.renderer.updateLines(rows.first, rows.last);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.onCursorChange = function(e) {
|
this.onCursorChange = function() {
|
||||||
this.renderer.updateCursor();
|
this.renderer.updateCursor();
|
||||||
|
|
||||||
if (!this.$blockScrolling) {
|
if (!this.$blockScrolling) {
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ oop.inherits(FoldMode, BaseFoldMode);
|
||||||
this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
|
this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/;
|
||||||
this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
|
this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/;
|
||||||
|
|
||||||
this.getFoldWidgetRange = function(session, row) {
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
||||||
var line = session.getLine(row);
|
var line = session.getLine(row);
|
||||||
var match = line.match(this.foldingStartMarker);
|
var match = line.match(this.foldingStartMarker);
|
||||||
if (match) {
|
if (match) {
|
||||||
|
|
|
||||||
|
|
@ -49,28 +49,28 @@ var FoldMode = exports.FoldMode = function() {};
|
||||||
this.foldingStopMarker = null;
|
this.foldingStopMarker = null;
|
||||||
|
|
||||||
// must return "" if there's no fold, to enable caching
|
// must return "" if there's no fold, to enable caching
|
||||||
this.getFoldWidget = function(session, row) {
|
this.getFoldWidget = function(session, foldStyle, row) {
|
||||||
if (this.foldingStartMarker) {
|
if (this.foldingStartMarker) {
|
||||||
if (this.foldingStopMarker) {
|
if (this.foldingStopMarker) {
|
||||||
// rewrite getFoldWidget so the check is only performed once
|
// rewrite getFoldWidget so the check is only performed once
|
||||||
FoldMode.prototype.getFoldWidget = this.$testBoth;
|
FoldMode.prototype.getFoldWidget = this.$testBoth;
|
||||||
return this.$testBoth(session, row);
|
return this.$testBoth(session, foldStyle, row);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// rewrite getFoldWidget so the check is only performed once
|
// rewrite getFoldWidget so the check is only performed once
|
||||||
FoldMode.prototype.getFoldWidget = this.$testStart;
|
FoldMode.prototype.getFoldWidget = this.$testStart;
|
||||||
return this.$testStart(session, row);
|
return this.$testStart(session, foldStyle, row);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return "";
|
return "";
|
||||||
};
|
};
|
||||||
|
|
||||||
this.getFoldWidgetRange = function(session, row) {
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.indentationBlock = function(session, row) {
|
this.indentationBlock = function(session, foldStyle, row) {
|
||||||
var re = /^\s*/;
|
var re = /^\s*/;
|
||||||
var startRow = row;
|
var startRow = row;
|
||||||
var endRow = row;
|
var endRow = row;
|
||||||
|
|
@ -96,17 +96,17 @@ var FoldMode = exports.FoldMode = function() {};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
this.$testStart = function(session, row) {
|
this.$testStart = function(session, foldStyle, row) {
|
||||||
if (this.foldingStartMarker.test(session.getLine(row)))
|
if (this.foldingStartMarker.test(session.getLine(row)))
|
||||||
return "start";
|
return "start";
|
||||||
return "";
|
return "";
|
||||||
};
|
};
|
||||||
|
|
||||||
this.$testBoth = function(session, row) {
|
this.$testBoth = function(session, foldStyle, row) {
|
||||||
var line = session.getLine(row);
|
var line = session.getLine(row);
|
||||||
if (this.foldingStartMarker.test(line))
|
if (this.foldingStartMarker.test(line))
|
||||||
return "start";
|
return "start";
|
||||||
if(this.foldingStopMarker.test(line))
|
if (foldStyle == "markbeginend" && this.foldingStopMarker.test(line))
|
||||||
return "end";
|
return "end";
|
||||||
return "";
|
return "";
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -57,29 +57,29 @@ oop.inherits(FoldMode, BaseFoldMode);
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.$tryMode = function(state, session, row) {
|
this.$tryMode = function(state, session, foldStyle, row) {
|
||||||
var mode = this.$getMode(state);
|
var mode = this.$getMode(state);
|
||||||
return (mode ? mode.getFoldWidget(session, row) : "");
|
return (mode ? mode.getFoldWidget(session, foldStyle, row) : "");
|
||||||
};
|
};
|
||||||
|
|
||||||
this.getFoldWidget = function(session, row) {
|
this.getFoldWidget = function(session, foldStyle, row) {
|
||||||
return (
|
return (
|
||||||
this.$tryMode(session.getState(row-1), session, row) ||
|
this.$tryMode(session.getState(row-1), session, foldStyle, row) ||
|
||||||
this.$tryMode(session.getState(row), session, row) ||
|
this.$tryMode(session.getState(row), session, foldStyle, row) ||
|
||||||
this.defaultMode.getFoldWidget(session, row)
|
this.defaultMode.getFoldWidget(session, foldStyle, row)
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.getFoldWidgetRange = function(session, row) {
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
||||||
var mode = this.$getMode(session.getState(row-1));
|
var mode = this.$getMode(session.getState(row-1));
|
||||||
|
|
||||||
if (!mode || !mode.getFoldWidget(session, row))
|
if (!mode || !mode.getFoldWidget(session, foldStyle, row))
|
||||||
mode = this.$getMode(session.getState(row));
|
mode = this.$getMode(session.getState(row));
|
||||||
|
|
||||||
if (!mode || !mode.getFoldWidget(session, row))
|
if (!mode || !mode.getFoldWidget(session, foldStyle, row))
|
||||||
mode = this.defaultMode;
|
mode = this.defaultMode;
|
||||||
|
|
||||||
return mode.getFoldWidgetRange(session, row);
|
return mode.getFoldWidgetRange(session, foldStyle, row);
|
||||||
};
|
};
|
||||||
|
|
||||||
}).call(FoldMode.prototype);
|
}).call(FoldMode.prototype);
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ oop.inherits(FoldMode, BaseFoldMode);
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
|
|
||||||
this.getFoldWidget = function(session, row) {
|
this.getFoldWidget = function(session, foldStyle, row) {
|
||||||
var tags = session.getTokens(row, row)[0].tokens
|
var tags = session.getTokens(row, row)[0].tokens
|
||||||
.filter(function(token) {
|
.filter(function(token) {
|
||||||
return token.type === "meta.tag";
|
return token.type === "meta.tag";
|
||||||
|
|
@ -77,7 +77,7 @@ oop.inherits(FoldMode, BaseFoldMode);
|
||||||
return "start";
|
return "start";
|
||||||
};
|
};
|
||||||
|
|
||||||
this.getFoldWidgetRange = function(session, row) {
|
this.getFoldWidgetRange = function(session, foldStyle, row) {
|
||||||
var start, end;
|
var start, end;
|
||||||
var stack = [];
|
var stack = [];
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue