Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Side by Side Diff: Source/devtools/front_end/CodeMirrorTextEditor.js

Issue 219583002: DevTools: [CodeMirror] Implement "select next occurrence" functionality (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: do not use tokenHighlighter with multiple selections Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 "End": "goLineEnd", 82 "End": "goLineEnd",
83 "Home": "goLineStartSmart", 83 "Home": "goLineStartSmart",
84 "PageUp": "goPageUp", 84 "PageUp": "goPageUp",
85 "PageDown": "goPageDown", 85 "PageDown": "goPageDown",
86 "Delete": "delCharAfter", 86 "Delete": "delCharAfter",
87 "Backspace": "delCharBefore", 87 "Backspace": "delCharBefore",
88 "Tab": "defaultTab", 88 "Tab": "defaultTab",
89 "Shift-Tab": "indentLess", 89 "Shift-Tab": "indentLess",
90 "Enter": "smartNewlineAndIndent", 90 "Enter": "smartNewlineAndIndent",
91 "Ctrl-Space": "autocomplete", 91 "Ctrl-Space": "autocomplete",
92 "Ctrl-D": "selectNextOccurrence",
92 "Esc": "dismissMultipleSelections" 93 "Esc": "dismissMultipleSelections"
93 }; 94 };
94 95
95 CodeMirror.keyMap["devtools-pc"] = { 96 CodeMirror.keyMap["devtools-pc"] = {
96 "Ctrl-A": "selectAll", 97 "Ctrl-A": "selectAll",
97 "Ctrl-Z": "undoAndReveal", 98 "Ctrl-Z": "undoAndReveal",
98 "Shift-Ctrl-Z": "redoAndReveal", 99 "Shift-Ctrl-Z": "redoAndReveal",
99 "Ctrl-Y": "redo", 100 "Ctrl-Y": "redo",
100 "Ctrl-Home": "goDocStart", 101 "Ctrl-Home": "goDocStart",
101 "Ctrl-Up": "goDocStart", 102 "Ctrl-Up": "goDocStart",
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 this._codeMirror.setOption("keyMap", WebInspector.isMac() ? "devtools-mac" : "devtools-pc"); 137 this._codeMirror.setOption("keyMap", WebInspector.isMac() ? "devtools-mac" : "devtools-pc");
137 this._codeMirror.setOption("flattenSpans", false); 138 this._codeMirror.setOption("flattenSpans", false);
138 139
139 this._codeMirror.setOption("maxHighlightLength", WebInspector.CodeMirrorText Editor.maxHighlightLength); 140 this._codeMirror.setOption("maxHighlightLength", WebInspector.CodeMirrorText Editor.maxHighlightLength);
140 this._codeMirror.setOption("mode", null); 141 this._codeMirror.setOption("mode", null);
141 this._codeMirror.setOption("crudeMeasuringFrom", 1000); 142 this._codeMirror.setOption("crudeMeasuringFrom", 1000);
142 143
143 this._shouldClearHistory = true; 144 this._shouldClearHistory = true;
144 this._lineSeparator = "\n"; 145 this._lineSeparator = "\n";
145 146
146 this._tokenHighlighter = new WebInspector.CodeMirrorTextEditor.TokenHighligh ter(this._codeMirror); 147 this._tokenHighlighter = new WebInspector.CodeMirrorTextEditor.TokenHighligh ter(this, this._codeMirror);
147 this._blockIndentController = new WebInspector.CodeMirrorTextEditor.BlockInd entController(this._codeMirror); 148 this._blockIndentController = new WebInspector.CodeMirrorTextEditor.BlockInd entController(this._codeMirror);
148 this._fixWordMovement = new WebInspector.CodeMirrorTextEditor.FixWordMovemen t(this._codeMirror); 149 this._fixWordMovement = new WebInspector.CodeMirrorTextEditor.FixWordMovemen t(this._codeMirror);
149 this._autocompleteController = new WebInspector.CodeMirrorTextEditor.Autocom pleteController(this, this._codeMirror); 150 this._autocompleteController = new WebInspector.CodeMirrorTextEditor.Autocom pleteController(this, this._codeMirror);
151 this._selectNextOccurrenceController = new WebInspector.CodeMirrorTextEditor .SelectNextOccurrenceController(this, this._codeMirror);
150 152
151 this._codeMirror.on("changes", this._changes.bind(this)); 153 this._codeMirror.on("changes", this._changes.bind(this));
152 this._codeMirror.on("beforeChange", this._beforeChange.bind(this)); 154 this._codeMirror.on("beforeChange", this._beforeChange.bind(this));
153 this._codeMirror.on("gutterClick", this._gutterClick.bind(this)); 155 this._codeMirror.on("gutterClick", this._gutterClick.bind(this));
154 this._codeMirror.on("cursorActivity", this._cursorActivity.bind(this)); 156 this._codeMirror.on("cursorActivity", this._cursorActivity.bind(this));
155 this._codeMirror.on("beforeSelectionChange", this._beforeSelectionChange.bin d(this)); 157 this._codeMirror.on("beforeSelectionChange", this._beforeSelectionChange.bin d(this));
156 this._codeMirror.on("scroll", this._scroll.bind(this)); 158 this._codeMirror.on("scroll", this._scroll.bind(this));
157 this._codeMirror.on("focus", this._focus.bind(this)); 159 this._codeMirror.on("focus", this._focus.bind(this));
158 this._codeMirror.on("blur", this._blur.bind(this)); 160 this._codeMirror.on("blur", this._blur.bind(this));
159 this.element.addEventListener("contextmenu", this._contextMenu.bind(this), f alse); 161 this.element.addEventListener("contextmenu", this._contextMenu.bind(this), f alse);
(...skipping 22 matching lines...) Expand all
182 } 184 }
183 185
184 /** @typedef {{canceled: boolean, from: CodeMirror.Pos, to: CodeMirror.Pos, text : string, origin: string, cancel: function()}} */ 186 /** @typedef {{canceled: boolean, from: CodeMirror.Pos, to: CodeMirror.Pos, text : string, origin: string, cancel: function()}} */
185 WebInspector.CodeMirrorTextEditor.BeforeChangeObject; 187 WebInspector.CodeMirrorTextEditor.BeforeChangeObject;
186 188
187 /** @typedef {{from: CodeMirror.Pos, to: CodeMirror.Pos, origin: string, text: ! Array.<string>, removed: !Array.<string>}} */ 189 /** @typedef {{from: CodeMirror.Pos, to: CodeMirror.Pos, origin: string, text: ! Array.<string>, removed: !Array.<string>}} */
188 WebInspector.CodeMirrorTextEditor.ChangeObject; 190 WebInspector.CodeMirrorTextEditor.ChangeObject;
189 191
190 WebInspector.CodeMirrorTextEditor.maxHighlightLength = 1000; 192 WebInspector.CodeMirrorTextEditor.maxHighlightLength = 1000;
191 193
194 /**
195 * @param {!CodeMirror} codeMirror
196 */
192 WebInspector.CodeMirrorTextEditor.autocompleteCommand = function(codeMirror) 197 WebInspector.CodeMirrorTextEditor.autocompleteCommand = function(codeMirror)
193 { 198 {
194 codeMirror._codeMirrorTextEditor._autocompleteController.autocomplete(); 199 codeMirror._codeMirrorTextEditor._autocompleteController.autocomplete();
195 } 200 }
196 CodeMirror.commands.autocomplete = WebInspector.CodeMirrorTextEditor.autocomplet eCommand; 201 CodeMirror.commands.autocomplete = WebInspector.CodeMirrorTextEditor.autocomplet eCommand;
197 202
203 /**
204 * @param {!CodeMirror} codeMirror
205 */
206 WebInspector.CodeMirrorTextEditor.selectNextOccurrenceCommand = function(codeMir ror)
207 {
208 codeMirror._codeMirrorTextEditor._selectNextOccurrenceController.selectNextO ccurrence();
209 }
210 CodeMirror.commands.selectNextOccurrence = WebInspector.CodeMirrorTextEditor.sel ectNextOccurrenceCommand;
211
212 /**
213 * @param {!CodeMirror} codeMirror
214 */
198 CodeMirror.commands.smartNewlineAndIndent = function(codeMirror) 215 CodeMirror.commands.smartNewlineAndIndent = function(codeMirror)
199 { 216 {
200 codeMirror.operation(innerSmartNewlineAndIndent.bind(null, codeMirror)); 217 codeMirror.operation(innerSmartNewlineAndIndent.bind(null, codeMirror));
201 218
202 function countIndent(line) 219 function countIndent(line)
203 { 220 {
204 for (var i = 0; i < line.length; ++i) { 221 for (var i = 0; i < line.length; ++i) {
205 if (!WebInspector.TextUtils.isSpaceChar(line[i])) 222 if (!WebInspector.TextUtils.isSpaceChar(line[i]))
206 return i; 223 return i;
207 } 224 }
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 */ 365 */
349 function innerHighlightRegex() 366 function innerHighlightRegex()
350 { 367 {
351 if (range) { 368 if (range) {
352 this._revealLine(range.startLine); 369 this._revealLine(range.startLine);
353 if (range.endColumn > WebInspector.CodeMirrorTextEditor.maxHighl ightLength) 370 if (range.endColumn > WebInspector.CodeMirrorTextEditor.maxHighl ightLength)
354 this.setSelection(range); 371 this.setSelection(range);
355 else 372 else
356 this.setSelection(WebInspector.TextRange.createFromLocation( range.startLine, range.startColumn)); 373 this.setSelection(WebInspector.TextRange.createFromLocation( range.startLine, range.startColumn));
357 } else { 374 } else {
358 // Collapse selection to end on search start so that we jump to next occurence on the first enter press. 375 // Collapse selection to end on search start so that we jump to next occurrence on the first enter press.
359 this.setSelection(this.selection().collapseToEnd()); 376 this.setSelection(this.selection().collapseToEnd());
360 } 377 }
361 this._tokenHighlighter.highlightSearchResults(regex, range); 378 this._tokenHighlighter.highlightSearchResults(regex, range);
362 } 379 }
363 if (!this._selectionBeforeSearch) 380 if (!this._selectionBeforeSearch)
364 this._selectionBeforeSearch = this.selection(); 381 this._selectionBeforeSearch = this.selection();
365 this._codeMirror.operation(innerHighlightRegex.bind(this)); 382 this._codeMirror.operation(innerHighlightRegex.bind(this));
366 }, 383 },
367 384
368 cancelSearchResultsHighlight: function() 385 cancelSearchResultsHighlight: function()
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 var newRange = this._toRange(pos.start, this._codeMirror.posFromIndex(th is._codeMirror.indexFromPos(pos.start) + text.length)); 923 var newRange = this._toRange(pos.start, this._codeMirror.posFromIndex(th is._codeMirror.indexFromPos(pos.start) + text.length));
907 this._delegate.onTextChanged(range, newRange); 924 this._delegate.onTextChanged(range, newRange);
908 if (WebInspector.settings.textEditorAutoDetectIndent.get()) 925 if (WebInspector.settings.textEditorAutoDetectIndent.get())
909 this._updateEditorIndentation(); 926 this._updateEditorIndentation();
910 return newRange; 927 return newRange;
911 }, 928 },
912 929
913 /** 930 /**
914 * @param {number} lineNumber 931 * @param {number} lineNumber
915 * @param {number} column 932 * @param {number} column
916 * @param {boolean=} prefixOnly
917 * @return {?WebInspector.TextRange} 933 * @return {?WebInspector.TextRange}
918 */ 934 */
919 _wordRangeForCursorPosition: function(lineNumber, column, prefixOnly) 935 _wordRangeForCursorPosition: function(lineNumber, column)
920 { 936 {
921 var line = this.line(lineNumber); 937 var line = this.line(lineNumber);
922 if (column === 0 || !WebInspector.TextUtils.isWordChar(line.charAt(colum n - 1))) 938 var wordStart = column;
923 return null; 939 if (column !== 0 && WebInspector.TextUtils.isWordChar(line.charAt(column - 1))) {
924 var wordStart = column - 1; 940 wordStart = column - 1;
925 while (wordStart > 0 && WebInspector.TextUtils.isWordChar(line.charAt(wo rdStart - 1))) 941 while (wordStart > 0 && WebInspector.TextUtils.isWordChar(line.charA t(wordStart - 1)))
926 --wordStart; 942 --wordStart;
927 if (prefixOnly) 943 }
928 return new WebInspector.TextRange(lineNumber, wordStart, lineNumber, column);
929 var wordEnd = column; 944 var wordEnd = column;
930 while (wordEnd < line.length && WebInspector.TextUtils.isWordChar(line.c harAt(wordEnd))) 945 while (wordEnd < line.length && WebInspector.TextUtils.isWordChar(line.c harAt(wordEnd)))
931 ++wordEnd; 946 ++wordEnd;
932 return new WebInspector.TextRange(lineNumber, wordStart, lineNumber, wor dEnd); 947 return new WebInspector.TextRange(lineNumber, wordStart, lineNumber, wor dEnd);
933 }, 948 },
934 949
935 /** 950 /**
936 * @param {!CodeMirror} codeMirror 951 * @param {!CodeMirror} codeMirror
937 * @param {!WebInspector.CodeMirrorTextEditor.BeforeChangeObject} changeObje ct 952 * @param {!WebInspector.CodeMirrorTextEditor.BeforeChangeObject} changeObje ct
938 */ 953 */
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1013 if (!this._tokenHighlighter.highlightedRegex()) 1028 if (!this._tokenHighlighter.highlightedRegex())
1014 this._codeMirror.operation(this._tokenHighlighter.highlightSelectedT okens.bind(this._tokenHighlighter)); 1029 this._codeMirror.operation(this._tokenHighlighter.highlightSelectedT okens.bind(this._tokenHighlighter));
1015 }, 1030 },
1016 1031
1017 /** 1032 /**
1018 * @param {!CodeMirror} codeMirror 1033 * @param {!CodeMirror} codeMirror
1019 * @param {{ranges: !Array.<{head: !CodeMirror.Pos, anchor: !CodeMirror.Pos} >}} selection 1034 * @param {{ranges: !Array.<{head: !CodeMirror.Pos, anchor: !CodeMirror.Pos} >}} selection
1020 */ 1035 */
1021 _beforeSelectionChange: function(codeMirror, selection) 1036 _beforeSelectionChange: function(codeMirror, selection)
1022 { 1037 {
1038 this._selectNextOccurrenceController.selectionWillChange();
1023 if (!this._isHandlingMouseDownEvent) 1039 if (!this._isHandlingMouseDownEvent)
1024 return; 1040 return;
1025 if (!selection.ranges.length) 1041 if (!selection.ranges.length)
1026 return; 1042 return;
1027 var primarySelection = selection.ranges[0]; 1043 var primarySelection = selection.ranges[0];
1028 this._reportJump(this.selection(), this._toRange(primarySelection.anchor , primarySelection.head)); 1044 this._reportJump(this.selection(), this._toRange(primarySelection.anchor , primarySelection.head));
1029 }, 1045 },
1030 1046
1031 /** 1047 /**
1032 * @param {?WebInspector.TextRange} from 1048 * @param {?WebInspector.TextRange} from
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1089 */ 1105 */
1090 selection: function() 1106 selection: function()
1091 { 1107 {
1092 var start = this._codeMirror.getCursor("anchor"); 1108 var start = this._codeMirror.getCursor("anchor");
1093 var end = this._codeMirror.getCursor("head"); 1109 var end = this._codeMirror.getCursor("head");
1094 1110
1095 return this._toRange(start, end); 1111 return this._toRange(start, end);
1096 }, 1112 },
1097 1113
1098 /** 1114 /**
1115 * @return {!Array.<!WebInspector.TextRange>}
1116 */
1117 selections: function()
1118 {
1119 var selectionList = this._codeMirror.listSelections();
1120 var result = [];
1121 for (var i = 0; i < selectionList.length; ++i) {
1122 var selection = selectionList[i];
1123 result.push(this._toRange(selection.anchor, selection.head));
1124 }
1125 return result;
1126 },
1127
1128 /**
1099 * @return {?WebInspector.TextRange} 1129 * @return {?WebInspector.TextRange}
1100 */ 1130 */
1101 lastSelection: function() 1131 lastSelection: function()
1102 { 1132 {
1103 return this._lastSelection; 1133 return this._lastSelection;
1104 }, 1134 },
1105 1135
1106 /** 1136 /**
1107 * @param {!WebInspector.TextRange} textRange 1137 * @param {!WebInspector.TextRange} textRange
1108 */ 1138 */
1109 setSelection: function(textRange) 1139 setSelection: function(textRange)
1110 { 1140 {
1111 this._lastSelection = textRange; 1141 this._lastSelection = textRange;
1112 var pos = this._toPos(textRange); 1142 var pos = this._toPos(textRange);
1113 this._codeMirror.setSelection(pos.start, pos.end); 1143 this._codeMirror.setSelection(pos.start, pos.end);
1114 }, 1144 },
1115 1145
1116 /** 1146 /**
1147 * @param {!Array.<!WebInspector.TextRange>} ranges
1148 */
1149 setSelections: function(ranges)
1150 {
1151 var selections = [];
1152 for (var i = 0; i < ranges.length; ++i) {
1153 var selection = this._toPos(ranges[i]);
1154 selections.push({
1155 anchor: selection.start,
1156 head: selection.end
1157 });
1158 }
1159 this._codeMirror.setSelections(selections, 0, { scroll: false });
1160 },
1161
1162 /**
1117 * @param {string} text 1163 * @param {string} text
1118 */ 1164 */
1119 _detectLineSeparator: function(text) 1165 _detectLineSeparator: function(text)
1120 { 1166 {
1121 this._lineSeparator = text.indexOf("\r\n") >= 0 ? "\r\n" : "\n"; 1167 this._lineSeparator = text.indexOf("\r\n") >= 0 ? "\r\n" : "\n";
1122 }, 1168 },
1123 1169
1124 /** 1170 /**
1125 * @param {string} text 1171 * @param {string} text
1126 */ 1172 */
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
1280 * @return {boolean} 1326 * @return {boolean}
1281 */ 1327 */
1282 equal: function(positionHandle) 1328 equal: function(positionHandle)
1283 { 1329 {
1284 return positionHandle._lineHandle === this._lineHandle && positionHandle ._columnNumber == this._columnNumber && positionHandle._codeMirror === this._cod eMirror; 1330 return positionHandle._lineHandle === this._lineHandle && positionHandle ._columnNumber == this._columnNumber && positionHandle._codeMirror === this._cod eMirror;
1285 } 1331 }
1286 } 1332 }
1287 1333
1288 /** 1334 /**
1289 * @constructor 1335 * @constructor
1336 * @param {!WebInspector.CodeMirrorTextEditor} textEditor
1290 * @param {!CodeMirror} codeMirror 1337 * @param {!CodeMirror} codeMirror
1291 */ 1338 */
1292 WebInspector.CodeMirrorTextEditor.TokenHighlighter = function(codeMirror) 1339 WebInspector.CodeMirrorTextEditor.TokenHighlighter = function(textEditor, codeMi rror)
1293 { 1340 {
1341 this._textEditor = textEditor;
1294 this._codeMirror = codeMirror; 1342 this._codeMirror = codeMirror;
1295 } 1343 }
1296 1344
1297 WebInspector.CodeMirrorTextEditor.TokenHighlighter.prototype = { 1345 WebInspector.CodeMirrorTextEditor.TokenHighlighter.prototype = {
1298 /** 1346 /**
1299 * @param {!RegExp} regex 1347 * @param {!RegExp} regex
1300 * @param {?WebInspector.TextRange} range 1348 * @param {?WebInspector.TextRange} range
1301 */ 1349 */
1302 highlightSearchResults: function(regex, range) 1350 highlightSearchResults: function(regex, range)
1303 { 1351 {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1344 this._codeMirror.removeLineClass(this._highlightDescriptor.selection Start.line, "wrap", "cm-line-with-selection"); 1392 this._codeMirror.removeLineClass(this._highlightDescriptor.selection Start.line, "wrap", "cm-line-with-selection");
1345 this._removeHighlight(); 1393 this._removeHighlight();
1346 var selectionStart = this._codeMirror.getCursor("start"); 1394 var selectionStart = this._codeMirror.getCursor("start");
1347 var selectionEnd = this._codeMirror.getCursor("end"); 1395 var selectionEnd = this._codeMirror.getCursor("end");
1348 if (selectionStart.line !== selectionEnd.line) 1396 if (selectionStart.line !== selectionEnd.line)
1349 return; 1397 return;
1350 if (selectionStart.ch === selectionEnd.ch) 1398 if (selectionStart.ch === selectionEnd.ch)
1351 return; 1399 return;
1352 1400
1353 var selections = this._codeMirror.getSelections(); 1401 var selections = this._codeMirror.getSelections();
1354 if (selections.length !== 1) 1402 if (selections.length > 1)
1355 return; 1403 return;
1356 var selectedText = selections[0]; 1404 var selectedText = selections[0];
1357 if (this._isWord(selectedText, selectionStart.line, selectionStart.ch, s electionEnd.ch)) { 1405 if (this._isWord(selectedText, selectionStart.line, selectionStart.ch, s electionEnd.ch)) {
1358 if (selectionStart) 1406 if (selectionStart)
1359 this._codeMirror.addLineClass(selectionStart.line, "wrap", "cm-l ine-with-selection") 1407 this._codeMirror.addLineClass(selectionStart.line, "wrap", "cm-l ine-with-selection")
1360 this._setHighlighter(this._tokenHighlighter.bind(this, selectedText, selectionStart), selectionStart); 1408 this._setHighlighter(this._tokenHighlighter.bind(this, selectedText, selectionStart), selectionStart);
1361 } 1409 }
1362 }, 1410 },
1363 1411
1364 /** 1412 /**
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
1578 WebInspector.CodeMirrorTextEditor.AutocompleteController.prototype = { 1626 WebInspector.CodeMirrorTextEditor.AutocompleteController.prototype = {
1579 /** 1627 /**
1580 * @param {!WebInspector.TextRange} mainSelection 1628 * @param {!WebInspector.TextRange} mainSelection
1581 * @param {!Array.<!{head: !CodeMirror.Pos, anchor: !CodeMirror.Pos}>} selec tions 1629 * @param {!Array.<!{head: !CodeMirror.Pos, anchor: !CodeMirror.Pos}>} selec tions
1582 * @return {boolean} 1630 * @return {boolean}
1583 */ 1631 */
1584 _validateSelectionsContexts: function(mainSelection, selections) 1632 _validateSelectionsContexts: function(mainSelection, selections)
1585 { 1633 {
1586 var mainSelectionContext = this._textEditor.copyRange(mainSelection); 1634 var mainSelectionContext = this._textEditor.copyRange(mainSelection);
1587 for (var i = 0; i < selections.length; ++i) { 1635 for (var i = 0; i < selections.length; ++i) {
1588 var wordRange = this._textEditor._wordRangeForCursorPosition(selecti ons[i].head.line, selections[i].head.ch, false); 1636 var wordRange = this._textEditor._wordRangeForCursorPosition(selecti ons[i].head.line, selections[i].head.ch);
1589 if (!wordRange) 1637 if (!wordRange)
1590 return false; 1638 return false;
1591 var context = this._textEditor.copyRange(wordRange); 1639 var context = this._textEditor.copyRange(wordRange);
1592 if (context !== mainSelectionContext) 1640 if (context !== mainSelectionContext)
1593 return false; 1641 return false;
1594 } 1642 }
1595 return true; 1643 return true;
1596 }, 1644 },
1597 1645
1598 autocomplete: function() 1646 autocomplete: function()
1599 { 1647 {
1600 var dictionary = this._textEditor._dictionary; 1648 var dictionary = this._textEditor._dictionary;
1601 if (!dictionary || this._codeMirror.somethingSelected()) { 1649 if (!dictionary || this._codeMirror.somethingSelected()) {
1602 this.finishAutocomplete(); 1650 this.finishAutocomplete();
1603 return; 1651 return;
1604 } 1652 }
1605 1653
1606 var selections = this._codeMirror.listSelections().slice(); 1654 var selections = this._codeMirror.listSelections().slice();
1607 var topSelection = selections.shift(); 1655 var topSelection = selections.shift();
1608 var cursor = topSelection.head; 1656 var cursor = topSelection.head;
1609 var substituteRange = this._textEditor._wordRangeForCursorPosition(curso r.line, cursor.ch, false); 1657 var substituteRange = this._textEditor._wordRangeForCursorPosition(curso r.line, cursor.ch);
1610 if (!substituteRange || substituteRange.startColumn === cursor.ch || !th is._validateSelectionsContexts(substituteRange, selections)) { 1658 if (!substituteRange || substituteRange.startColumn === cursor.ch || !th is._validateSelectionsContexts(substituteRange, selections)) {
1611 this.finishAutocomplete(); 1659 this.finishAutocomplete();
1612 return; 1660 return;
1613 } 1661 }
1614 1662
1615 var prefixRange = substituteRange.clone(); 1663 var prefixRange = substituteRange.clone();
1616 prefixRange.endColumn = cursor.ch; 1664 prefixRange.endColumn = cursor.ch;
1617 1665
1618 var substituteWord = this._textEditor.copyRange(substituteRange); 1666 var substituteWord = this._textEditor.copyRange(substituteRange);
1619 var hasPrefixInDictionary = dictionary.hasWord(substituteWord); 1667 var hasPrefixInDictionary = dictionary.hasWord(substituteWord);
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1724 * @return {?AnchorBox} 1772 * @return {?AnchorBox}
1725 */ 1773 */
1726 _anchorBoxForPosition: function(line, column) 1774 _anchorBoxForPosition: function(line, column)
1727 { 1775 {
1728 var metrics = this._textEditor.cursorPositionToCoordinates(line, column) ; 1776 var metrics = this._textEditor.cursorPositionToCoordinates(line, column) ;
1729 return metrics ? new AnchorBox(metrics.x, metrics.y, 0, metrics.height) : null; 1777 return metrics ? new AnchorBox(metrics.x, metrics.y, 0, metrics.height) : null;
1730 }, 1778 },
1731 } 1779 }
1732 1780
1733 /** 1781 /**
1782 * @constructor
1783 * @param {!WebInspector.CodeMirrorTextEditor} textEditor
1784 * @param {!CodeMirror} codeMirror
1785 */
1786 WebInspector.CodeMirrorTextEditor.SelectNextOccurrenceController = function(text Editor, codeMirror)
1787 {
1788 this._textEditor = textEditor;
1789 this._codeMirror = codeMirror;
1790 }
1791
1792 WebInspector.CodeMirrorTextEditor.SelectNextOccurrenceController.prototype = {
1793 selectionWillChange: function()
1794 {
1795 if (!this._muteSelectionListener)
1796 delete this._fullWordSelection;
1797 },
1798
1799 /**
1800 * @param {!Array.<!WebInspector.TextRange>} selections
1801 * @param {!WebInspector.TextRange} range
1802 * @return {boolean}
1803 */
1804 _findRange: function(selections, range)
1805 {
1806 for (var i = 0; i < selections.length; ++i) {
1807 if (range.equal(selections[i]))
1808 return true;
1809 }
1810 return false;
1811 },
1812
1813 selectNextOccurrence: function()
1814 {
1815 var selections = this._textEditor.selections();
1816 var anyEmptySelection = false;
1817 for (var i = 0; i < selections.length; ++i) {
1818 var selection = selections[i];
1819 anyEmptySelection = anyEmptySelection || selection.isEmpty();
1820 if (selection.startLine !== selection.endLine)
1821 return;
1822 }
1823 if (anyEmptySelection) {
1824 this._expandSelectionsToWords(selections);
1825 return;
1826 }
1827
1828 var last = selections[selections.length - 1];
1829 var next = last;
1830 do {
1831 next = this._findNextOccurrence(next, !!this._fullWordSelection);
1832 } while (next && this._findRange(selections, next) && !next.equal(last)) ;
1833
1834 if (!next)
1835 return;
1836 selections.push(next);
1837
1838 this._muteSelectionListener = true;
1839 this._textEditor.setSelections(selections);
1840 delete this._muteSelectionListener;
1841
1842 this._textEditor._revealLine(next.startLine);
1843 },
1844
1845 /**
1846 * @param {!Array.<!WebInspector.TextRange>} selections
1847 */
1848 _expandSelectionsToWords: function(selections)
1849 {
1850 var newSelections = [];
1851 for (var i = 0; i < selections.length; ++i) {
1852 var selection = selections[i];
1853 var startRangeWord = this._textEditor._wordRangeForCursorPosition(se lection.startLine, selection.startColumn)
1854 || WebInspector.TextRange.createFromLocation(selection.startLine , selection.startColumn);
1855 var endRangeWord = this._textEditor._wordRangeForCursorPosition(sele ction.endLine, selection.endColumn)
1856 || WebInspector.TextRange.createFromLocation(selection.endLine, selection.endColumn);
1857 var newSelection = new WebInspector.TextRange(startRangeWord.startLi ne, startRangeWord.startColumn, endRangeWord.endLine, endRangeWord.endColumn);
1858 newSelections.push(newSelection);
1859 }
1860 this._textEditor.setSelections(newSelections);
1861 this._fullWordSelection = true;
1862 },
1863
1864 /**
1865 * @param {!WebInspector.TextRange} range
1866 * @param {boolean} fullWord
1867 * @return {?WebInspector.TextRange}
1868 */
1869 _findNextOccurrence: function(range, fullWord)
1870 {
1871 range = range.normalize();
1872 var matchedLineNumber;
1873 var matchedColumnNumber;
1874 var textToFind = this._textEditor.copyRange(range);
1875 function findWordInLine(wordRegex, lineNumber, lineText, from, to)
1876 {
1877 if (typeof matchedLineNumber === "number")
1878 return true;
1879 wordRegex.lastIndex = from;
1880 var result = wordRegex.exec(lineText);
1881 if (!result || result.index + textToFind.length > to)
1882 return false;
1883 matchedLineNumber = lineNumber;
1884 matchedColumnNumber = result.index;
1885 return true;
1886 }
1887
1888 var iteratedLineNumber;
1889 function lineIterator(regex, lineHandle)
1890 {
1891 if (findWordInLine(regex, iteratedLineNumber++, lineHandle.text, 0, lineHandle.text.length))
1892 return true;
1893 }
1894
1895 var regexSource = textToFind.escapeForRegExp();
1896 if (fullWord)
1897 regexSource = "\\b" + regexSource + "\\b";
1898 var wordRegex = new RegExp(regexSource, "gi");
1899 var currentLineText = this._codeMirror.getLine(range.startLine);
1900
1901 findWordInLine(wordRegex, range.startLine, currentLineText, range.endCol umn, currentLineText.length);
1902 iteratedLineNumber = range.startLine + 1;
1903 this._codeMirror.eachLine(range.startLine + 1, this._codeMirror.lineCoun t(), lineIterator.bind(null, wordRegex));
1904 iteratedLineNumber = 0;
1905 this._codeMirror.eachLine(0, range.startLine, lineIterator.bind(null, wo rdRegex));
1906 findWordInLine(wordRegex, range.startLine, currentLineText, 0, range.sta rtColumn);
1907
1908 if (typeof matchedLineNumber !== "number")
1909 return null;
1910 return new WebInspector.TextRange(matchedLineNumber, matchedColumnNumber , matchedLineNumber, matchedColumnNumber + textToFind.length);
1911 }
1912 }
1913
1914 /**
1734 * @param {string} modeName 1915 * @param {string} modeName
1735 * @param {string} tokenPrefix 1916 * @param {string} tokenPrefix
1736 */ 1917 */
1737 WebInspector.CodeMirrorTextEditor._overrideModeWithPrefixedTokens = function(mod eName, tokenPrefix) 1918 WebInspector.CodeMirrorTextEditor._overrideModeWithPrefixedTokens = function(mod eName, tokenPrefix)
1738 { 1919 {
1739 var oldModeName = modeName + "-old"; 1920 var oldModeName = modeName + "-old";
1740 if (CodeMirror.modes[oldModeName]) 1921 if (CodeMirror.modes[oldModeName])
1741 return; 1922 return;
1742 1923
1743 CodeMirror.defineMode(oldModeName, CodeMirror.modes[modeName]); 1924 CodeMirror.defineMode(oldModeName, CodeMirror.modes[modeName]);
(...skipping 27 matching lines...) Expand all
1771 var backgroundColorRule = backgroundColor ? ".CodeMirror .CodeMirror-selecte d { background-color: " + backgroundColor + ";}" : ""; 1952 var backgroundColorRule = backgroundColor ? ".CodeMirror .CodeMirror-selecte d { background-color: " + backgroundColor + ";}" : "";
1772 var foregroundColor = InspectorFrontendHost.getSelectionForegroundColor(); 1953 var foregroundColor = InspectorFrontendHost.getSelectionForegroundColor();
1773 var foregroundColorRule = foregroundColor ? ".CodeMirror .CodeMirror-selecte dtext:not(.CodeMirror-persist-highlight) { color: " + foregroundColor + "!import ant;}" : ""; 1954 var foregroundColorRule = foregroundColor ? ".CodeMirror .CodeMirror-selecte dtext:not(.CodeMirror-persist-highlight) { color: " + foregroundColor + "!import ant;}" : "";
1774 if (!foregroundColorRule && !backgroundColorRule) 1955 if (!foregroundColorRule && !backgroundColorRule)
1775 return; 1956 return;
1776 1957
1777 var style = document.createElement("style"); 1958 var style = document.createElement("style");
1778 style.textContent = backgroundColorRule + foregroundColorRule; 1959 style.textContent = backgroundColorRule + foregroundColorRule;
1779 document.head.appendChild(style); 1960 document.head.appendChild(style);
1780 })(); 1961 })();
OLDNEW
« no previous file with comments | « LayoutTests/inspector/editor/text-editor-ctrl-d-expected.txt ('k') | Source/devtools/front_end/externs.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698