| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 | 144 |
| 145 this._tokenHighlighter = new WebInspector.CodeMirrorTextEditor.TokenHighligh
ter(this._codeMirror); | 145 this._tokenHighlighter = new WebInspector.CodeMirrorTextEditor.TokenHighligh
ter(this._codeMirror); |
| 146 this._blockIndentController = new WebInspector.CodeMirrorTextEditor.BlockInd
entController(this._codeMirror); | 146 this._blockIndentController = new WebInspector.CodeMirrorTextEditor.BlockInd
entController(this._codeMirror); |
| 147 this._fixWordMovement = new WebInspector.CodeMirrorTextEditor.FixWordMovemen
t(this._codeMirror); | 147 this._fixWordMovement = new WebInspector.CodeMirrorTextEditor.FixWordMovemen
t(this._codeMirror); |
| 148 this._autocompleteController = new WebInspector.CodeMirrorTextEditor.Autocom
pleteController(this, this._codeMirror); | 148 this._autocompleteController = new WebInspector.CodeMirrorTextEditor.Autocom
pleteController(this, this._codeMirror); |
| 149 | 149 |
| 150 this._codeMirror.on("change", this._change.bind(this)); | 150 this._codeMirror.on("change", this._change.bind(this)); |
| 151 this._codeMirror.on("beforeChange", this._beforeChange.bind(this)); | 151 this._codeMirror.on("beforeChange", this._beforeChange.bind(this)); |
| 152 this._codeMirror.on("gutterClick", this._gutterClick.bind(this)); | 152 this._codeMirror.on("gutterClick", this._gutterClick.bind(this)); |
| 153 this._codeMirror.on("cursorActivity", this._cursorActivity.bind(this)); | 153 this._codeMirror.on("cursorActivity", this._cursorActivity.bind(this)); |
| 154 this._codeMirror.on("beforeSelectionChange", this._beforeSelectionChange.bin
d(this)); |
| 154 this._codeMirror.on("scroll", this._scroll.bind(this)); | 155 this._codeMirror.on("scroll", this._scroll.bind(this)); |
| 155 this._codeMirror.on("focus", this._focus.bind(this)); | 156 this._codeMirror.on("focus", this._focus.bind(this)); |
| 156 this._codeMirror.on("blur", this._blur.bind(this)); | 157 this._codeMirror.on("blur", this._blur.bind(this)); |
| 157 this.element.addEventListener("contextmenu", this._contextMenu.bind(this), f
alse); | 158 this.element.addEventListener("contextmenu", this._contextMenu.bind(this), f
alse); |
| 159 /** |
| 160 * @this {WebInspector.CodeMirrorTextEditor} |
| 161 */ |
| 162 function updateAnticipateJumpFlag(value) |
| 163 { |
| 164 this._isHandlingMouseDownEvent = value; |
| 165 } |
| 166 this.element.addEventListener("mousedown", updateAnticipateJumpFlag.bind(thi
s, true), true); |
| 167 this.element.addEventListener("mousedown", updateAnticipateJumpFlag.bind(thi
s, false), false); |
| 158 | 168 |
| 159 this.element.classList.add("fill"); | 169 this.element.classList.add("fill"); |
| 160 this.element.style.overflow = "hidden"; | 170 this.element.style.overflow = "hidden"; |
| 161 this.element.firstChild.classList.add("source-code"); | 171 this.element.firstChild.classList.add("source-code"); |
| 162 this.element.firstChild.classList.add("fill"); | 172 this.element.firstChild.classList.add("fill"); |
| 163 this._elementToWidget = new Map(); | 173 this._elementToWidget = new Map(); |
| 164 this._nestedUpdatesCounter = 0; | 174 this._nestedUpdatesCounter = 0; |
| 165 | 175 |
| 166 this.element.addEventListener("focus", this._handleElementFocus.bind(this),
false); | 176 this.element.addEventListener("focus", this._handleElementFocus.bind(this),
false); |
| 167 this.element.addEventListener("keydown", this._handleKeyDown.bind(this), tru
e); | 177 this.element.addEventListener("keydown", this._handleKeyDown.bind(this), tru
e); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 if (range.endColumn > WebInspector.CodeMirrorTextEditor.maxHighl
ightLength) | 339 if (range.endColumn > WebInspector.CodeMirrorTextEditor.maxHighl
ightLength) |
| 330 this.setSelection(range); | 340 this.setSelection(range); |
| 331 else | 341 else |
| 332 this.setSelection(WebInspector.TextRange.createFromLocation(
range.startLine, range.startColumn)); | 342 this.setSelection(WebInspector.TextRange.createFromLocation(
range.startLine, range.startColumn)); |
| 333 } else { | 343 } else { |
| 334 // Collapse selection to end on search start so that we jump to
next occurence on the first enter press. | 344 // Collapse selection to end on search start so that we jump to
next occurence on the first enter press. |
| 335 this.setSelection(this.selection().collapseToEnd()); | 345 this.setSelection(this.selection().collapseToEnd()); |
| 336 } | 346 } |
| 337 this._tokenHighlighter.highlightSearchResults(regex, range); | 347 this._tokenHighlighter.highlightSearchResults(regex, range); |
| 338 } | 348 } |
| 349 if (!this._selectionBeforeSearch) |
| 350 this._selectionBeforeSearch = this.selection(); |
| 339 this._codeMirror.operation(innerHighlightRegex.bind(this)); | 351 this._codeMirror.operation(innerHighlightRegex.bind(this)); |
| 340 }, | 352 }, |
| 341 | 353 |
| 342 cancelSearchResultsHighlight: function() | 354 cancelSearchResultsHighlight: function() |
| 343 { | 355 { |
| 344 this._codeMirror.operation(this._tokenHighlighter.highlightSelectedToken
s.bind(this._tokenHighlighter)); | 356 this._codeMirror.operation(this._tokenHighlighter.highlightSelectedToken
s.bind(this._tokenHighlighter)); |
| 357 if (this._selectionBeforeSearch) { |
| 358 this._reportJump(this._selectionBeforeSearch, this.selection()); |
| 359 delete this._selectionBeforeSearch; |
| 360 } |
| 345 }, | 361 }, |
| 346 | 362 |
| 347 undo: function() | 363 undo: function() |
| 348 { | 364 { |
| 349 this._codeMirror.undo(); | 365 this._codeMirror.undo(); |
| 350 }, | 366 }, |
| 351 | 367 |
| 352 redo: function() | 368 redo: function() |
| 353 { | 369 { |
| 354 this._codeMirror.redo(); | 370 this._codeMirror.redo(); |
| (...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 800 columnNumber = 0; | 816 columnNumber = 0; |
| 801 | 817 |
| 802 this.clearPositionHighlight(); | 818 this.clearPositionHighlight(); |
| 803 this._highlightedLine = this._codeMirror.getLineHandle(lineNumber); | 819 this._highlightedLine = this._codeMirror.getLineHandle(lineNumber); |
| 804 if (!this._highlightedLine) | 820 if (!this._highlightedLine) |
| 805 return; | 821 return; |
| 806 this.revealLine(lineNumber); | 822 this.revealLine(lineNumber); |
| 807 this._codeMirror.addLineClass(this._highlightedLine, null, "cm-highlight
"); | 823 this._codeMirror.addLineClass(this._highlightedLine, null, "cm-highlight
"); |
| 808 this._clearHighlightTimeout = setTimeout(this.clearPositionHighlight.bin
d(this), 2000); | 824 this._clearHighlightTimeout = setTimeout(this.clearPositionHighlight.bin
d(this), 2000); |
| 809 if (!this.readOnly()) | 825 if (!this.readOnly()) |
| 810 this._codeMirror.setSelection(new CodeMirror.Pos(lineNumber, columnN
umber)); | 826 this.setSelection(WebInspector.TextRange.createFromLocation(lineNumb
er, columnNumber)); |
| 811 }, | 827 }, |
| 812 | 828 |
| 813 clearPositionHighlight: function() | 829 clearPositionHighlight: function() |
| 814 { | 830 { |
| 815 if (this._clearHighlightTimeout) | 831 if (this._clearHighlightTimeout) |
| 816 clearTimeout(this._clearHighlightTimeout); | 832 clearTimeout(this._clearHighlightTimeout); |
| 817 delete this._clearHighlightTimeout; | 833 delete this._clearHighlightTimeout; |
| 818 | 834 |
| 819 if (this._highlightedLine) | 835 if (this._highlightedLine) |
| 820 this._codeMirror.removeLineClass(this._highlightedLine, null, "cm-hi
ghlight"); | 836 this._codeMirror.removeLineClass(this._highlightedLine, null, "cm-hi
ghlight"); |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 986 | 1002 |
| 987 _cursorActivity: function() | 1003 _cursorActivity: function() |
| 988 { | 1004 { |
| 989 var start = this._codeMirror.getCursor("anchor"); | 1005 var start = this._codeMirror.getCursor("anchor"); |
| 990 var end = this._codeMirror.getCursor("head"); | 1006 var end = this._codeMirror.getCursor("head"); |
| 991 this._delegate.selectionChanged(this._toRange(start, end)); | 1007 this._delegate.selectionChanged(this._toRange(start, end)); |
| 992 if (!this._tokenHighlighter.highlightedRegex()) | 1008 if (!this._tokenHighlighter.highlightedRegex()) |
| 993 this._codeMirror.operation(this._tokenHighlighter.highlightSelectedT
okens.bind(this._tokenHighlighter)); | 1009 this._codeMirror.operation(this._tokenHighlighter.highlightSelectedT
okens.bind(this._tokenHighlighter)); |
| 994 }, | 1010 }, |
| 995 | 1011 |
| 1012 /** |
| 1013 * @param {!CodeMirror} codeMirror |
| 1014 * @param {!{head: !CodeMirror.Pos, anchor: !CodeMirror.Pos}} selection |
| 1015 */ |
| 1016 _beforeSelectionChange: function(codeMirror, selection) |
| 1017 { |
| 1018 if (!this._isHandlingMouseDownEvent) |
| 1019 return; |
| 1020 this._reportJump(this.selection(), this._toRange(selection.anchor, selec
tion.head)); |
| 1021 }, |
| 1022 |
| 1023 /** |
| 1024 * @param {?WebInspector.TextRange} from |
| 1025 * @param {?WebInspector.TextRange} to |
| 1026 */ |
| 1027 _reportJump: function(from, to) |
| 1028 { |
| 1029 if (from && to && from.equal(to)) |
| 1030 return; |
| 1031 this._delegate.onJumpToPosition(from, to); |
| 1032 }, |
| 1033 |
| 996 _scroll: function() | 1034 _scroll: function() |
| 997 { | 1035 { |
| 998 if (this._scrollTimer) | 1036 if (this._scrollTimer) |
| 999 clearTimeout(this._scrollTimer); | 1037 clearTimeout(this._scrollTimer); |
| 1000 var topmostLineNumber = this._codeMirror.lineAtHeight(this._codeMirror.g
etScrollInfo().top, "local"); | 1038 var topmostLineNumber = this._codeMirror.lineAtHeight(this._codeMirror.g
etScrollInfo().top, "local"); |
| 1001 this._scrollTimer = setTimeout(this._delegate.scrollChanged.bind(this._d
elegate, topmostLineNumber), 100); | 1039 this._scrollTimer = setTimeout(this._delegate.scrollChanged.bind(this._d
elegate, topmostLineNumber), 100); |
| 1002 }, | 1040 }, |
| 1003 | 1041 |
| 1004 _focus: function() | 1042 _focus: function() |
| 1005 { | 1043 { |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1176 start: new CodeMirror.Pos(range.startLine, range.startColumn), | 1214 start: new CodeMirror.Pos(range.startLine, range.startColumn), |
| 1177 end: new CodeMirror.Pos(range.endLine, range.endColumn) | 1215 end: new CodeMirror.Pos(range.endLine, range.endColumn) |
| 1178 } | 1216 } |
| 1179 }, | 1217 }, |
| 1180 | 1218 |
| 1181 _toRange: function(start, end) | 1219 _toRange: function(start, end) |
| 1182 { | 1220 { |
| 1183 return new WebInspector.TextRange(start.line, start.ch, end.line, end.ch
); | 1221 return new WebInspector.TextRange(start.line, start.ch, end.line, end.ch
); |
| 1184 }, | 1222 }, |
| 1185 | 1223 |
| 1224 /** |
| 1225 * @param {number} lineNumber |
| 1226 * @param {number} columnNumber |
| 1227 * @return {!WebInspector.TextEditorPositionHandle} |
| 1228 */ |
| 1229 textEditorPositionHandle: function(lineNumber, columnNumber) |
| 1230 { |
| 1231 return new WebInspector.CodeMirrorPositionHandle(this._codeMirror, new C
odeMirror.Pos(lineNumber, columnNumber)); |
| 1232 }, |
| 1233 |
| 1186 __proto__: WebInspector.View.prototype | 1234 __proto__: WebInspector.View.prototype |
| 1187 } | 1235 } |
| 1188 | 1236 |
| 1189 /** | 1237 /** |
| 1190 * @constructor | 1238 * @constructor |
| 1239 * @implements {WebInspector.TextEditorPositionHandle} |
| 1240 * @param {!CodeMirror} codeMirror |
| 1241 * @param {!CodeMirror.Pos} pos |
| 1242 */ |
| 1243 WebInspector.CodeMirrorPositionHandle = function(codeMirror, pos) |
| 1244 { |
| 1245 this._codeMirror = codeMirror; |
| 1246 this._lineHandle = codeMirror.getLineHandle(pos.line); |
| 1247 this._columnNumber = pos.ch; |
| 1248 } |
| 1249 |
| 1250 WebInspector.CodeMirrorPositionHandle.prototype = { |
| 1251 /** |
| 1252 * @return {?{lineNumber: number, columnNumber: number}} |
| 1253 */ |
| 1254 resolve: function() |
| 1255 { |
| 1256 var lineNumber = this._codeMirror.getLineNumber(this._lineHandle); |
| 1257 if (typeof lineNumber !== "number") |
| 1258 return null; |
| 1259 return { |
| 1260 lineNumber: lineNumber, |
| 1261 columnNumber: this._columnNumber |
| 1262 }; |
| 1263 }, |
| 1264 |
| 1265 /** |
| 1266 * @param {!WebInspector.TextEditorPositionHandle} positionHandle |
| 1267 * @return {boolean} |
| 1268 */ |
| 1269 equal: function(positionHandle) |
| 1270 { |
| 1271 return positionHandle._lineHandle === this._lineHandle && positionHandle
._columnNumber == this._columnNumber && positionHandle._codeMirror === this._cod
eMirror; |
| 1272 } |
| 1273 } |
| 1274 |
| 1275 /** |
| 1276 * @constructor |
| 1191 * @param {!CodeMirror} codeMirror | 1277 * @param {!CodeMirror} codeMirror |
| 1192 */ | 1278 */ |
| 1193 WebInspector.CodeMirrorTextEditor.TokenHighlighter = function(codeMirror) | 1279 WebInspector.CodeMirrorTextEditor.TokenHighlighter = function(codeMirror) |
| 1194 { | 1280 { |
| 1195 this._codeMirror = codeMirror; | 1281 this._codeMirror = codeMirror; |
| 1196 } | 1282 } |
| 1197 | 1283 |
| 1198 WebInspector.CodeMirrorTextEditor.TokenHighlighter.prototype = { | 1284 WebInspector.CodeMirrorTextEditor.TokenHighlighter.prototype = { |
| 1199 /** | 1285 /** |
| 1200 * @param {!RegExp} regex | 1286 * @param {!RegExp} regex |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1591 * @param {number} line | 1677 * @param {number} line |
| 1592 * @param {number} column | 1678 * @param {number} column |
| 1593 * @return {?AnchorBox} | 1679 * @return {?AnchorBox} |
| 1594 */ | 1680 */ |
| 1595 _anchorBoxForPosition: function(line, column) | 1681 _anchorBoxForPosition: function(line, column) |
| 1596 { | 1682 { |
| 1597 var metrics = this._textEditor.cursorPositionToCoordinates(line, column)
; | 1683 var metrics = this._textEditor.cursorPositionToCoordinates(line, column)
; |
| 1598 return metrics ? new AnchorBox(metrics.x, metrics.y, 0, metrics.height)
: null; | 1684 return metrics ? new AnchorBox(metrics.x, metrics.y, 0, metrics.height)
: null; |
| 1599 }, | 1685 }, |
| 1600 } | 1686 } |
| OLD | NEW |