this.element.addEventListener("textInput", this._handleTextInput.bind(this), false);
this.element.addEventListener("cut", this._handleCut.bind(this), false);
+ this._showWhitespace = WebInspector.settings.showWhitespaceInEditor.get();
+ this._handleShowWhitespaceInEditorChange = this._handleShowWhitespaceInEditorChange.bind(this);
+
this._container.addEventListener("focus", this._handleFocused.bind(this), false);
this._highlightDescriptors = [];
this._registerShortcuts();
}
+WebInspector.TextEditorMainPanel._ConsecutiveWhitespaceChars = {
+ 1: " ",
+ 2: " ",
+ 4: " ",
+ 8: " ",
+ 16: " "
+};
+
WebInspector.TextEditorMainPanel.prototype = {
_registerShortcuts: function()
{
this._shortcuts[WebInspector.KeyboardShortcut.makeKey(keys.Tab.code, modifiers.Shift)] = handleShiftTabKey;
},
+ _handleShowWhitespaceInEditorChange: function()
+ {
+ this._showWhitespace = WebInspector.settings.showWhitespaceInEditor.get();
+ var visibleFrom = this.scrollTop();
+ var visibleTo = visibleFrom + this.clientHeight();
+
+ if (!visibleTo)
+ return;
+
+ var result = this.findVisibleChunks(visibleFrom, visibleTo);
+ var startLine = this._textChunks[result.start].startLine;
+ var endLine = this._textChunks[result.end - 1].startLine + this._textChunks[result.end - 1].linesCount;
+ this._paintLines(startLine, endLine + 1);
+ },
+
/**
* @param {string} regex
* @param {string} cssClass
wasShown: function()
{
+ WebInspector.settings.showWhitespaceInEditor.addChangeListener(this._handleShowWhitespaceInEditorChange);
+
this._boundSelectionChangeListener = this._handleSelectionChange.bind(this);
document.addEventListener("selectionchange", this._boundSelectionChangeListener, false);
willHide: function()
{
+ WebInspector.settings.showWhitespaceInEditor.removeChangeListener(this._handleShowWhitespaceInEditorChange);
+
document.removeEventListener("selectionchange", this._boundSelectionChangeListener, false);
delete this._boundSelectionChangeListener;
* @param {Element} lineRow
* @param {string} line
* @param {Array.<{startColumn: number, endColumn: number, token: ?string}>} ranges
+ * @param {boolean=} splitWhitespaceSequences
*/
- _renderRanges: function(lineRow, line, ranges)
+ _renderRanges: function(lineRow, line, ranges, splitWhitespaceSequences)
{
var decorationsElement = lineRow.decorationsElement;
for(var i = 0; i < ranges.length; i++) {
var rangeStart = ranges[i].startColumn;
var rangeEnd = ranges[i].endColumn;
- var cssClass = ranges[i].token ? "webkit-" + ranges[i].token : "";
if (plainTextStart < rangeStart) {
this._insertTextNodeBefore(lineRow, decorationsElement, line.substring(plainTextStart, rangeStart));
}
- this._insertSpanBefore(lineRow, decorationsElement, line.substring(rangeStart, rangeEnd + 1), cssClass);
+
+ if (splitWhitespaceSequences && ranges[i].token === "whitespace")
+ this._renderWhitespaceCharsWithFixedSizeSpans(lineRow, decorationsElement, rangeEnd - rangeStart + 1);
+ else
+ this._insertSpanBefore(lineRow, decorationsElement, line.substring(rangeStart, rangeEnd + 1), ranges[i].token ? "webkit-" + ranges[i].token : "");
plainTextStart = rangeEnd + 1;
}
if (plainTextStart < line.length) {
}
},
+ /**
+ * @param {Element} lineRow
+ * @param {Element} decorationsElement
+ * @param {number} length
+ */
+ _renderWhitespaceCharsWithFixedSizeSpans: function(lineRow, decorationsElement, length)
+ {
+ for (var whitespaceLength = 16; whitespaceLength > 0; whitespaceLength >>= 1) {
+ var cssClass = "webkit-whitespace webkit-whitespace-" + whitespaceLength;
+ for (; length >= whitespaceLength; length -= whitespaceLength)
+ this._insertSpanBefore(lineRow, decorationsElement, WebInspector.TextEditorMainPanel._ConsecutiveWhitespaceChars[whitespaceLength], cssClass);
+ }
+ },
+
/**
* @param {Element} lineRow
* @param {Array.<WebInspector.TextEditorMainPanel.LineOverlayHighlight>} overlayHighlight
var line = this._textModel.line(lineNumber);
var ranges = syntaxHighlight.ranges;
- this._renderRanges(lineRow, line, ranges);
+ this._renderRanges(lineRow, line, ranges, this._showWhitespace);
if (overlayHighlight)
for(var i = 0; i < overlayHighlight.length; ++i)